2010-08-05 75 views
5

我不知道是否应该验证传递给方法的参数是否属于某个类。在Ruby中验证参数?

例如。

def type(hash = {}, array = []) 
    # validate before 
    raise "first argument needs to be a hash" unless hash.class == Hash 
    raise "second argument needs to be an array" unless array.class == Array 

    # actual code 
end 

这样做是否聪明,还是只是繁琐和浪费时间来验证所有传递参数?

有没有这种情况,当你不想打扰时有这种额外的安全和环境?

分享您的经验!

回答

9

我不会推荐这种特定的方法,因为您无法容纳提供散列或数组语义但不是该类的类。如果你需要这种验证,你最好用方法名称respond_to?。数组实现方法:[],它的价值。

OpenStruct具有散列语义和属性访问器方法语义,但在条件hash.class==Hash中不会返回true。尽管如此,它在工作中就像一个散列一样工作。即使在非动态语言中,你也不希望这样做;但是,即使在非动态语言中,你也不希望这样做。您希望验证一个对象是否实现了IDictionary<T>。 Ruby会习惯性地更喜欢在必要时验证该方法是否存在,因为如果存在,开发人员可能希望他们的对象行为相似。您可以通过围绕客户端代码进行单元测试来提供更多的理智,作为强制事物变为非动态的替代方案。

4

我认为这是没有必要的。我曾经在博客上看过类似“如果你需要保护你的代码免受愚蠢的人的伤害,ruby不是你的语言。”

+1

这是真的。为什么验证你的程序员=) – 2010-08-05 02:11:23

1

如果你想要编译器/运行时强制代码合同,那么Ruby不适合你。如果你想要一个可延展的语言和易测试性,那么Ruby就是。

5

通常不需要验证参数是否属于某个类。在Ruby中,鼓励您使用Duck Typing

1

我发现验证输入参数满足您的先决条件是非常有价值的做法。它拯救你的愚蠢的人就是你。对于Ruby来说尤其如此,因为它没有编译时间检查。如果你的方法的输入有一些特征,你知道它必须是真的,它使senes在运行时检查它们,并用有意义的错误信息引发错误。否则,代码只是开始为垃圾生成垃圾,并且你得到错误的答案或者排除异常。