Estilo de programación en Perl

9

Trabajo en Java, así que básicamente uso el paradigma OOP durante la codificación. Estoy a punto de comenzar a trabajar en Perl y me preguntaba cuál es el paradigma que siguen los desarrolladores de Perl. En wiki menciona que es compatible con muchos paradigmas, pero no estoy seguro de entender esto, ya que es un lenguaje de script.

Entonces mi pregunta es: ¿los patrones orientados a objetos con los que estoy familiarizado en Java son idiomáticos en Perl, o necesitaré un cambio significativo en mi estilo de diseño para escribir un Perl efectivo?

Nota: Esta no es una pregunta para criticar a Perl. De hecho, tengo que trabajar en Perl y me gustaría entender cómo cambiará la forma actual en que programo.

usuario10326
fuente
3
En una nota más seria, haga una búsqueda en Google de "filosofía perl", y eche un vistazo aquí: perldesignpatterns.com
Robert Harvey
Perl es compatible con OOP. Puede construir jerarquías de clases, implementar funciones virtuales, etc. No es el uso más común, pero se puede hacer.
Martin York
"dado que es un lenguaje de secuencias de comandos", se puede usar como tal, pero recuerde que perl es tanto una máquina virtual como Java, perl se compila (sobre la marcha) en código de bytes que luego se ejecuta. No hay JIT, pero aparte de eso, sigue siendo una máquina virtual que ejecuta su código.
Tanktalus

Respuestas:

15

La filosofía de Perl tiende a ser la de "hacer lo que es práctico ahora". Si necesita usar OOP, está ahí. No es necesario en todas las soluciones y obligar a una persona a escribir código OOP cuando es un simple problema de tipo "haz esto y luego esto" a menudo es contraproducente.

La naturaleza multi-paradigmática de perl se puede ver en cosas como la transformación de Schwartz que tiene aspectos muy funcionales (en Lisp se le conoce como "decorar-ordenar-decorar"). OOP existe, al igual que el procedimiento (C como programación) y el imperativo (bash como "haz esto y luego esto").

Los patrones de diseño son soluciones recurrentes a problemas comunes. Existen en todos los idiomas. A veces, estos patrones se llaman modismos, aunque esto también puede referirse a cosas que son mucho más simples que un patrón.

Cuando sea necesario, muchos de los patrones de diseño clásicos de GOF se pueden implementar en perl. Los patrones de diseño de Perl tendrán muchos nombres comunes que las personas familiarizadas con el GOF. No es necesario el caso de que todos ellos sean perl idiomáticos.

Al explorar patrones de diseño en perl, tenga en cuenta también los "Patrones de diseño" que no son de Mark Dominus .

Muchos consideran que los patrones de diseño son deficiencias en el lenguaje . En esa perspectiva, los patrones de diseño como el iterador a menudo son innecesarios en perl. No siempre, pero a menudo.

Primero, escribe perl idiomático. No intentes escribir C en perl, o lisp en perl, o java en perl. Perl es perl. Si hay un problema que se hace más grande de lo que Perl puede manejar y comienza a necesitar estructuras de clase más complejas, escríbalas. Conozca los patrones de diseño para poder reconocer que "este problema ha crecido hasta el punto de necesitar una fábrica abstracta", pero no comience a tratar de hacer una fábrica abstracta en perl si no la necesita.

Algunas bibliotecas existen tanto en OOP como en formas más tradicionales. Consulte ¿Debo usar las interfaces CGI orientadas a funciones u objetos? para una vieja pregunta de SO donde se pregunta de qué manera usar la biblioteca.

Comunidad
fuente
44
+ 1.Información interesante. Teniendo en cuenta todo esto, ¿cómo es que hay muchas publicaciones en SO que intentan defender / atacar a Perl como un idioma antiguo? Me parece poderoso y útil.
user10326
2
Todos tienen su propio idioma favorito. Muchos piensan que a menos que un idioma sea capaz de soportar algo nuevo esta semana, el idioma es antiguo y está desactualizado y todo debería ser eliminado. Otros han invertido mucho tiempo en aprender un idioma en particular y saben cómo hacerlo funcionar en el lugar donde está. Esto se cambia fácilmente a cualquier idioma que no se mueva tan rápido como The Hot New Language. Perl sufre una privación particular del derecho de voto cuando se tarda en obtener Perl 6 (cualquier día ... ¡err ... año ahora!). Esto no debería disuadir a uno de aprender perl: se usa en muchos lugares.
1
Probablemente encontrará que Perl es una lengua franca para las secuencias de comandos de Linux que toman gran parte de la función de las secuencias de comandos de shell desde los días antiguos. Solo los scripters de shell más firmes se quejarán si escribe un script perl en lugar de bash al hacer scripts en un sistema * nix. Una de las cosas más importantes para Perl es CPAN : si uno está a punto de comenzar a escribir una biblioteca de tamaño razonable, simplemente verifique si alguien más ya la ha escrito.
1
Cualquier cosa que solía ser script de shell de cierta complejidad o mayor es a menudo un script perl ahora. Perl también suele funcionar como cinta adhesiva / adhesiva entre sistemas o aplicaciones. Su procesamiento de cadenas también lo ha hecho en casa en varias otras industrias (particularmente en bioinformática, solo mire cuántas preguntas basadas en ADN existen dentro de la etiqueta perl en SO).
44
Perl es un lenguaje de programación robusto y completo. Se puede usar para secuencias de comandos (automatización de la interacción con otras aplicaciones, incluido el shell), o para crear utilidades, o incluso para aplicaciones de mayor escala. El odio de Perl tiende a enfocarse en cosas como su sintaxis densa y, hasta cierto punto, en un malentendido del hecho de que Perl no intenta forzar patrones de diseño específicos en sus usuarios. Yo uso Perl todos los días. También uso otros idiomas con frecuencia. Disfruto de la expresividad y el poder de Perl. Supera la incómoda etapa de aprendizaje y es probable que también te encante.
DavidO
7

