什么时候可以在类中同时使用静态和实例方法

时间:2012-08-17 23:13:35

标签: ruby

这不是特定于Ruby的,但我现在碰巧使用Ruby 这是一个提供文本打印功能的类。

class Printer

  # some static methods

  def self.fancy_print(text)
     # do fancy formatting
  end

  def self.print(text)
     fancy_print(text)
  end

  # some instance methods

  def initialize(text)
    @text = text
  end

  def print
    #somehow call fancy_print(@text)
  end
end

在类中提供实例和静态方法是不好的设计?

有时候我想保留几个Printer的实例。其他时候,我只需要说Printer.print(text)并且只需抓取该文本而无需将其存储以供日后使用,从而导致静态print方法和实例print方法。

3 个答案:

答案 0 :(得分:4)

不,设计不错。

这是完全正常的 - 有些方法是类方法,有些是实例方法。我不确定这个问题甚至可能是什么。甚至在 中找到其中一个类有点困难,尽管在Java中你经常会看到静态实用程序类。

编辑 IMO这个问题具有误导性;你实际上是在询问使用同名的静态和实例方法是不好的设计

如果两者都是公开的,那就太棘手了,因为如何使用这个类并不一定是显而易见的。换句话说,它是否设计为通过静态或实例方法使用?都?他们有什么不同?这种差异应该......用名称区分吗?

最终取决于背景和用法 - 没有单一答案。

答案 1 :(得分:4)

我认为没关系。以下是编码Printer#print方法的方法

class Printer
  def print
    self.class.fancy_print(@text)
  end
end

答案 2 :(得分:0)

为特定类提供类方法和实例方法没有任何问题,只要它们有意义属于类。

即。 fancy_print做什么?它是Printer类特有的。如果是,那么你不必担心。

另一方面,如果它要用于任何字符串值,你可以做一些比较聪明的事情,即将这个方法添加到字符串类

String.class_eval do 
  def fancy_print
    ## implementation
  end
end

现在你可以"Hello".fancy_print

希望这个答案有用。也写测试用例!