Ruby on rails Ruby方法和参数验证

Ruby on rails Ruby方法和参数验证,ruby-on-rails,oop,Ruby On Rails,Oop,我有一个关于如何处理方法上的参数的一般性问题。比方说,我们有一个方法,它接收一个数字并将其乘以2 def multiplier(num) num*2 end 当num为nil时会发生什么?谁负责处理错误?方法本身还是调用该方法的人?什么是最佳oop实践 这与OOP没有任何关系,因为它也适用于其他范例。也就是说,关于这个问题有不同的学派。哪一个是最好的取决于你在和谁说话 一是防御性编程无处不在。这意味着每个方法都有责任严格检查其输入 另一个是调用方负责提供正确的数据 另一个是我所说的安全周界

我有一个关于如何处理方法上的参数的一般性问题。比方说,我们有一个方法,它接收一个数字并将其乘以2

def multiplier(num)
  num*2
end

当num为nil时会发生什么?谁负责处理错误?方法本身还是调用该方法的人?什么是最佳oop实践

这与OOP没有任何关系,因为它也适用于其他范例。也就是说,关于这个问题有不同的学派。哪一个是最好的取决于你在和谁说话

一是防御性编程无处不在。这意味着每个方法都有责任严格检查其输入

另一个是调用方负责提供正确的数据

另一个是我所说的安全周界:只有当我们处理外部输入时才进行严格的检查,但一旦数据进入系统,它就可以被信任


以及介于两者之间的任何问题。

我同意sergio tulentsev的其他回答。还有另外一件事要考虑。

在很多情况下,最好不要期望对象是特定类型的对象,而是期望对象的行为类似于特定类型。我的意思是,在您的例子中,该方法不仅可以期望一个数字作为参数传递,还可以期望任何可以被视为数字的对象。这不仅会使您的方法更强大,而且会解决零问题。当然,这取决于你的需要

我所说的方法版本可能如下所示:

def multiplier(num)
  # trying to convert whatever is passed to a number
  num.to_f * 2
end

如果为零,则返回0.0

谢谢您的回答!我很想知道其他人对这件事的看法,因为我经常遇到不同的方法来处理我审查的代码。另外,你说得对。这既不是ruby问题,也不是oop问题。谢谢您的反馈!我认为这取决于应用程序的业务逻辑。尝试将一个对象转换为您认为有效的对象,即num.to\u f可能会隐藏您未预测到的问题。