2009-06-11 13 views
39

Todavía soy relativamente nuevo en Perl Programming, pero sé cómo funciona Perl 5 OO básicamente. Sin embargo, nunca he creado ningún proyecto con Perl 5 OO, así que estoy bastante seguro de que me encontraré con muchas trampas.¿Debo aprender Perl 5 OO o Moose primero?

Recientemente descubrí la publicidad sobre el módulo Moose. Revisé un poco de documentación sobre CPAN y me pareció bastante interesante y me ayudó mucho como desarrollador. Además, parece ser muy estable y confiable.

¿Debería intensificarme trabajando con la sintaxis básica de Perl 5 OO hasta que me sienta muy familiarizado con ella (para saber qué ocurre detrás de las etapas), o cree que debería seguir adelante y comenzar a desarrollar aplicaciones usando Moose? ? ¿O debería darle una oportunidad a Mouse?

Se agradecen todos los pensamientos y experiencias sobre eso.

¡Gracias de antemano!

Respuesta

36

Como todos han señalado, aprender los principios básicos de cómo OO en Perl te ayudará, no solo con la mayoría de los paquetes que no son de alce sino también con Moose, ya que en el fondo Moose simplemente usa un Perl OO estándar diseño. Básicamente, una vez que te sientas cómodo, entiendes lo que Moose::Manual::Unsweetend está mostrando, tendrás una comprensión razonable de los principios de OO en Perl. El libro Perl Oriented Perl de Damian Conway es una excelente introducción al período de Orientación a objetos, no solo al sabor (es) de Perl. Sugeriría leerlo, o al menos la primera mitad.

Por último, no hay ninguna razón para usar Mouse (una alternativa a Moose) a menos que pertenezca a dos categorías muy específicas, tiene restricciones de tiempo de inicio difíciles o requisitos de dependencia difíciles. Si no caes en esos dos lugares, Moose casi siempre será una mejor respuesta.

Divulgación: soy un desarrollador central de Moose, y he trabajado en y con Mouse.

+0

El enlace de arriba para "Moose-Unsweetened" no funcionó para mí. Pero http://search.cpan.org/search?query=Moose%3A%3AUnsweetened&mode=all encontró que el Módulo – lexu

+0

arregló el enlace, gracias – perigrin

+0

Creo que quiere decir "no hay razón para NO usar Moose" basado en el siguiente oración en ese párrafo. – mmrobins

10

Ponte cómodo con lo básico primero. A menos que hayas hecho mucho OO JavaScript, OO Perl te parecerá un poco extraño, y algunas de las cosas que Moose o cualquier otra biblioteca hacen pueden parecer extrañas.

+1

