4

次のようなデザインがあるとします。

オブジェクト GUI には、オブジェクト aManager とオブジェクト bManager の 2 つのオブジェクトがあり、互いに対話することはありません。

aManager と bManager は両方とも、オブジェクト cManager を属性 (または cManager へのポインター) として持っています。したがって、aManager がその cManager を変更すると、bManager の cManager にも影響します。

私の質問は、これを設計/実装する正しい方法は何ですか?

cManagerをGUIの属性にしようと思っていたのですが、GUIはaManagerとbManagerを構築する際にcManagerへのポインタを渡します。しかし、IMHO、GUI は cManager とは何の関係もないのに、なぜ GUI はそれを属性として持たなければならないのでしょうか?

ここで使用すべき特定の設計パターンはありますか?

4

7 に答える 7

1

これをできるだけ簡単に解釈します。あなたの質問に答えない場合は、お詫び申し上げます。

この質問に対する答えが本当に得られたら、それはオブジェクト指向で実際に考えるための最初のステップです。

OOでは、2つのオブジェクトが両方とも別のオブジェクトを「持っている」場合、両方がその別のオブジェクトを参照することは完全に許容されます。OOの秘訣は、オブジェクトには独自の寿命があり、流動的であり、オブジェクトを必要とする人は誰でもオブジェクトへの参照を維持できることです。オブジェクトは、それ自体を「有効」に保ち、他の多くのオブジェクトで使用されるときに安定性を維持する必要があります。(これが、Stringのような不変オブジェクトが非常に優れている理由であり、作成された2番目のオブジェクトと同じくらい常に有効です)

唯一の例外は、C ++でコーディングしている場合です。これは、実際にオブジェクトを手動で解放する必要があるためです。これは、各オブジェクトのライフサイクルを監視できる所有者を意味します。これにより、C++のOOで「考える」ことが非常に困難になります。

【追加】ポインタを参照しているので、違うC++でプログラミングしていると思います。その場合、あなたは正しいです。1人のマネージャーが共有オブジェクトのライフサイクルを「所有」するようにします。他のすべての参照がなくなるまで、そのオブジェクトを死なせてはなりません。

参照カウントを使用することもできます。誰かがあなたのオブジェクトへの参照を取得するときはいつでも、それは「addReference」か何かを呼び出します、それが行われるときはいつでもそれは参照を削除します。カウントが1のときに誰かがremoveReferenceを呼び出すと、オブジェクトはそれ自体をクリーンアップできます。これはおそらく、C++で真のOOスタイルの割り当て/解放に到達できる限り近いものです。ただし、エラーが発生しやすくなります。

私が信じているこの種のことをするための図書館があります。

于 2008-09-18T16:28:27.803 に答える
1

GUIオブジェクトコンストラクターのパラメーターとしてcManagerを渡すことをお勧めしますが、それへの参照を維持しないでください(Javaコードはここにありますが、アイデアはわかります):

public GUI(CManager cManager)
{
    this.aManager = new AManager(cManager);
    this.bManager = new BManager(cManager);
    // don't bother keeping cManager as a field
}

ここでは、Singleton も Factory も適切ではないと思います。

于 2008-09-18T16:33:14.237 に答える
1

シングルトンは慎重に使用してください (簡単なテストが必要な場合は、まったく使用しないでください)。

于 2008-09-18T16:37:36.080 に答える
0

これは、達成したいことについて話し合うことなく答えるのは難しいことです。しかし、私は、あなたが言うように、GUIにaManagerとbManagerへのポインターを渡すようにすることをお勧めします。

GUIを作成しようとしていて、GUIにデータを出し入れする方法がわからない場合は、これをお勧めします:http: //codebetter.com/blogs/jeremy.miller/archive/2007/07/25/the -build-your-own-cab-series-table-of-contents.aspx

これは主にC#ユーザー向けに書かれていると思いますが、他の言語にも当てはまります。ただし、これは最初のOOアプリケーションに必要なものよりも高度な場合があると思います。オブジェクト指向デザインに関する本を手に入れて、夜を過ごす必要があると思います。

初心者として、私はあなたが最初にすべてを最も完璧な正しい方法でやろうとするのではなく、ただ何かを機能させることをお勧めします。さまざまな基準でソリューションが他のソリューションよりも優れている理由を時間とともに(そして多くのことを読んで)学びます。あなたの質問に対する正しい答えはありません。

于 2008-09-18T16:19:22.710 に答える
0

GUIをモデルおよび実装から分離することを検討する必要があります。

アプリ全体でcManagerが1つしかない場合は、cManagerをシングルトンにすることができます。

于 2008-09-18T16:13:46.903 に答える
0

Factory パターンを使用して、必要に応じて aManager と bManager の両方から cManager への参照を要求できます。

http://msdn.microsoft.com/en-us/library/ms954600.aspx

于 2008-09-18T16:10:25.070 に答える
0

一般に、可変オブジェクトは常に、明確に定義された所有者を 1 つだけ持つ必要があります (オブジェクトは通常、その有効期間を通じて複数の所有者を持ち、最初の所有者はコンストラクターであり、コンストラクターは、呼び出したコードに所有権を渡します)。 it など) オブジェクトへの参照を保持するその他のものは、その参照を他の誰かが所有するオブジェクトへの参照であるとみなすべきです。

C++ から Java または .net に移行するとき、「やあ、もうオブジェクトの所有権について心配する必要はない」と思うかもしれませんが、そうではありません。変更可能なオブジェクトの所有権は、非 GC システムと同様に、GC ベースのシステムでも重要です。所有権を表現する手段がないからといって、誰が何を所有しているかを知る義務からプログラマーが解放されるわけではありません。その義務を果たすのが難しくなるだけです。

cManager が変更可能な場合、aManager を所有し、bManager がその参照を保持し、そのターゲットへの変更が aManager の cManager に影響を与えると考えるか、bManager が cManager を所有する必要があります (aManager が参照を保持するなど)。 aManager と bManager の両方が、その変更がその他のエンティティによって所有されているものに影響を与えると考えて、他のエンティティがそれを所有する必要があります。

所有権の概念を認識しない言語やフレームワークを使用している場合でも、変更可能なオブジェクトを扱うときは常にそのような用語で考えてください。そうでなければ、混乱と災害を招きます。

于 2013-01-04T22:20:06.003 に答える