programas herencia archivos perl moose design-by-contract

herencia - ¿Cómo se hace el diseño por contrato en Perl?



herencia en perl (4)

Estoy investigando el uso de DbC en nuestros proyectos Perl, y estoy tratando de encontrar la mejor manera de verificar los contratos en la fuente (por ejemplo, verificar las condiciones pre / post, invariantes, etc.)

Class :: Contract fue escrito por Damian Conway y ahora es mantenido por C. Garret Goebel, pero parece que no ha sido tocado en más de 8 años.

Parece que lo que quiero usar es Moose , ya que parece que podría ofrecer una funcionalidad que podría usarse para DbC, pero me preguntaba si alguien tenía recursos (artículos, etc.) sobre cómo hacerlo, o si hay algún módulo útil que no haya podido encontrar.

¿Alguien está haciendo DbC con Perl? ¿Debería simplemente "saltar" a Moose y ver qué puedo hacer para que lo haga por mí?


Moose es un excelente sistema OO para Perl, y lo recomiendo encarecidamente a cualquiera que codifique objetos en perl. Puede especificar "subtipos" para los miembros de su clase que se aplicarán cuando los accedores o constructores los configuren (el mismo sistema se puede usar con el paquete Moose :: Methods para las funciones). Si está codificando más de una línea, use Moose;

En cuanto a hacer DbC, bueno, podría no ser la mejor opción para Perl5. Va a ser difícil en un lenguaje que ofrece muy pocas garantías. Personalmente, en muchos lenguajes dinámicos, pero especialmente en perl, tiendo a hacer que mi filosofía guía sea DRY y el desarrollo impulsado por pruebas.


También recomendaría usar Moose.

Sin embargo, como una "alternativa" echa un vistazo a Sub :: Contract .

Para citar al autor ...

Sub :: Contract ofrece una forma pragmática de implementar partes de la programación por paradigma de contrato en Perl.

Sub :: Contract no es un marco de diseño por contrato.

Sub :: Contract tiene como objetivo hacer que sea muy fácil restringir los argumentos de entrada de las subrutinas y los valores de retorno para emular la escritura fuerte en el tiempo de ejecución.


Moose le da muchas herramientas (si no todo el azúcar) para hacer DbC. Específicamente, puede utilizar los enganches de método antes, después y alrededor ( aquí hay algunos ejemplos ) para realizar cualquier afirmación que desee sobre argumentos y valores devueltos.

Como alternativa a "rodar su propio DbC", podría usar un módulo como MooseX :: Method :: Signatures o MooseX :: Method para encargarse de validar los parámetros pasados ​​a una subrutina. Sin embargo, estos módulos no manejan las validaciones "post" o "invariantes" que DbC suele proporcionar.

EDITAR: Motivado por esta pregunta, he pirateado MooseX :: Contract y lo he subido al CPAN. Me gustaría recibir comentarios sobre la API, ya que nunca he usado DbC de primera mano.


Si no necesitas invariantes de clase, he encontrado la siguiente recomendación de libro de Perl Hacks como una buena solución para algunos programas. Ver Smart::Comments .