Стиль програмування в Perl


9

Я працюю на Java, тому в основному я використовую парадигму OOP під час кодування. Я збираюся розпочати роботу в Perl, і мені було цікаво, що таке парадигма, якої слідкують розробники Perl. У Вікі згадується, що вона підтримує багато парадигм, але я не впевнений, що я це розумію, оскільки це мова сценаріїв.

Отже, моє запитання таке: чи знайомі об'єктно-орієнтовані візерунки, які я знайомий з Java idiomatic у Perl, чи мені знадобляться зміни в моєму стилі дизайну, щоб написати ефективний Perl?

Примітка: це питання не критикувати Perl. Мені справді доводиться працювати в Perl, і я хотів би зрозуміти, як зміниться поточний спосіб, який я програмую.


3
Що стосується більш серйозної уваги, зробіть пошук в Google за "філософією перла
Роберт Харві

Perl підтримує OOP. Ви можете створювати ієрархії класів, реалізовувати віртуальні функції тощо. Не найпоширеніше використання, але це можна зробити.
Мартін Йорк

"оскільки це мова сценаріїв" - її можна використовувати як таку, але пам’ятайте, що perl - це стільки ж VM, скільки Java - perl збирається (на льоту) в байт-код, який потім виконується. Немає JIT, окрім того, що це все-таки віртуальна машина, на якій працює ваш код.
Tanktalus

Відповіді:


15

Філософія Perl має тенденцію до того, щоб "робити те, що зараз практично". Якщо вам потрібно використовувати OOP, його є. Це не обов'язково у всіх рішеннях і змушувати людину писати код OOP, коли це просто "зробіть це, тоді це", тоді ця проблема типу часто зустрічається на користь продуктивних.

Багатопарадигмальний характер perl можна побачити в таких речах, як трансформація Шварца, яка має для нього дуже функціональні аспекти (в Ліспі вона відома як "прикрасити-сортувати-неприміряти"). OOP існує, як і процедурні (на зразок програмування на C) та імперативні (bash типу "зроби це тоді це").

Шаблони дизайну - це повторювані рішення загальних проблем. Вони існують у всіх мовах. Іноді ці візерунки називають ідіомами, хоча це також може стосуватися речей, які набагато простіші за візерунок.

За потреби багато класичних шаблонів дизайну GOF можуть бути реалізовані в перл. Шаблони дизайну Perl матимуть багато поширених імен, які знайомі з GOF. Не обов’язково випадок, що всі вони ідіоматичні.

Вивчаючи дизайнерські шаблони в perl, також врахуйте "Шаблони дизайну" не від Марка Домінуса .

Багато хто вважає, що шаблони дизайну є недоліками в мові . З цього погляду шаблони дизайну, такі як Ітератор, часто не потрібні. Не завжди - але часто.

Спочатку напишіть ідіоматичний perl. Не намагайтеся писати C в perl, або lisp в perl, або java в perl. Perl - перл. Якщо є проблема, яка стає більшою, ніж ідіоматичний perl, що вдається вирішити, і ви починаєте потребувати більш складних структур класу, тоді напишіть їх. Знайте шаблони дизайну, щоб можна було розпізнати "ця проблема тепер зросла до того, що потрібна абстрактна фабрика", - але не починайте намагатися зробити абстрактну фабрику в Perl, якщо вона вам не потрібна.

Деякі бібліотеки існують як в OOP, так і в більш традиційних формах. Див. Чи слід використовувати функціональні або об'єктно-орієнтовані інтерфейси CGI? для старого питання SO, де можна задати, яким способом користуватися бібліотекою.


4
+ 1.Інтересна інформація. Враховуючи все це з приводу того, як існує багато публікацій в ТА, які намагаються захистити / атакувати Perl як стару мову? Мені здається потужною та корисною.
користувач10326

2
У кожного своя улюблена мова. Багато хто вважає, що якщо мова цього тижня не зможе підтримувати Нову річ, мова є давньою та застарілою, і все слід перенести з неї. Інші значно вклали час у вивчення певної мови та знають, як змусити її працювати там, де вона є. Це легко змінюється на будь-яку мову, яка не рухається так швидко, як The Hot New Language. Perl страждає від певної недоліки, коли потрібен час, щоб отримати Perl 6 (будь-який день .. Помилка .. рік!). Це не повинно відштовхуватись від засвоєння перлов - воно використовується в багатьох місцях.

1
Ви, ймовірно, виявите, що perl - це лінгва-франка для сценаріїв Linux, яка займає велику роль сценаріїв оболонок із старих днів. Лише найстійкіші скриптові оболонки будуть скаржитися, якщо ви пишете сценарій perl, а не баш, коли робите сценарії в системі * nix. Однією з найважливіших речей для perl є CPAN - якщо хтось збирається записати якусь бібліотеку розумного розміру, просто перевірте, чи хтось ще її вже написав.

