使用Ruby方法名表达意图的最佳做法是什么?
例如,使用以下内容:
class Formula
attr_accessor :steps
def find_step(key)
@steps.find {|s| s.name == key }
end
end
和
class Step
attr_accessor :name
end
Formula#find_step
方法需要Symbol
,但它可以很容易地采用Step
类型并检查名称是否匹配。我可以重命名方法find_step_by_name
,但它仍然不清楚name
是什么。它是一个字符串还是一个符号?或者它与Step
对象上的名称匹配?
修改:标记为Does Ruby support type-hinting?的可能副本 我不是在询问是否可能,我在询问有关命名的问题。
答案 0 :(得分:1)
我认为find_step_by_name
明确表示期望name
而不是step
可能有一个名字。如果您不确定是否支持字符串或符号,请同时允许:
def find_step_by_name(name)
@steps.find { |s| s.name == name.to_s }
end
答案 1 :(得分:1)
在Ruby2.1之后我认为以下解决方案很好。
def find_by(name:)
# and you can check if type of name is what you expect as you need.
# But that is not duck-typingy.
end
答案 2 :(得分:1)
我认为这个问题的最佳答案是选择参数名称。如果您打算将符号传递给find_by方法,为什么不这样做:
def find_by(symbol)
@steps.find {|s| s.name == symbol }
end
但是,我认为这是最明确的选择:
def find_by_name(symbol)
@steps.find {|s| s.name == symbol }
end
我不同意使用关键字解决了这个问题。它所做的就是改变字符串或符号传递给方法的方式。
def find_by(name:)
puts name
end
find_by name: 'this' # name has to be passed in via hash
find_by name: :that
def find_by(name)
puts name
end
find_by 'this' # name is passed in directly
find_by :that
它没有解决'name'并不意味着传递了什么类型的对象的问题。
我认为如果你在方法中传递多个参数,关键字真的很有用,因为它们使得代码在使用时更具可读性。
def mass(width:, height:, density:)
width * height * density
end
mass width: 3, height: 11, density: 0.5
这意味着每次用于计算传入的内容时,您都不必转到质量方法定义。它还消除了使参数顺序正确的必要性。这也可行:
mass width: 3, density: 0.5, height: 11
但对于一个只有一个参数的方法,我认为你只是通过使用关键字来增加复杂性。