2010/12/31問題2.5(問題タイトル:双方向の関連とメモリの解放)オブジェクト指向設計についての問題(中級レベル)です。重要度:★★★★★(非常に重要)難易度:★★★★★(難しい)問題:図1のクラス図のremoveClass2メソッドを実装するときの注意として、正しいものを1つ選択せよ。クラス図a.実装言語がJavaの場合、Class1オブジェクトからClass2オブジェクトへの参照を破棄すると、該当のClass2オブジェクトとそれに関連しているClass3オブジェクトがガーベッジコレクションの対象となる。b.実装言語がVBAの場合、Class1オブジェクトからClass2オブジェクトへの参照を破棄すると、該当のClass2オブジェクトとそれに関連しているClass3オブジェクトがガーベッジコレクションの対象となる。c.実装言語がC++の場合で、オブジェクトへの参照を直接ポインタを使用するのではなく、boost::shared_ptrを使用して保持している場合、Class1オブジェクトからClass2オブジェクトへの参照を破棄すると、該当のClass2オブジェクトとそれに関連しているClass3オブジェクトがガーベッジコレクションの対象となる。d.a〜cの全てが間違っている問題文終わりこのページのトップへ注意:これ以上、下にスクロールすると解答・解説が見えちゃいます。解答:a解説:プログラミング言語を知ってないと解けない問題です。え?オブジェクト指向設計の問題なのに、なんで、プログラミング言語の話が出て来るんだって?今回の問題に限らないのですが、設計するときは、当然ながら実装できるようにする必要があるためなんです。マーク・アンド・スイープであり、スタック領域やグローバル領域などから追えなくなったオブジェクトが解放の対象となります。そのため、循環参照があっても解放されます。b.VBAのヒープメモリの解放のアルゴリズムは参照カウント方式であり、参照数が0になるとオブジェクトがすぐさま破棄されます。そのため、循環参照があると、解放されず、メモリリークとなります。c.C++のboost::shared_ptrのアルゴリズムは参照カウント方式です。このため、boost::weak_ptrというものが用意されています。d.aが正しい記述ですので、誤りです。それと、補足なのですが・・・、書籍などでは関連の方向性および誘導可能性について深く描かれていないのですが、双方向の関連は無い方が良いです。双方向の関連が出てきたら、単方向にできないか再度チェックしてください。理由は以下の通りです。双方向より、単方向の方が実装が簡単。今回の問題のように参照カウント方式のガーベッジコレクターの場合、何も対策を取らないとメモリリークの原因となります。双方向だと、クラスに対して単体テストを行うときに、2つのクラスを同時に行わなければならない。(ボトムアップが出来ない)難しいのですが、単体テスト時の対象クラスの規模を考えたときに1つのクラスの規模のみを考えるのではなく、両方のクラスの規模で考えることになるので、単体テストが複雑になるんです。これはクラスの品質低下を招き、後のテスト(結合テストなど)に悪い影響を及ぼします。しても、という場合は、片方のクラス(図1ならClass3の方だろう)ではもう片方クラス(Class2)のオブジェクトの保持&アクセスメソッドのみの実装とし、そのクラス(Class2)のメソッドを呼び出すのは避けましょう。両方のクラスで、もう片方のメソッドを呼び出しあうとテストが本当に大変なことになります。※2は正確には双方向の関連ではなく、双方向の依存についての危険性ですね。設計時に注意してください。このページのトップへ3.参考文献このページを作成する際に参考にしたページや、もっと勉強したい人向けの資料です。オブジェクトが破棄されるタイミングについてです。これも、オブジェクトがどのように扱われているかを理解していれば、そんなに難しくはありません。設計する際には凝集度や結合度も重要ですが、試験性についても考慮したほうがいいです。978-4798017044このページのトップへこのページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方はメールをお願いします。Corporationの米国およびその他の国における登録商標または商標です。VBAと表記する場合があります。Computer,Inc.の登録商標または商標です。Groupの商標または登録商標です。米国およびその他の国における商標または登録商標です。その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。このホームページの作成者はこれらの会社とはいっさい関係がありません。