趣味でソフトウェア プロジェクトに取り組んでいるとき、設計プロセス中に進行が遅くなったり、完全に停止したりすることが何度もありました。通常、以前に遭遇したのと同じ問題に出くわします。このような繰り返し発生する問題の 1 つは、オブジェクトがどのオブジェクトと接触する必要があるか、またはどのオブジェクトがそれを所有しているかをオブジェクトに知らせることです。
Corporation
という名前のクラスのインスタンスがありstartup
、1 つのクラスSupervisor
オブジェクトと複数のクラスEmployee
オブジェクトが機能するとします。スーパーバイザーは、従業員にタスクを割り当て、従業員が支援を求めたときに支援する責任があります。しかし、従業員は、割り当てられた作業を完了したことを報告したり、何かを依頼したりするために、上司が誰であるかを知る必要があります。
問題は、この上司が誰であるかを従業員にどのように知らせるかです。私はいくつかの解決策を考え出しましたが、どれも決定的な答えのようには思えません。
- インスタンスを
Supervisor
グローバルにアクセスできるようにし、すべてEmployees
そのインスタンスを直接呼び出すようにします。グローバルを避けることは一般的には良い考えですが、これは例外でしょうか? 私はそうは思いませんし、startup
複数のマネージャーを持つようになった場合、問題が発生するでしょう。 static Supervisor *supervisor
クラスへのメンバーの追加Employee
: これにより、グローバル アクセスの使用とそれに関連する問題が回避されますが、従業員がstartup
成長したときに別のマネージャーに報告することができなくなります。Supervisor *supervisor
クラスにメンバーを追加し、従業員のコンストラクターのパラメーターとしてそれぞれへのポインターをEmployee
渡す: 非常に柔軟ですが、メンバー変数が多くない場合、メモリ使用量の点で非効率的です。Supervisor
Employee
Employee
- 誰が誰であるかを知る必要があるメンバー関数
Supervisor
のすべての呼び出しで、ポインターをパラメーターとして渡す: 最も柔軟ですが、おそらく解決策 3 よりも効率が悪く、ほとんどすべてのメンバー関数がスーパーバイザー パラメーターを必要とするため、追加のオーバーヘッドと不要な依存関係。Employee
Employee
supervisor
Employee
型以外の引数を 1 つ持つクラス テンプレートを作成するSupervisor *S
: これは、ソリューション 1 または 2 と同じくらい効率的ですが、より柔軟です。ただし、従業員の数はstartup
実行時に変更できますがstartup
、コンパイル時に追加のスーパーバイザーを作成して非アクティブのままにしない限り、実行時にスーパーバイザーを追加することは不可能です。さらに、引数として異なるが似ている (テンプレートで作成された) タイプの 1 人の従業員を受け取るコピー コンストラクターを作成する方法についてもわかりません。