ソフトウェア開発メモ

日々のソフトウェア設計、実装で考えている、気づいた事を書いています。それが真実か否かは保証しません。悪しからず。

オブジェクトの循環参照について

クライアント/サーバーの関係で考えてみると理解しすい。

  1. 直接呼び出す場合だとクライアント側のインスタンス変数及びプライベートメソッドを公開するか、サーバーから呼ばれるメソッドを作るらざるえない。

  2. 1に関連して、メソッドを的確に定義できるならオブザーバーやデレゲードのようなインタフェースに昇格できるし、できないなら作った本人も予測できない不適切な設計である。つまり、実質1つのクラスで使っているのと変わらない。

  3. お互いの領域を行ったり来たりするので分からなくなる。

と書いてて気づきましたが、循環関係をつくってもよい例外に親子関係があります。本来は子側で用意したインタフェースを親側で実装するのが正しいのかな? コンポジット関係ならインタフェースを用意するだけ無駄だし。

補足:しかし、いろんな人のコードを見ると当たり前のように循環参照を作りこんでいますな。コード解析やデバックに時間がかかるだけなのに。

プラットホームを作っている会社だと、コードレビュー等でインクルードファイルの依存関係を真っ先にチェックされたりします。