1
Все, що раніше було сценарієм оболонки певної складності чи більшої, зараз часто є перл-скриптом. Perl також часто працює як клей / клейка стрічка між системами або додатками. Її обробка рядків також зробила його в домашніх умовах у кількох інших галузях (зокрема, біоінформатика - просто подивіться, скільки питань на основі ДНК існує в тезі perl для SO).

4
Perl - надійна і повна мова програмування. Він може бути використаний для сценаріїв (автоматизація взаємодії з іншими програмами, включаючи оболонку), або для побудови утиліт або навіть для додатків більшого масштабу. Ненависть Perl, як правило, зосереджується на таких речах, як його щільний синтаксис, і певною мірою на нерозумінні того факту, що Perl не намагається примусити конкретних моделей дизайну до своїх користувачів. Я використовую Perl щодня. Я також часто використовую інші мови. Мені подобається виразність і сила Перла. Пройдіть невдалий етап навчання і, швидше за все, вам сподобається.
DavidO

7

Позиція Perl щодо парадигм - TMTOWTDI (існує декілька способів зробити це). Це одна з причин, що багато людей жартома називають Perl мовою лише для письма . Написати це може бути набагато простіше, ніж прочитати, адже стиль іншої людини може бути зовсім іншим з вашим.

Попри це, OOP, безумовно, підтримується в Perl. Якщо ви використовуєте безліч сторонніх кодів, це може бути, а може, і не бути OOP, але для власного коду ви можете зробити OOP відповідно до вмісту вашого серця. Я фактично вперше дізнався OOP в Perl. Спершу я спробував C ++, і він чомусь не "клацнув".


1
Чому багато людей вважають це поганим варіантом кар’єри? Здається, він є потужним і може доповнювати інші мови як частину набору інструментів.
користувач10326

3
Скажімо, інші мови майже настільки потужні і мають набагато більш притаманну структуру. Компанії люблять структуру.
Карл Білефельдт

На хороший підручник Perl OOP перевірити codeproject.com/Articles/3152/Perl-Object-Oriented-Programming
Pmarcoen

1
Це хороший підручник з ООП, що пояснює вбудований стиль Perl OO. Якщо ви знайдете цей код трохи дослідним, вас може зацікавити бібліотека Perl Moose, яка автоматизує багато повторюваного кодування у вбудованому ОО. Але найкраще починати (IMH0) із вбудованого стилю.
matt freake

1
Я ніколи не вважав Perl поганим варіантом кар’єри. Знайдіть місцеву групу Perl Mongers, і шанси полягають у тому, що майже на кожній зустрічі хтось згадає місця роботи Perl.
DavidO

3

Я в тій же ситуації, я вже довгий час використовую Java,

Переїзд до Perl був шоком і полегшенням, але я використав книгу під назвою "Найкращі практики Perl", яка допомагає дуже багато, і якщо ви розумієте основні поняття мов програмування, просто просто простувати з нею.

Просто пам’ятайте, що в perl існує більше ніж один спосіб зробити це, я витрачав незліченну кількість годин на перегляд певного коду та модифікацію його, але врешті-решт, це виконує завдання з простою синтаксичною помилкою.


0

Існує кілька способів обробки коду з повторним використанням коду в Perl. Дуже багато прикладів не чітко розрізняють підходи, і багато класів використовують як мінімум два.

Я раджу максимально використовувати стиль OO і використовувати EXPORTER лише тоді, коли у вас є принаймні три або більше класів, які потребують відносно невеликого кластера корисних функцій.

Тому:

package Foo; 
use Foo::Util qw(util) ;
use strict ; 

sub foo {
}

sub bar {
}

1; 

package Foo::Bar ;
use Foo ; 
use Foo::Util qw(util) ;
our @ISA = qw(Foo) ; 
use strict ; 

sub bar {
}

1; 

package Foo::Util ; 
use Exporter ; 
our @ISA = qw(Exporter) ; 
our @EXPORT = qw(util) ;
use strict ; 

sub util {
}

1;

Я вважаю за краще візуалізувати підхід OO і EXPORTERпідхід як два різних виміри доступності коду, як ніби функції надходять у поточний пакет з осі x або y.

У наведеному вище прикладі:

Foo::Barпоходить метод foo()з класуFoo

Foo::Barвизначає bar()метод, тому поліморфний метод bar()не виводиться з класуFoo

Обидва класи Fooі Foo::Barотримують EXPORTEDфункцію ( не метод ) util()з пакету ( не клас )Foo::Util

Дві системи здаються складними, але мають дуже практичну корисність. Відстеження багаторазового успадкування може отримати складність швидко. Отже, маючи другий вимір доступності коду, ви зможете зберегти своє спадкове дерево невеликим та керованим.

Як правило, якщо функція монолітна і відносно німа, використовуйте EXPORTER, інакше використовуйте успадкування. Але не турбуйтеся використовувати EXPORTERвзагалі, якщо для того, що ви збираєтеся, буде пов'язано більше ніж 3 або 4 пакети.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.