给定一个内部方法可以调用一个或多个可能未定义的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是否为未定义日期的有效状态?
答案 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,但这可能会掩盖其他问题。