Stile di programmazione in Perl


9

Lavoro in Java, quindi sostanzialmente uso il paradigma OOP durante la programmazione. Sto per iniziare a lavorare in Perl e mi chiedevo quale fosse il paradigma seguito dagli sviluppatori di Perl. Nel wiki menziona il fatto che supporta molti paradigmi, ma non sono sicuro di capirlo poiché è un linguaggio di scripting.

Quindi la mia domanda è: i modelli orientati agli oggetti con cui ho familiarità in Java sono idiomatici in Perl o avrò bisogno di cambiamenti significativi nel mio stile di progettazione per scrivere un Perl efficace?

Nota: questa non è una domanda per criticare Perl. In realtà devo lavorare in Perl e vorrei capire come cambierà l'attuale modo di programmare.


3
Per una nota più seria, fai una ricerca su Google per "filosofia perl" e dai un'occhiata qui: perldesignpatterns.com
Robert Harvey

Perl supporta OOP. È possibile creare gerarchie di classi implementare funzioni virtuali ecc. Non è l'uso più comune ma può essere fatto.
Martin York,

"poiché è un linguaggio di scripting" - può essere usato come tale, ma ricorda che perl è tanto una VM quanto Java - perl viene compilato (al volo) in bytecode che viene quindi eseguito. Non c'è JIT, ma a parte questo è ancora una macchina virtuale che esegue il tuo codice.
Tanktalus,

Risposte:


15

La filosofia di Perl tende ad essere quella di "fare ciò che è pratico ora". Se devi usare OOP, è lì. Non è necessario in tutte le soluzioni e costringere una persona a scrivere codice OOP quando si tratta di un semplice problema "fai questo quindi questo" questo tipo di problema è spesso controproducente.

La natura multi-paradigma del perl può essere vista in cose come la trasformazione di Schwartz che ha aspetti molto funzionali ad esso (in Lisp è noto come "decora-decora-decora"). OOP esiste, così come procedurale (C come la programmazione) e imperativo (bash come "fai questo allora").

I design pattern sono soluzioni ricorrenti a problemi comuni. Esistono in ogni lingua. A volte questi schemi sono chiamati idiomi, sebbene ciò possa riferirsi anche a cose che sono molto più semplici di uno schema.

Se necessario, molti dei classici motivi di progettazione GOF possono essere implementati in perl. Perl Design Patterns avrà molti nomi comuni che le persone hanno familiarità con il GOF. Non è necessario che tutti siano perl idiomatici.

Quando esplori modelli di design in perl, prendi nota anche di "Pattern di design" di Mark Dominus .

Molti ritengono che i modelli di progettazione siano carenze nella lingua . In quella prospettiva, i modelli di design come Iterator sono spesso inutili in perl. Non sempre - ma spesso.

Per prima cosa, scrivi perl idiomatico. Non provare a scrivere C in perl, o lisp in perl o java in perl. Perl è perl. Se c'è un problema che diventa più grande di quello che il peri idiomatico può gestire e inizi a aver bisogno di strutture di classe più complesse, allora scrivile. Conoscere i modelli di progettazione per essere in grado di riconoscere "questo problema è cresciuto al punto di aver bisogno di una fabbrica astratta" - ma non iniziare a provare a creare una fabbrica astratta in Perl se non ne hai bisogno.

Alcune librerie esistono sia in OOP che in forme più tradizionali. Vedi Devo usare le interfacce CGI orientate alle funzioni o agli oggetti? per una vecchia domanda SO in cui si chiede in che modo utilizzare la libreria.


4
+ 1. Informazioni interessanti. Tenendo conto di tutti questi aspetti, come mai ci sono molti post in SO che cercano di difendere / attaccare il Perl come una vecchia lingua? Mi sembra potente e utile.
user10326

2
Ognuno ha la propria lingua preferita. Molti ritengono che, a meno che una lingua non sia in grado di supportare New Thing This Week, la lingua è vecchia e obsoleta e tutto dovrebbe essere spostato da essa. Altri hanno investito molto tempo nell'apprendimento di una lingua particolare e sanno come farlo funzionare nel luogo in cui si trova. Questo può essere facilmente modificato in qualsiasi lingua che non si muova velocemente come The Hot New Language. Perl subisce una particolare privazione del diritto quando il tempo necessario per ottenere Perl 6 (ogni giorno .. err .. anno adesso!). Questo non dovrebbe dissuadere dall'apprendimento del perl - è usato in molti luoghi.

1
Probabilmente scoprirai che perl è una lingua franca per gli script di Linux che assume gran parte del ruolo di shell scripting dai giorni precedenti. Solo gli script shell più convinti si lamenteranno se scrivi uno script perl anziché bash quando esegui script su un sistema * nix. Una delle cose più importanti per il perl è CPAN - se uno sta per intraprendere la scrittura di una libreria di dimensioni ragionevoli, basta controllare per vedere se qualcun altro l'ha già scritto.

