perl oop moose

perl - Moose vs MooseX:: Declare



oop (4)

POSTLUDE

MooseX :: Declare ya no sería recomendado por nadie, ya que se basa en Devel :: Declare, que cumplió su cometido pero que ya está obsoleto. En este punto, si alguien quiere MX :: D debería mirar Moops

ORIGINAL

Suponiendo que ya tengo un conocimiento decente de Perl OO al estilo antiguo, y suponiendo que voy a escribir algún código nuevo con un poco de sabor de Moose (sí, entiendo que hay un impacto en el rendimiento), me preguntaba si más profundo sería el agujero del conejo. , ¿desearé haber elegido el otro camino? ¿Podrían ustedes, monjes, iluminarme con los méritos relativos de Moose contra MooseX::Declare (o algún otro?). También lo intercambiables que son, una para una clase y la otra para otra, si elijo cambiar.

(ps, estaría bien con esta pregunta, sin embargo, creo que una respuesta bien formada podría evitar la subjetividad)


Como se mencionó anteriormente, otros problemas con MooseX :: Declare: - mensajes de error terribles (realmente, inútiles. A menos que use Method :: Signatures :: Modifiers) - impacto en el rendimiento (como ha notado), pero en mi opinión no es pequeño. (perfilamos algunas aplicaciones grandes de la vida real) - problema con TryCatch (si U usa eso, vea: https://rt.cpan.org/Public/Bug/Display.html?id=82618 ) - algunas incompatibilidades en mezcla ( MooseX - entorno que no es de Moose, por ejemplo, comprobación de $ VERSION fallida)

Si no necesita el ''azúcar sintáctica'' de MooseX, no lo use. Dependiendo de la tarea en la que se encuentre, lo usaría de "abajo a arriba", por ejemplo. 1. Mouse + Mehod :: Signatures 2. Moose 3. luego quizás MooseX

Dependiendo de lo que quieras.

La actualización no es demasiado complicada en este orden. Sin embargo, si llega al punto de que realmente necesita MooseX, prefiero sugerirle que busque algún otro lenguaje desarrollado por OO que ofrezca la mayoría de las funciones en el cuadro (por ejemplo, horribile dictu Ruby o Python), y Aquellos, que no se encuentran, Tú puedes vivir sin ellos.


MooseX :: Declare es básicamente una capa de azúcar de sintaxis sobre Moose. Son, para todo más allá del analizador, idénticas en lo que producen. MooseX :: Declare produce mucho más, con menos escritura.

Hablando como alguien que disfruta de la sintaxis de MooseX :: Declare pero aún prefiere escribir todo mi código en Moose, las ventajas y desventajas son principalmente en el lado del desarrollo y la capacidad de mantenimiento.

La lista básica de elementos a tener en cuenta al compararlos:

  • MooseX :: Declare tiene una sintaxis mucho más concisa. Las cosas que toman varios cientos de líneas en objetos perl antiguos (POPO?), Pueden tomar 50 líneas en Moose, pueden tomar 30 líneas en MooseX :: Declare. El código de MooseX :: Declare es para mí más legible y elegante también.

  • MooseX :: Declare significa que tienes MooseX :: Types y MooseX :: Method :: Signatures gratis. Esto lleva a la muy elegante sintaxis del method foo(Bar $bar, Baz $baz) { ... } que hizo que la gente volviera a Perl después de varios años en Ruby.

  • Una desventaja de MooseX :: Declare es que algunos de los mensajes de error son mucho más crípticos que Moose. El error en un error de validación de TypeConstraint puede ocurrir en varias capas en MooseX :: Types :: Structured y llegar desde allí a donde se rompió el código puede ser difícil para las personas nuevas en el sistema. Moose tiene este problema también, pero en menor grado.

  • Los lugares donde los dragones se esconden en MooseX :: Declare pueden ser sutilmente diferentes de donde se esconden en Moose. MooseX :: Declare se esfuerza por recorrer los problemas conocidos de Moose with() por ejemplo, la sincronización de with() ), pero presenta algunos lugares nuevos para tener en cuenta. MooseX :: Types, por ejemplo, tiene un conjunto de problemas totalmente diferente a los tipos Stringy nativos de Moose [^ 1].

  • MooseX :: Declare tiene otro éxito de rendimiento. Esto lo saben los desarrolladores de MooseX :: Declare y la gente está trabajando en ello (creo que para varios valores de trabajo).

  • MooseX :: Declare agrega más dependencias a Moose. Agrego este porque las personas ya se quejan de la lista de dependencias de Moose, que tiene alrededor de 20 módulos. MooseX :: Declare agrega alrededor de otras 5 dependencias directas además de eso. Sin embargo, la lista total de acuerdo con http://deps.cpantesters.org/ es Moose 27, MooseX :: Declare 91.

Si estás dispuesto a ir con MooseX :: Declare, la mejor parte es que puedes intercambiar entre ellos en el nivel por clase. No es necesario elegir uno encima del otro en un proyecto. Si esta clase es mejor en Moose debido a las necesidades de rendimiento, o si la mantienen los programadores Junior, o si se instala en un sistema con un control más estricto. Usted puede hacer eso. Si esa clase puede beneficiarse de la claridad adicional de la sintaxis de MooseX :: Declare, también puede hacerlo.

Espero que esto ayude a responder la pregunta.

[^ 1]: Algunos dicen menos, otros dicen más. Honestamente, los desarrolladores del núcleo de Moose todavía están discutiendo esto, y no hay una respuesta correcta.


Si realmente desea Moose, considere un enfoque de abajo hacia arriba comenzando con menos azúcar. Prefiero usar Mouse + Method :: Signatures primero. Mi situación es que estoy sentado en el back-end, donde necesitamos muy pocos objetos, una jerarquía superficial, pero a veces accesores rápidos, entonces aún podemos recurrir a XSAccessor. Método del ratón + Las firmas parecen ser un buen compromiso entre la ayuda sintáctica y la velocidad. Si mi diseño realmente necesita más, simplemente actualice a Moose. Puedo confirmar la penalización de velocidad con MooseX :: Declare no solo con puntos de referencia de accesores simples ( https://metacpan.org/pod/App::Benchmark::Accessors ), sino también en aplicaciones de la vida real. Esto combinado con los mensajes de error crípticos gobierna MooseX :: Declare out.


Un aspecto menor que puede interesarle, y me puede interesar también una respuesta a esto: el principal problema que tuve con MooseX :: Declare, que fue importante en mi caso específico, fue que no pude empaquetar mi solicitud como un ejecutable, ni con PAR :: Packer ni ActiveState PerlApp.

Luego utilicé https://github.com/komarov/undeclare/blob/master/undeclare.pl para volver al código de Moose.