perl oop moose perl-mouse

¿Debo aprender Perl 5 OO o Moose primero?



oop perl-mouse (11)

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

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

Recientemente descubrí el bombo 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é está pasando detrás de las etapas), o crees que debería seguir adelante y comenzar a desarrollar aplicaciones directamente usando Moose? ¿O debería darle una oportunidad a Mouse?

Cualquier pensamiento y experiencia sobre eso es apreciado.

¡Gracias por adelantado!


Como todos han señalado, aprender los principios básicos de cómo OO en Perl está hecho 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 básicamente usa un diseño estándar de Perl OO. Básicamente, una vez que te sientes cómodo, entiendes lo que Moose::Manual::Unsweetend está mostrando y tienes 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.

Finalmente, 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.


Empecé 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 utilicé 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 los objetos de Perl 6 se parecerán mucho a los objetos de Moose ... así que aprender Moose te preparará para Perl 6.


En mi humilde opinión, primero aprendería Moose. ¿Por qué? Sí, la mayoría de Perl OO no termina de hacer Moose. Sí, Moose es lento (aunque intente con 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 acciones 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 proporciona 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 te brinda todo eso, listo para usar, para que puedas concentrarte en escribir objetos y no en escribir un sistema OO.

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


Este iba a ser un comentario en la publicación de Schwern, pero creció.

Diría que el alce es más lento que el 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 lo hace __PACKAGE__->make_immutable , una gran parte del tiempo de ejecución se elimina de todos modos.

Estoy con la pandilla "aprende Moose primero". 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 son mucho más fáciles


Honestamente, no estoy seguro de cuán valioso es el conocimiento de las primitivas OO sin procesar de Perl para escribir nuevos códigos. 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 uso $ meta-> rebless_instance en lugar de solo "bless". ¡Mucho más limpio!)

De todos modos, primero me enseñaría a ti mismo Moose. 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.

Como 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.'';

Observe cómo no hay más peleas 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, obtienes una instancia de ti mismo llamada $ self como primera arg. Si ofreces 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 yo pensar es bueno, nada mágico está sucediendo aquí.)

Finalmente, obtienes mucho aquí "gratis". Pruebe esto y tenga en cuenta los útiles mensajes de error:

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

Obtienes todo esto de forma gratuita y facilita la depuración de tu programa. No hay ninguna razón para evitarlo, realmente hace que la programación sea más agradable (y hace que tu 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. Abra Devel :: REPL, escriba ''do'' test.pl '''' para cargar la clase Point y luego diga 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 posible el rico espacio de nombres de MooseX ::. Puede que no necesites introspección, pero disfrutarás de la capacidad de usar módulos confiables de CPAN).


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


Moose es útil, pero es posible que desee aprender sobre el OI perl adecuado para protegerse del problema de la abstracción con fugas .

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


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

Si solo quiere escribir sus propios programas usando técnicas OO, entonces bien podría valer la pena sumergirse en Moose (y preocuparse por otras técnicas OO más adelante)

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


Muchas 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.

Divulgación: creamos el libro (Mr Monkey), aunque no lo escribimos (Dave Rolsky y Stevan Little).


Póngase 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.