La postura de Perl sobre los paradigmas es TMTOWTDI (hay más de una forma de hacerlo). Esta es una de las razones por las que muchas personas en broma llaman a Perl un lenguaje de solo escritura . Puede ser mucho más fácil escribirlo que leerlo, porque el estilo de otra persona puede ser completamente diferente al suyo.

Dicho esto, OOP ciertamente es compatible con Perl. Si está utilizando una gran cantidad de código de terceros, puede o no ser POO, pero para su propio código puede hacer POO a su gusto. En realidad, primero aprendí OOP en Perl. Intenté C ++ primero y no hizo "clic" por alguna razón.

Karl Bielefeldt
fuente
1
¿Por qué muchas personas consideran que es una mala opción profesional? Parece que es potente y puede complementar otros idiomas como parte del conjunto de herramientas.
user10326
3
Digamos que otros idiomas son casi tan poderosos y tienen una estructura mucho más inherente. A las empresas les gusta la estructura.
Karl Bielefeldt
Para un buen tutorial de Perl OOP, consulte codeproject.com/Articles/3152/Perl-Object-Oriented-Programming
Pmarcoen
1
Ese es un buen tutorial de OOP, que explica el estilo OO incorporado de Perl. Si encuentra ese código un poco detallado, puede estar interesado en la biblioteca Perl Moose, que automatiza gran parte de la codificación repetitiva en el OO incorporado. Pero es mejor comenzar (IMH0) con el estilo incorporado.
Matt Freake
1
Nunca he encontrado que Perl sea una mala opción de carrera. Encuentre un grupo local de Perl Mongers, y lo más probable es que en casi todas las reuniones alguien mencione las ofertas de trabajo de Perl.
DavidO
3

Estoy en la misma situación, he estado usando Java durante mucho tiempo,

Me mudé a Perl fue un shock y un alivio, pero utilicé un libro llamado 'Perl Best Practices'. Ayuda mucho y si entiendes los conceptos básicos de los lenguajes de programación, todo es fácil de manejar.

Solo recuerde que con perl hay más de una forma de hacerlo, he pasado innumerables horas mirando cierto código y modificándolo, pero al final hace el trabajo con un simple error de sintaxis.

Sunny Patel
fuente
0

Hay varias formas de manejar la reutilización de código en Perl. Muchos ejemplos no aclaran la distinción entre los enfoques y muchas clases usan al menos dos.

Aconsejo usar el estilo OO tanto como sea posible y solo use el EXPORTADOR cuando tenga al menos tres o más clases que necesiten un grupo relativamente pequeño de funciones de utilidad.

Entonces:

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;

Prefiero visualizar el enfoque OO y el EXPORTERenfoque como dos dimensiones diferentes de disponibilidad de código, como si las funciones entraran en el paquete actual desde el eje xo y.

En el ejemplo anterior:

Foo::Barderiva el método foo()de la claseFoo

Foo::Bardefine un bar()método para que el método polimórfico bar()no se derive de la claseFoo

Ambas clases Fooy la función de Foo::Barrecepción EXPORTED( no método ) util()del paquete ( no clase )Foo::Util

Los dos sistemas parecen complicados pero tienen una utilidad muy práctica. El seguimiento de la herencia múltiple puede ser complicado rápidamente. Por lo tanto, tener la segunda dimensión de disponibilidad de código le permite mantener su árbol de herencia pequeño y manejable.

En general, si una función es monolítica y relativamente tonta, use EXPORTER, de lo contrario use herencia. Pero no se moleste en usarlo EXPORTERa menos que lo que vaya a hacer sea probable que implique más de 3 o 4 paquetes.

James Aanderson
fuente