12

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

Class::Contract由 Damian Conway 编写,现在由 C. Garret Goebel 维护,但看起来已经有 8 年多没有人碰过它了。

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

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

4

4 回答 4

10

Moose 为您提供了很多工具(如果不是所有的糖)来进行 DbC。具体来说,您可以使用 before、after 和 around 方法挂钩(这里 有一些示例)来执行您可能想要对参数和返回值进行的任何断言。

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

编辑:受这个问题的启发,我一起破解了MooseX::Contract并将其上传到 CPAN。我很想获得有关 API 的反馈,因为我从未真正亲身使用过 DbC。

于 2009-01-14T16:27:49.157 回答
2

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

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

于 2009-01-14T04:28:32.507 回答
2

我还建议使用 Moose。

但是,作为“替代方案”,请查看Sub::Contract

引用作者的话......

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

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

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

于 2009-01-14T20:16:46.243 回答
1

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

于 2010-06-25T19:14:00.420 回答