4

这不是 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方法。

4

3 回答 3

5

不,这不是糟糕的设计。

这是完全正常的——有些方法是类方法,有些是实例方法。我不确定感知到的问题甚至可能是什么。尽管在 Java 中您经常看到静态实用程序类,但即使找到只有一个或另一个的类也有些困难。

编辑IMO 这个问题具有误导性;您实际上是在问具有相同名称的静态和实例方法是否是糟糕的设计。

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

最终它取决于上下文和用法——没有单一的答案。

于 2012-08-17T23:19:13.527 回答
5

没关系,我想。以下是您将如何编写 Printer#print 方法的代码

class Printer
  def print
    self.class.fancy_print(@text)
  end
end
于 2012-08-17T23:24:26.227 回答
0

拥有特定类的类方法和实例方法没有任何问题,只要它们属于该类是有意义的。

即fancy_print 是做什么的?它是特定于打印机类的东西吗?如果是,那么您不必担心。

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

String.class_eval do 
  def fancy_print
    ## implementation
  end
end

现在你可以做"Hello".fancy_print

希望这个答案有任何用处。还要写测试用例!

于 2012-08-17T23:20:46.133 回答