在我目前的工作中,我正在构建一套严重依赖于对象的 Perl 脚本。 (使用 Perl 的bless()
在哈希上尽可能接近 OO)
现在,由于缺乏更好的表达方式,我公司的大多数程序员都不是很聪明。更糟糕的是,他们不喜欢阅读文档,并且似乎在理解其他人的代码时遇到问题。牛仔编码就是这里的游戏。每当他们遇到问题并试图解决它时,他们都会想出一个可怕的解决方案,但实际上解决不了任何问题,而且通常会使情况变得更糟。
坦率地说,这导致我不信任他们用鸭子类型语言编写的代码。举个例子,我看到太多问题,他们没有因滥用对象而得到明确的错误。例如,如果输入A
有会员foo
,他们做了类似的事情,instance->goo
,他们不会立即发现问题。它将返回一个空/未定义的值,他们可能会浪费一个小时来查找原因。然后最终改变了其他东西,因为他们没有正确识别原始问题。
因此,我正在集思广益,寻找一种方法来保留我的脚本语言(其快速发展是一个优势),但在未正确使用对象时给出明确的错误消息。我意识到,由于没有编译阶段或静态类型,因此错误必须在运行时出现。我对此很满意,只要用户得到一个非常明确的通知,说“这个对象没有 X”
作为我的解决方案的一部分,我不希望他们在尝试使用方法/变量之前检查它是否存在。
尽管我的工作是用 Perl 进行的,但我认为这可能与语言无关。
如果您有任何添加要使用的模块的想法,请尝试Moose http://www.iinteractive.com/moose/。它提供了现代编程环境中所需的几乎所有功能,甚至更多。它进行类型检查、优秀的继承、具有自省功能,并且具有MooseX::声明 http://search.cpan.org/perldoc?MooseX::Declare,Perl 类最好的接口之一。看一看:
use MooseX::Declare;
class BankAccount {
has 'balance' => ( isa => 'Num', is => 'rw', default => 0 );
method deposit (Num $amount) {
$self->balance( $self->balance + $amount );
}
method withdraw (Num $amount) {
my $current_balance = $self->balance();
( $current_balance >= $amount )
|| confess "Account overdrawn";
$self->balance( $current_balance - $amount );
}
}
class CheckingAccount extends BankAccount {
has 'overdraft_account' => ( isa => 'BankAccount', is => 'rw' );
before withdraw (Num $amount) {
my $overdraft_amount = $amount - $self->balance();
if ( $self->overdraft_account && $overdraft_amount > 0 ) {
$self->overdraft_account->withdraw($overdraft_amount);
$self->deposit($overdraft_amount);
}
}
}
我自己觉得这很酷。 :) 它是 Perl 对象系统之上的一层,所以它可以与你已经拥有的东西一起工作(基本上)。
使用 Moose,您可以非常轻松地创建子类型,这样您就可以确保您的输入有效。懒惰的程序员同意:让子类型在 Moose 中工作只需要做很少的事情,所以做起来比不做更容易! (从食谱4 http://search.cpan.org/~flora/Moose/lib/Moose/Cookbook/Basics/Recipe4.pod)
subtype 'USState'
=> as Str
=> where {
( exists $STATES->{code2state}{ uc($_) }
|| exists $STATES->{state2code}{ uc($_) } );
};
还有 Tada,USState 现在是您可以使用的类型!没有大惊小怪,没有混乱,只有少量的代码。如果不正确,它会抛出一个错误,并且类的所有使用者所要做的就是传递一个包含该字符串的标量。如果没问题(应该是......对吗?:))他们像平常一样使用它,并且你的类受到保护免受垃圾影响。那多好啊!
Moose 有很多像这样很棒的东西。
相信我。一探究竟。 :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)