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