我不应该使用这样的发送的任何理由?

时间:2013-04-30 05:47:37

标签: ruby

我试图尽可能地封装我的类。我不应该像这样使用send方法吗?

class MyClass

  def self.join_two_strings(first, second)
    new.send(:join_two_strings, first, second)
  end

  def join_two_strings(first, second)
    first + second
  end

  private :join_two_strings
end

3 个答案:

答案 0 :(得分:5)

由于#join_two_strings实际上不需要任何实例状态,因此它应该只是一个类方法。

class MyClass
  def self.join_two_strings(first, second)
    first + second
  end
end

答案 1 :(得分:0)

是的,有理由不这样做。这是因为它很冗长。为了实现你想要的,你应该像Chris Heald的答案一样编码。 (Chris Heald建议你应该做什么,但不回答你的问题。)

答案 2 :(得分:0)

更准确地说,使用#send来解决问题,这不是冗长,而是模糊了设计意图。有时冗长(例如使用完整的单词而不是缩写)可以揭示设计意图并缩短读者理解代码所需的时间。使用您的代码示例,读者不相信您想要实现的只是加入2个字符串,他们一直在寻找更深层的含义,然后再承认这只是一个复杂的方法来做一个简单的事情(并且可能重构您的代码正如克里斯那样)。至于#send本身,不要害怕它,不要害怕使用它。虽然#send不应该被用作任意地不尊重方法隐私的工具,但另一方面,Ruby方法是消息,你不必担心它是明确的,有理由的话。