言語に固有のものよりも一般的なOOPに関する質問があります。 私は単純なアプリケーション(java)を試していましたが、実際のシナリオのようにモデル化しようとしていました。 リファクタリング中に、私は、ただ1つのメンバとオーバーライドされたequalsとhashcodeを持つ単純なオブジェクトを思いついたことに気付きました。動作のないオブジェクト
私の質問は....何それが悪いわけではありません
言語に固有のものよりも一般的なOOPに関する質問があります。 私は単純なアプリケーション(java)を試していましたが、実際のシナリオのようにモデル化しようとしていました。 リファクタリング中に、私は、ただ1つのメンバとオーバーライドされたequalsとhashcodeを持つ単純なオブジェクトを思いついたことに気付きました。動作のないオブジェクト
私の質問は....何それが悪いわけではありません
短い答え:
を持っている悪いOO練習それであるが、それは文脈に依存します。は必ずしもそのようなオブジェクト
長い答え:私は、言語に固有のより一般的なOOPに関連する質問がある
。私は単純なアプリケーション(javaで)を試していましたが、実際のシナリオのようにモデル化しようとしていました。
あなたがすべきことを述べるルールはありません。実際には、私はその声明に目をつぶったかなりの人たちのことを知っています。Uncle Bob Martinは1つです。それは、「実世界のシナリオ」をモデル化するよりも、ビジネスプロセスのモデリングに関するものです。私は過去にそれを試してみましたが、現実の世界のように全てを厳格にモデル化しようとすることから得られる恩恵はほとんど、あるいはまったくありません。何かあれば、アプリケーションがより複雑になり、より複雑なソフトウェアになると、維持するのが難しくなります。
私は、ただ1つのメンバとオーバーライドされた等価とハッシュコードを持つ単純なオブジェクトを考え出しました。
@Arsenyがすでに述べたように、ValueObjectはよく知られている方法ですが、通常はコードを書くときに多くは終わらないのですが、あなたのオブジェクトのいくつかに何も振る舞わないものがある場合、これはいわゆるAnemic Domain Modelの表示であるかもしれません。あなたは注意しなければなりません。
"間違っている"かどうかを知ることができます(変数値が「間違っている」ということもあります)。共同作業者がValueObjectを使って何をしているのかを確認し、実際にオブジェクト自体に属する計算。
しかし、これが動作を含まない少数のオブジェクトの1つである場合:うん、そうです、それはおそらく心配する必要はありません。私たちは、しかし、私たちの決定的なものであるコードを見なければならないでしょう。
あなたは簡単な答えは質問です。打ち間違え? –
(ブログなどへの言及は歓迎されるであろう)、そのようなオブジェクト を持っている悪いOOの練習です。幅広く使用されているValue ObjectパターンウィッチとDTOパターンもあります。
このケースでは、これは、Javaのハッシュデータ構造内のオブジェクトの動作を再定義する唯一の方法であるからです。
他のケースでは、キュー内のオブジェクトの順序を変更したい場合など、意味があるかどうかに応じて、より良い方法と悪い方法があります。カスタムComparator
を実装することをお勧めします。特に私の新しい比較ルーチンがオブジェクトに対して「自然」でない場合は、compareTo
メソッドを継承してオーバーライドします。
すべてのデザインパターンには、適切な場合と不適切な場合があります。
通常、動作のないオブジェクトを持つのは匂いと考えられます。なぜなら、それが何の振る舞いもしていなければ、それはオブジェクトではないからです。あなたのクラスをdesigingするときには、 "どのようなクラスの責任ですか?"のようなものを求めている必要があります。それが何の行動もない場合、これは答えるのが難しい質問です。
この例外はNullオブジェクトパターンのようなものです。
http://en.wikipedia.org/wiki/Null_Object_pattern
私はあなたのクラスのメンバーが実際に別のクラスのメンバーでなければならないことかもしれません。 あなたのクラスにはまだ発見していない機能がいくつかあるかもしれません。 プリミティブ型の場合には、コンセプトを重視することもあります。
はOOシステムを設計するための多くの技術が、ここで元の一つである:それは参照型または値型であるべきであるかどうかによって異なり
http://en.wikipedia.org/wiki/Class-responsibility-collaboration_card
。後者の場合、データのみを持つオブジェクトは 'struct'でなければなりません – Raynos