###質問したいこと
相互参照というのはもっともな回避法があるのでしょうか?
また、相互参照はそれほど回避する必要があるのでしょうか?
###相互参照の評価
c++
1//生きてる 2class Unit{ 3public: 4 int Damage(int)//めちゃくちゃ痛いことする 5private: 6 weak_ptr<Field> field; 7} 8 9//生きてるの持ってる 10class Field{ 11private: 12 vector<shared_ptr<Unit>> units; 13} 14
こういう形の実装は良くないと言われているのを耳にしました。
確かにFieldがUnitを参照しているのにUnitもまたFieldを参照してしまうと
クラス関係が複雑になったりモジュール結合が強いというのはわかります。
ですがこのプログラムがゲームだとしてUnitがUnitに対してダメージを与えたりする場合
Unitへアクセスする必要があり
Unit自体はUnitへの参照を持たないので
その攻撃範囲なりなんなりにUnitがいるのかどうかどうにかして調べる必要があり、
そのためには各Unitを持っているFieldクラスにアクセスする必要があると思います。
これを相互参照に使用せずに回避する方法があるのでしょうか?
実装する場合Unitはインターフェースになると思いますが
どちらにせよFieldへの相互参照になるのは変わりないはずです。
###パッと思いつく回避法
- アクセスが必要なものはすべてFieldが行い戻り値と引数を駆使する
これをすると移動などもFieldクラスが管理する必要があり
Unitとのアクセスもやたら増えますし、変更に弱く
Fieldクラスが肥大化し介護福祉士と名を変える必要が出てしまうと思います。
それに手続き型でよくなります。
- フィールドをグローバル
結合度が高くなるのは変わりないと思います
- UnitにUnit全てへの参照を持たせる
これは・・・
- フィールドへの参照をインターフェースでラップする
Fieldクラスの参照自体は隠せますし結合度は下がるかもしれませんが釈然としません。
これは相互参照自体の解決にはなってないような気もしないでもありません。
- クラス構成をリフォームする
個人的にこのクラス分けが直感的なので
出来ればなんとかManagerとかがたくさん出てくる
劇的な匠業は遠慮したいです。
###実際のところどうなんでしょうか
何か上手い回避方法があるのでしょうか?
そもそも相互参照はそこまで気にしないでいいのでしょうか?
調べても良くないという人もいれば場合によっては選択肢に入るという人もいますが
今一つはっきりとした答えが見つかっていません。
今回のFieldクラスとUnitクラスでいうとUnitはFieldの参照を持つべきなのでしょうか?
答えがあるとすればその理由を教えていただきたいです。
ちなみに相互参照を持つとすればsharedとweakの使い方は間違っていませんか?
opensourceのゲームも少し調べてみましたがUnitのリストを持つクラスがグローバルなものと
Fieldへの参照(生ポインタでした)を持っているタイプしかまだ見ていません。
というかその二つしかまだ調べてません!!!!!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/21 13:39 編集
2016/07/21 13:41
2016/07/21 13:51