我正在研究在我们的Perl项目中使用DbC,并且我正在尝试找到在源中验证合同的最佳方法(例如,检查前/后条件,不变量等)。
Class::Contract由Damian Conway编写,现在由C. Garret Goebel维护,但看起来它已经超过8年没有被触及。
看起来我想要使用的是Moose,因为好像它可能提供可用于DbC的功能,但我想知道是否有人有任何资源(文章等)如何解决这个问题,或者是否有任何有用的模块,我无法找到。
是否有人使用Perl进行DbC?我应该“跳进”Moose,看看我能为它做些什么吗?
答案 0 :(得分:10)
Moose为你提供了许多工具(如果不是全部糖)来做DbC。具体来说,您可以使用before,after和around方法挂钩(here's some examples)来执行您可能想要对参数和返回值进行的任何断言。
作为“滚动自己的DbC”的替代方法,您可以使用MooseX::Method::Signatures或MooseX::Method之类的模块来处理传递给子例程的验证参数。但是,这些模块不处理DbC通常提供的“post”或“invariant”验证。
编辑:在这个问题的推动下,我一起入侵了MooseX::Contract并将其上传到了CPAN。我很想获得有关API的反馈,因为我从未真正使用过DbC。
答案 1 :(得分:2)
至于做DbC,嗯,可能不是最适合perl5。用一种语言很难为你提供很少的保证。就个人而言,在很多动态语言中,尤其是perl,我倾向于使我的指导思想DRY,以及测试驱动的开发。
答案 2 :(得分:2)
我还建议使用Moose。
然而,作为“另类”,请查看Sub::Contract。
引用作者....
Sub :: Contract提供了一种实用的方法,通过Perl中的契约范式实现部分编程。
Sub :: Contract不是按合同设计的框架。
Sub :: Contract旨在使子例程输入参数和返回值变得非常容易,以便在运行时模拟强类型。
答案 3 :(得分:1)
如果您不需要类不变量,我发现以下Perl Hacks书籍建议对某些程序来说是一个很好的解决方案。请参阅Smart::Comments
。