No estoy de acuerdo con esto; Moose es muy parecido al OO basado en la clase de Smalltalk o CLOS. (O uno de esos otros lenguajes, como Java/C++/C#.) – jrockway

+4

Javascript OO es una comparación pobre. Es un lenguaje prototipo (es decir, sin clases) que utiliza la herencia de objetos que es muy diferente de cómo funcionan las implementaciones de OO más comunes (C#, C++, Java, Python, Perl y Ruby). La única comparación válida es que ambos no aportan mucho a la mesa. – Schwern

+0

El sistema de objetos Perl está basado en Python, por lo que debería ser similar a Python –

31

La mayor parte del mundo de Perl no es Moose, por lo que todavía necesitará los conceptos básicos para usar todos los otros módulos.

+8

La mayor parte de * su * mundo Perl no es Moose, tal vez;) – jrockway

+8

Vamos, Jon. Sabes tan bien como yo que la mayoría de los códigos de Perl no usan Moose. Si esas bases de código están utilizando cualquier OO, sabrá "antiguo Perl 5 OO". Dicho esto, si acaba de entrar en Perl, no se equivocará al comenzar con Moose para sus propias aplicaciones. Es altamente productivo, muy confiable y simplemente más divertido. –

+4

Hay una implicación en esta respuesta que es una pregunta de ambos. Que si aprendes Moose primero, de repente tu cerebro está lleno y no puedes aprender la manera de hacerlo de Perl. Quizás NO quieras, pero aún puedes. – Schwern

5

He comenzado a usar Moose y me gusta bastante. Estoy de acuerdo con las otras publicaciones que dicen que aún debes aprender cómo hacer OO perl sin Moose. Pero eso tiende a ser difícil y hay muchas maneras en que puede hacer eso. Creo que si estás comenzando un nuevo proyecto, Moose es el camino a seguir.

También he usado Object :: InsideOut, que se parece mucho a Moose y también ayuda a proteger las variables de objeto de ser manipulado.

Otra nota, entiendo que Perl 6 objetos serán mucho como objetos alces .. así que aprender Moose le preparar para Perl 6.

2

Moose es útil, pero puede todavía quiere aprender sobre OO Perl adecuado para protegerse del leaky abstraction problem.

Perl OO en sí es bastante peludo, pero este libro lo hace muy fácil de digerir: Intermediate Perl. Muy recomendable.

+3

Es cierto. Moose no podrá evitar que alguien corte su cable de red, por lo que debe leer el artículo de Joel para evitar ese problema. En general, Moose OO no es una abstracción con fugas; si necesita acceder a algo que no es abstraído por el MOP, lo está haciendo mal. – jrockway

+1

Un alce real podría evitar que alguien corte sus cables de red. Esos muchachos son enormes! –

+2

@brian - pero un alce real podría enganchar el cable de red en sus astas y romperlo en pedazos. Junto con la mitad del centro de datos. (oups ... lo siento ... el último fue sobre un técnico de Sun) – DVK

18

Moose es bueno, pero la decisión de aprenderlo depende de cuáles sean sus objetivos.

Si lo que desea es escribir sus propios programas utilizando técnicas OO, entonces podría muy bien ser la pena sumergirse en Moose (y preocuparse por otras técnicas OO tarde)

Si desea convertirse en "un programador de Perl" , entonces encontrará más código OO que no sea Moose y luego código Moose OO, por lo que primero deberá aprender a manejar la codificación sin Moose. Sugiero Object Oriented Perl por Damian Conway como un buen punto de partida.

21

Honestamente, no estoy seguro de cuán valioso es el conocimiento de las primitivas OO sin procesar de Perl para escribir código nuevo. No he usado @ISA o "use base" o "bless" en mi código durante mucho tiempo; cualquier OO que hago es a través de Moose MOP. (Yo hago instancias de uso compartido, por supuesto, pero utilizo $ meta-> rebless_instance en lugar de solo "bless". ¡Mucho más limpio!)

De todos modos, me gustaría enseñarte a Moose primero. Es fácil comenzar y ser productivo de inmediato, y puede retomar los detalles a medida que se vuelve más competente en Perl y en la programación en general.

A modo de ejemplo:

#!/usr/bin/env perl 

use strict; 
use warnings; 
use feature ':5.10'; # for 'say' 

use MooseX::Declare; 

class Point { 
    has [qw/x y/] => (is => 'ro', isa => 'Num', required => 1); 

    method new_from_ordered_pair(ClassName $class: Num $x, Num $y){ 
     return $class->new(x => $x, y => $y); 
    } 

    method distance(Point $a: Point $b){ 
     return sqrt(($a->x - $b->x)**2 + ($a->y - $b->y)**2); 
    } 

} 

my $origin = Point->new_from_ordered_pair(0,0); 
my $point = Point->new_from_ordered_pair(3,4); 

say '(3,4) is '. $point->distance($origin). ' units away from the origin.'; 

Aviso cómo no hay más lucha con los detalles de la implementación de Perl. Puede preocuparse fácilmente por los detalles de su programa en lugar de cómo hacer OO en Perl. Ni siquiera tiene que hacer un archivo "Point.pm", puede tener la definición de clase en línea.

También creo que este código sería inmediatamente comprensible para casi cualquier programador, incluso aquellos que no estén familiarizados con los detalles de Perl o Moose (o MooseX :: Declare).

(Por cierto, este ejemplo funcionó un poco raro con la sintaxis ":" en las firmas de métodos. Normalmente, obtiene una instancia de usted llamada $ self como primer arg. Si proporciona algo más antes de a: en la firma, puede cambiar el tipo y el nombre de la variable. También escribí "new_from_ordered_pair" para que no tuviera que escribir x => $x, y => $y como argumentos nuevos cada vez. Esto es solo azúcar que creo que es bueno; nada mágico está sucediendo aquí.)

Finalmente, obtienes mucho aquí "gratis". Pruebe estas opciones, y tomar nota de los mensajes de error votos:

Point->new; # x is required 
Point->new_from_ordered_pair('foo', 'bar'); # x needs to be a number 
$point->distance('some string'); # $b needs to be a Point 

Usted consigue todo esto de forma gratuita, y hace que la depuración del programa sea más fácil. No hay razón para evitarlo, realmente hace que la programación sea más agradable (y hace que su programa sea más confiable ... ¡gratis!)

Oh, una cosa más. Con Moose, puedes introspectar tus clases. Esto puede no ser importante de inmediato, pero puede ser bueno tenerlo. Abrir Devel :: REPL, tipo 'hacer "test.pl"' para cargar la clase Point, y luego decir algo como:

map { $_->name } Point->meta->get_all_attributes; 

El resultado es ['x', 'y']. Sin tener el código fuente, puede averiguar qué atributos tiene la clase. Intente hacer eso con Perl OO "simple". (Este tipo de cosas es lo que hace a los ricos MooseX :: espacio de nombres posible. Puede que no necesite la introspección, sino que se disfrutar de la capacidad de utilizar módulos fiables de CPAN.)

26

mi humilde opinión que iba a aprender Moose primero. ¿Por qué? Sí, la mayoría de Perl OO no termina de hacer Moose. Sí, Moose es lento (aunque intente Mouse). Sí, hay muchas razones prácticas por las que eventualmente tendrá que aprender a hacerlo de la manera difícil. Pero hay una razón primordial.

Porque la forma en que Perl hace OO deforma tu cerebro.

El punto es aprender bien OO, no Perl's OO. Una vez que comprenda la programación OO como un concepto, puede aplicar la técnica a cualquier idioma específico. Lo contrario no es tan cierto.

Las existencias de Perl OO no le dan mucho en absoluto. Tienes que construir todas tus piezas tú mismo. Tienes que aprender todos los pequeños detalles de cómo funciona todo. Te enseña conceptos rotos como "los objetos son solo referencias de hash mágico" y "los métodos son solo subrutinas con $ self como primer argumento" y "las clases son solo paquetes". En resumen, Perl OO te enseña a prestar atención a cómo funciona todo, lo cual es EXACTO DE CÓMO se supone que OO funciona.

OO se trata de NO preocuparse por los detalles de cómo funcionan las cosas. El objetivo de un objeto es que es UNA COSA QUE PEDES para hacer el trabajo y no te importa cómo lo hace. Un buen objeto es como un buen conserje. Usted le pide al conserje que limpie el piso, y luego se va. Cuando vuelves, el piso está limpio. No importa si el conserje usó una fregona, un cepillo de dientes, su lengua o rompió todo el piso e instaló uno nuevo. El piso está limpio y eso es todo lo que importa.

Además, la única forma de componer objetos que Perl te da de la caja es la herencia. La herencia es lo que todo el mundo aprende primero cuando aprende OO y su peligroso y desquiciante mente. OO está orientado a OBJETOS, no a la herencia. Lo importante es la encapsulación del objeto, no que se pueda compartir el código. Un programador novato con herencia es como darle un arma al bebé. La herencia múltiple es como darles un obús. Los principiantes saltan de inmediato a la herencia y crean grandes jerarquías enredadas. Nunca aprenden acerca de la delegación o composición o roles o mixins o cualquiera de la media docena de maneras mucho mejores de permitir que los objetos compartan y desarrollen comportamientos.

Moose le ofrece todo eso, listo para usar, para que pueda concentrarse en escribir objetos y no en escribir un sistema OO.

Una vez que haya aprendido cómo hacer OO en ese momento, puede aprender el OO de Perl y cómo hacerlo de otras 20 maneras, doce de ellas erróneas.

4

Esto iba a ser un comentario sobre la publicación de Schwern, pero creció.

Yo diría que alce es más lento que Perl OO "normal", pero en primer lugar esto no es terriblemente importante para la mayoría del código (optimización prematura) y en segundo lugar si se hace __PACKAGE__->make_immutable se elimina una gran parte del tiempo de ejecución.

Estoy con la pandilla "learn Moose first". Me gusta permanecer deliberadamente ignorante de los detalles de Perl OO para el tipo de código que escribo (administración de datos y aplicaciones simples), y por eso tiendo a usar Moose para todo, incluso cosas que hubiera hecho procesalmente en el pasado, porque hace que muchos de los mecanismos de la programación mucho más fácil

2

Muchas de las respuestas útiles arriba. Lo único que puedo agregar es que el manual de Moose ahora está disponible para comprar como libro o PDF. Si está aprendiendo o simplemente está usando Moose, es una guía de referencia útil y está impresa en una bonita tipografía.

Revelación: creamos el libro (Mr Monkey), a pesar de que no lo escribió (que era de Dave Rolsky y Stevan poco).

4

Aprende OOP que viene con Perl antes de Moose.Esto lo hará mucho más fácil para usted a largo plazo.

Cuestiones relacionadas