4

ルビ文字列を使っていくつかの操作を行う予定のルビ プロジェクトに取り組んでいます。単純な操作 (単語数のカウントなど) もあれば、より複雑な操作 (特定の文字列が正しい言語であるかどうかのチェックなど) もあります。

これを実装する方法として考えられるのは、既存のメソッドを変更せずStringに追加のメソッドでクラスにパッチを適用し、やなどの動作を追加することです。"some string".word_count"some string".cjk?

に基づく別のアプローチは、FileUtilsメソッドでいっぱいのクラスまたはモジュールを作成し、常に文字列をパラメーターとして使用することOddClassName.word_count("some string")ですOddClassName.cjk?("some string")。読みやすさのために、最初のほうが好きです。

最初の選択肢で説明されているように、基本クラスにモンキー パッチを適用すると、名前が競合する可能性があることを理解しています。ただし、これがライブラリではなくメイン アプリケーションである場合、まったく気にする必要はありませんか?

したがって、質問は次のとおりです。

  • Ruby基本クラスにメソッドを追加するのは悪い習慣ですか? はいの場合、それはすべての場合ですか、それとも一部の場合のみですか?
  • これを達成するための最良のアプローチは何ですか?
  • 「OddClassName」の名前は何ですか?

代替案を提案してください。

4

2 に答える 2

4

モンキーのパッチ適用は、PatchedClass 関連の動作を持たない奇妙なメソッドを作成している場合を除き、悪い習慣とは見なされません (たとえば、String.monkeyPatchForMakingJpegFromStringかなり悪いですが、Jpeg.fromString十分に優れています)。

しかし、プロジェクトがかなり大きい場合、プロジェクトで使用するライブラリに衝突するパッチが含まれている可能性があるため、これらすべてのパッチ適用で別の問題が発生する可能性があります。Ruby 2.0 では、改良が役に立ちます。それらは次のように機能します: その中に (コアであっても) クラスを定義しmodulerefine必要な場所でそのモジュールを使用します。したがって、コードでは次のように機能します。

YourClass.new.refinedMethodFromCoreClass #=> some result

しかし

CoreClass.refinedMethodFromCoreClass

例外を生成しundefined methodます。

以上がモンキー パッチの説明です。モンキー パッチは便利で便利ですが、改良によっていくつかの機能が追加され、コードがより安全で、保守しやすく、すっきりしたものになります。

于 2013-04-30T19:06:44.890 に答える
1

Doc単語数を取得して言語をチェックすることは、ドキュメントの操作のように聞こえるため、新しいクラスを使用するか、それを呼び出すか、何かを呼び出します。

コンストラクターのパラメーターとして文字列を取り、新しいドキュメントを返すように変更チェーンを持たせます。また、文字列を返す to_s メソッドを指定します。

class Doc
  def initialize(str)
    @str = str
  end

  def to_s
    @str
  end

  define word_count, cjk?, etc.
end

Doc.new("Some document").word_count
# => 2
于 2013-04-30T19:03:53.140 に答える