2009-01-13 11 views
12

Estoy investigando el uso de DbC en nuestros proyectos de Perl, y estoy tratando de encontrar la mejor manera de verificar los contratos en la fuente (por ejemplo, comprobación de las condiciones pre/post, invariantes, etc.)¿Cómo se hace el diseño por contrato en Perl?

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 ir sobre esto, 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í?

+0

@brian: Supongo que esa es la manera más directa de plantear la pregunta. Todavía no hay compradores, sin embargo. :) –

+1

@Adam - Edité mi respuesta para incluir un enlace a MooseX :: Contract. Echa un vistazo y cuéntame lo que piensas. –

+0

@Brian: ¡ojalá pudiera haberte vuelto a votar! Vea mi comentario sobre su respuesta a continuación. No estoy seguro de cuándo tendré tiempo de probarlo. –

Respuesta

10

Moose le ofrece muchas herramientas (si no todo el azúcar) para hacer DbC. Específicamente, puede utilizar los ganchos de método antes, después y alrededor (here'ssome examples) para realizar cualquier afirmación que desee realizar sobre argumentos y valores devueltos.

Como alternativa a "enrollar su propio DbC", puede 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.

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

+0

Eso es genial, parece que maneja los casos que estaba pidiendo. Desafortunadamente, yo también soy nuevo en el paradigma de DbC, así que no sé si sería la mejor persona para juzgar tu API. :) –

+1

Con la ventaja de la retrospectiva, ¿seguirías yendo con esto? ¿O recomendaría 'Function :: Parameters' y' Return :: Types' para al menos la parte de entradas y salidas? –

2

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

+0

Gracias, Todd. Tuve un presentimiento que podría ser el punto de vista prevaleciente, pero como Damian, en algún momento, decidió que valía la pena escribir un módulo, pensé que tal vez podría funcionar. Supongo que solo ellos saben si lo abandonaron porque no valió la pena. –

2

También recomendaría usar Moose.

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

Para citar el autor ....

Sub :: Contrato ofrece una manera pragmática para implementar partes de la programación por paradigma 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 el tipado fuerte en el tiempo de ejecución.

1

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

Cuestiones relacionadas