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

大丈夫だと思います。Printer#printメソッドをコーディングする方法は次のとおりです

class Printer
  def print
    self.class.fancy_print(@text)
  end
end
于 2012-08-17T23:24:26.227 に答える
5

いいえ、悪くないデザインです。

これは完全に正常です。一部のメソッドはクラス メソッドであり、一部はインスタンス メソッドです。認識されている問題が何であるかさえわかりません。Java では静的なユーティリティ クラスがよく見られますが、どちらか一方しかないクラスを見つけることさえ、やや困難です。

編集IMO 質問は誤解を招くものです。あなたは実際に、同じ名前の静的メソッドとインスタンス メソッドを持つのが悪い設計であるかどうかを尋ねています。

クラスの使用方法が必ずしも明白ではないため、両方がパブリックである場合は注意が必要です。つまり、静的メソッドまたはインスタンス メソッドを介して使用するように設計されていますか? 両方?それらの違いは何ですか?その違いは...名前で区別する必要がありますか?

最終的には、コンテキストと使用法に依存します。単一の答えはありません。

于 2012-08-17T23:19:13.527 に答える
0

特定のクラスのクラス メソッドとインスタンス メソッドを持つことは、それらがクラスに属していることが理にかなっていれば問題ありません。

つまり、fancy_print は何をするのでしょうか? それは Printer クラスに固有のものですか。もしそうなら、心配する必要はありません。

一方、任意の文字列値に使用する場合は、より生意気なことを行うことができます。つまり、このメソッドを文字列クラスに追加します。

String.class_eval do 
  def fancy_print
    ## implementation
  end
end

今、あなたはすることができます"Hello".fancy_print

この答えが役に立てば幸いです。テストケースも書きましょう!

于 2012-08-17T23:20:46.133 に答える