你如何在Perl中按合同设计?

时间:2009-01-13 14:11:15

标签: perl moose design-by-contract

我正在研究在我们的Perl项目中使用DbC,并且我正在尝试找到在源中验证合同的最佳方法(例如,检查前/后条件,不变量等)。

Class::Contract由Damian Conway编写,现在由C. Garret Goebel维护,但看起来它已经超过8年没有被触及。

看起来我想要使用的是Moose,因为好像它可能提供可用于DbC的功能,但我想知道是否有人有任何资源(文章等)如何解决这个问题,或者是否有任何有用的模块,我无法找到。

是否有人使用Perl进行DbC?我应该“跳进”Moose,看看我能为它做些什么吗?

4 个答案:

答案 0 :(得分:10)

Moose为你提供了许多工具(如果不是全部糖)来做DbC。具体来说,您可以使用before,after和around方法挂钩(here's some examples)来执行您可能想要对参数和返回值进行的任何断言。

作为“滚动自己的DbC”的替代方法,您可以使用MooseX::Method::SignaturesMooseX::Method之类的模块来处理传递给子例程的验证参数。但是,这些模块不处理DbC通常提供的“post”或“invariant”验证。

编辑:在这个问题的推动下,我一起入侵了MooseX::Contract并将其上传到了CPAN。我很想获得有关API的反馈,因为我从未真正使用过DbC。

答案 1 :(得分:2)

对于perl来说,Moose是一个优秀的oo系统,我衷心推荐给perl编码对象的人。您可以为由类访问者或构造函数设置时强制执行的类成员指定“子类型”(同一系统可以与函数的Moose :: Methods包一起使用)。如果您要编码多个衬垫,请使用Moose;

至于做DbC,嗯,可能不是最适合perl5。用一种语言很难为你提供很少的保证。就个人而言,在很多动态语言中,尤其是perl,我倾向于使我的指导思想DRY,以及测试驱动的开发。

答案 2 :(得分:2)

我还建议使用Moose。

然而,作为“另类”,请查看Sub::Contract

引用作者....

  

Sub :: Contract提供了一种实用的方法,通过Perl中的契约范式实现部分编程。

     

Sub :: Contract不是按合同设计的框架。

     

Sub :: Contract旨在使子例程输入参数和返回值变得非常容易,以便在运行时模拟强类型。

答案 3 :(得分:1)

如果您不需要类不变量,我发现以下Perl Hacks书籍建议对某些程序来说是一个很好的解决方案。请参阅Smart::Comments