我如何最好地防范未定义的属性?

时间:2015-09-16 20:59:51

标签: ruby ruby-on-rails-4

给定一个内部方法可以调用一个或多个可能未定义的nil属性,如何最好地防范这个?

例如,以下方法会进行多次内部调用。

def penalty
    penalty = ((self.rate.to_f - comparative_rate)/100 * self.payments[:balance] * (self.months_to_maturity / 12.0)).round(2)
end

此方法之一可能没有定义maturity_date,因为一旦没有提供。这可能是一个有效的状态

def months_to_maturity
    today = Date.today
    (self.maturity_date.year * 12 + self.maturity_date.month) - (today.year * 12 + today.month)
end

什么是最好的防守nil的方法? nil是否为未定义日期的有效状态?

2 个答案:

答案 0 :(得分:3)

nil对于未定义的数据(错过,未提供等)完全有效。但是,您的处理逻辑变得更加复杂,因为您需要在数据为零时定义行为。

我想到的是Null Object Pattern,它可以帮助您使用包含null的默认行为的对象替换空值。看一下这种模式的优秀ruby实现:naught

编辑:哦,我完全忘记了Sandi Metz Nothing is Something的精彩演讲。非常酷的东西。

答案 1 :(得分:1)

您需要检查每个方法中的这些条件,并确定什么是正确的响应(返回nil,引发错误等)。不知道您的应用程序months_to_maturity可能返回{{nil似乎是合理的。 1}}如果maturity_date也是零。假设您同意在这种情况下nil表示未知或不可计算。

然后在penalty中,如果nil返回months_to_maturity,您可以返回nil。对于可能为零或导致计算无效的任何其他值类似。

或者你可以将整个方法包装在开始/救援块中,检查ZeroDivisionError,但这可能会掩盖其他问题。