1
Tutto ciò che era uno script shell di una certa complessità o maggiore è spesso uno script perl ora. Perl spesso funziona anche come nastro per colla / condotto tra sistemi o applicazioni. La sua elaborazione delle stringhe lo ha anche reso familiare in molti altri settori (in particolare la bioinformatica - basta dare un'occhiata a quante domande basate sul DNA esistono all'interno del tag perl su SO).

4
Perl è un linguaggio di programmazione solido e completo. Può essere utilizzato per lo scripting (automatizzando l'interazione con altre applicazioni, inclusa la shell), o per la creazione di utility, o anche per applicazioni su larga scala. L'odio di Perl tende a concentrarsi su cose come la sua sintassi densa e, in una certa misura, su un fraintendimento del fatto che Perl non tenta di forzare specifici modelli di progettazione sui suoi utenti. Uso Perl ogni giorno. Uso anche altre lingue frequentemente. Mi piace l'espressività e il potere di Perl. Supera la fase di apprendimento imbarazzante e probabilmente anche tu lo amerai.
DavidO

7

La posizione di Perl sui paradigmi è TMTOWTDI (c'è più di un modo per farlo). Questo è uno dei motivi per cui molte persone chiamano scherzosamente Perl una lingua di sola scrittura . Può essere molto più semplice scriverlo che leggerlo, perché lo stile di un'altra persona potrebbe essere completamente diverso dal tuo.

Detto questo, OOP è certamente supportato in Perl. Se stai usando un sacco di codice di terze parti, potrebbe essere o meno OOP, ma per il tuo codice puoi fare OOP a tuo piacimento. In realtà ho imparato per la prima volta OOP in Perl. Ho provato prima C ++ e non ha "cliccato" per qualche motivo.


1
Perché molte persone lo considerano come una cattiva opzione di carriera? Sembra che sia potente e possa integrare altre lingue come parte del set di strumenti.
user10326

3
Diciamo solo che altre lingue sono quasi altrettanto potenti e hanno una struttura molto più intrinseca. Alle aziende piace la struttura.
Karl Bielefeldt,


1
Questo è un buon tutorial OOP, che spiega lo stile OO integrato di Perl. Se trovi quel codice un po 'prolisso, potresti essere interessato alla libreria Perl Moose, che automatizza gran parte della codifica ripetitiva nell'OO integrato. Ma è meglio iniziare (IMH0) con lo stile integrato.
matt freake

1
Non ho mai trovato Perl una cattiva opzione di carriera. Trova un gruppo Perl Mongers locale e le probabilità sono che in quasi ogni incontro qualcuno menzionerà le opportunità di lavoro del Perl.
DavidO

3

Sono nella stessa situazione, uso Java da molto tempo,

Dopo essermi trasferito in Perl è stato uno shock e un sollievo, ma ho usato un libro intitolato "Best Practices Perl". È di grande aiuto e se capisci i concetti di base dei linguaggi di programmazione è tutto molto semplice.

Ricorda solo che con perl c'è più di un modo per farlo, ho passato innumerevoli ore a guardare un certo codice e modificarlo, ma alla fine fa il lavoro con un semplice errore di sintassi.


0

Esistono diversi modi per gestire il riutilizzo del codice in Perl. Molti esempi non chiariscono la distinzione tra gli approcci e molte classi ne usano almeno due.

Vi consiglio di usare il più possibile lo stile OO e di usare EXPORTER solo quando avete almeno tre o più classi che richiedono un cluster relativamente piccolo di funzioni di utilità.

Così:

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;

Preferisco visualizzare l'approccio OO e l' EXPORTERapproccio come due diverse dimensioni della disponibilità del codice, come se le funzioni arrivassero nel pacchetto corrente dall'asse xo y.

Nell'esempio sopra:

Foo::Barderiva il metodo foo()dalla classeFoo

Foo::Bardefinisce un bar()metodo in modo che il metodo polimorfico bar()non derivi dalla classeFoo

Entrambe le classi Fooe Foo::Barricevono la EXPORTEDfunzione ( non il metodo ) util()dal pacchetto ( non la classe )Foo::Util

I due sistemi sembrano complicati ma hanno un'utilità molto pratica. Tracciare l'ereditarietà multipla può diventare rapidamente complicato. Pertanto, la seconda dimensione della disponibilità del codice consente di mantenere l'albero delle eredità piccolo e gestibile.

Generalmente se una funzione è monolitica e relativamente stupida, usa EXPORTER, altrimenti usa l'ereditarietà. Ma non preoccuparti di usare EXPORTERa meno che ciò che stai per fare non coinvolga probabilmente più di 3 o 4 pacchetti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.