0

我试图尽可能地封装我的类。有什么理由我不应该使用这样的发送方法?

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
4

3 回答 3

5

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

class MyClass
  def self.join_two_strings(first, second)
    first + second
  end
end
于 2013-04-30T05:56:04.920 回答
0

是的,有理由不这样做。这是因为它很冗长。要实现您想要的,您应该像 Chris Heald 的回答那样编写代码。(克里斯希尔德建议你应该做什么,但没有回答你的问题)。

于 2013-04-30T06:00:37.883 回答
0

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

于 2013-04-30T06:35:39.763 回答