2

私はここで、より良い(設計)アプローチが何であるかを検証したい状況があります。

'XObject'インスタンスのコレクションを含む/インスタンス化するクラス'XController'があるとします。そして、XControllerのインスタンス化を担当するクライアントがあります。

ここで、インスタンス化されたXObjectで実行したいことがある場合は、次のうちどれをお勧めしますか。

アプローチ1:

XController x = new XController(); // do something in the constructor to create XObjects with ids, x1, x2, so on...

x.doStuff(x1); // which does some stuff with the XObject with id 'x1'

アプローチ2:

XController x = new XController(); // do something in the constructor to create XObjects with ids, x1, x2, so on...

XObject xObj1 = x.getXObject(x1); 
xObj1.doStuff(); // which does some stuff with(in) itself

ノート:

  • コントローラは、doStuff()の前後には実際には何もしません。
  • doStuff()の実装は通常、そのオブジェクトの状態のみを更新します。

なぜ一方が他方よりも優れているのかについての言及は高く評価されています。

4

3 に答える 3

2

まず、これはかなり抽象的であるため、コードの意図について推測することしかできません。

これら 2 つのアプローチはほぼ同じものです。どちらの場合も、消費するコードは x1 に何かをするように指示しています。アプローチ #2 を使用する必要があります。消費するコードは、x1 を持っていることを認識し、x1 に何かをさせたいエンティティであるように思われるからです。情報専門家と呼ばれる原則があります。何かを行う方法を知っているコードだけが、それを行うべきです。

アプローチ 1 を使用すると、消費するコードがオブジェクトを呼び出す必要があることを既に認識している場合に、別のクラスにオブジェクトの呼び出しを担当させるだけのように見えます。実際、消費者が x1.DoStuff() を呼び出すことを知っている場合、なぜそれを別のものに渡して、まさにそれを行うように依頼するのでしょうか?

そうは言っても、ここには多くの変数がありません。コントローラーは、各オブジェクトで DoStuff() を呼び出す前に常に何かを行いますか? DoStuff() が呼び出された後、コントローラーは何かを行いますか? DoStuff() を呼び出すと、コントローラー内の何かの状態が変わりますか? 等...

詳細が明らかになるまで、それが私があなたに提供できる最高のものです.

于 2012-12-27T17:49:31.410 に答える
0

十分な情報は提供されていませんが、提示されている内容に基づいて、2 番目のアプローチは最初のアプローチよりも優れています。XObjectに対して操作を実行したい場合、仲介者(XController)を介して実行することはOOPの原則(カプセル化など)に反し、コードを不必要に複雑にする(複数の場所に作業単位を分散させる)ためです)。

また、ここで Controller と呼んでいるものは、一種の Repositofy であると思われます。これに、ある種の ID を提供すると、オブジェクトが提供されます。これは、XController で XObject に対して「何か」を実行することがおそらく良い考えではないもう 1 つの理由です。

于 2012-12-27T21:44:29.783 に答える
0

これ以上の詳細を知らずに言うのは非常に難しいです。

ただし、XController によってラップされているため、呼び出し元のコードで XObject について何もする必要がない場合は、最初のソリューションの方が適している可能性があります。このようにして、必要に応じて、呼び出し元に影響を与えることなく XObject を変更できます。

何をコーディングしようとしているのかについて、より詳細な説明を与えると、より良いアドバイスを与えることができます。

于 2012-12-27T17:51:46.450 に答える