使用哈希表作为函数输入

时间:2009-11-24 20:28:49

标签: ruby

我正在一个小组中工作,为我们在Ruby中使用的工具编写一些API。在编写API方法时,我的许多团队成员使用哈希表作为方法的唯一参数,而我使用指定的每个值编写方法。

例如,Apple定义为:

class Apple
  @commonName
  @volume
  @color
end

我将使用方法实例化该类:

Apple.new( commonName, volume, color )

我的队友会写它,所以方法看起来像:

Apple.new( {"commonName"=>commonName, "volume"=>volume, "color"=>color )

我不喜欢使用哈希表作为输入。对我来说似乎不必要地笨重,并且不会给代码添加任何清晰度。虽然在这个例子中它似乎没什么大不了的,但是我们的一些方法有超过10个参数,并且通常会有嵌套在其他哈希表中的哈希表。我还注意到以这种方式使用哈希表在公共API中非常罕见(net / telnet是我现在能想到的唯一例外)。

问题:我可以向团队成员提出哪些参数,不使用哈希表作为输入参数。代码的庞大性不足以证明它们(它们不怕编写200-400个字符行)并且过多的内存/处理开销将无法工作,因为它不会成为我们的工具使用方式的问题

3 个答案:

答案 0 :(得分:4)

实际上,如果你的方法需要超过10个参数,你应该重新设计你的课程或者吃脏东西并使用哈希值。对于任何需要超过4个参数的方法,在调用方法时使用典型参数可能会违反直觉,因为您必须正确记住顺序。

我认为最好的解决方案是简单地重新设计这样的方法并使用类似构建器或流畅模式的东西。

答案 1 :(得分:3)

首先,你应该责备他们使用字符串而不是哈希键的符号。

使用哈希的一个问题是,您必须检查所有适当的密钥都在其中。这使得它对可选参数很有用,但对于强制参数,为什么不使用该语言的内置功能呢?例如,使用他们的方法,如果我这样做会发生什么:

Apple.new( {"commonName"=>commonName, "volume"=>volume} )

然而,使用Apple.new(commonName, volume),你知道你会得到一个ArgumentError。

答案 2 :(得分:0)

命名参数可以提供更多自我记录的代码,这很好。但除此之外没有太大的区别。 Hash允许更大的灵活性,特别是如果您开始执行任何方法别名。此外,ActiveSupport中的各种Hash方法使设置默认值和验证输入非常轻松。我想这可能不是你想要的答案。