作成日 2011/3/20 最終更新日 2011/3/20
問題2.13(問題タイトル:多態性の特徴・メリット・デメリット)
オブジェクト指向設計についての問題(中級レベル)です。
問題タイトル:多態性の特徴・メリット・デメリット
重要度:★★★★☆(やや重要)
難易度:★★★☆☆(普通)
問題タイトル:多態性の特徴・メリット・デメリット
重要度:★★★★☆(やや重要)
難易度:★★★☆☆(普通)
問題:オブジェクト指向設計を行う時に、多態性を活用した設計を行うことがある。多態性の特徴・メリット・デメリットとして正しいものを全て 選択せよ。
a.多態性のメリットに下位モジュールのソースコードの行数の削減できるということが挙げられる。
b.多態性をうまく活用すると、下位モジュールが不安定な場合に、上位モジュールへの、その影響を完全になくすことができる。
c.多態性をうまく活用すると、下位モジュールが複数存在し、上位モジュールはその中から選択したり、組み合わせたりして使うといったことができる。
d.多態性をうまく活用すると、上位モジュールのモジュールの強度(凝集度)を強くすることができる。
e.多態性を活用した設計には時間がかかるというデメリットがある。
f.多態性を活用すると、クラスの個数が増える傾向にある。
g.多態性を考慮したクラスのオブジェクトを生成する場所と、そのメソッドの呼び出し場所が離れている(例えば、別のクラスにまたがっている)場合、机上デバッグ時にソースが追いにくくなり、チェックが難しくなるといったデメリットがある。
問題文終わり
注意:これ以上、下にスクロールすると解答・解説が見えちゃいます。
解答:c,d,e,f,g
※部分点は存在しませんよー。1つでも余計なのを選択したり、間違えたら0点です。
解説:
多態性を正しく理解して設計に活用しているかを問う問題です。
1つ1つ解説していきます
a.誤り。
そもそも、「ソースコードの行数の削減」をメリットとして挙げるのは大変危険なのでやめましょう。
行数よりも強度(凝集度)、結合度、テストのしやすさを向上させる方が大切です。
それから、継承により多態性を実現した場合は確かに行数が減るのですが、このHPではこの考えは基本NGとしています(絶対ではありませんが)。
そうすると、インタフェースを定義しないといけなくなるから、かえって行数が増えますね。
※百歩譲って、継承OKとしても、それは継承によってソースコードが減ったのであって、多態性によってソースコードが減ったのではありません。
b.誤り。
影響を完全になくすことはできません。例えば、下位モジュールのメソッドの追加・削除、引数の型や個数を変更した場合、上位モジュールにも影響がでます。
下位モジュールと上位モジュールの間のインタフェース(メソッド)の仕様が変わらない限りは影響は防げますが・・・。
c.正しい。
例えば、「下位モジュールが複数存在し、上位モジュールはその中から選択したり」というのはJavaならorg.omg.CORBA.ORBクラスなど。
他にはGoFのデザインパターンのストラテジーパターンなど。
「組み合わせたりして使う」というのはJavaならjava.ioパッケージのstream系のクラスがそうです。GoFのデザインパターンならデコレータパターンです。
他にもGoFのデザインパターンには多態性を活用したパターンが存在します。
d.正しい。
というか、上位モジュールの強度(凝集度)を高めるために多態性を活用するというのが1つの使い方だったりします。
e.正しい。
多態性は、下位モジュールの後からのメソッドの追加、削除、引数の型や個数の変更に弱いことがデメリットです。
複数ある下位モジュールをきちんと動作させることができるようにメソッドの型、個数を考える必要があります。
だからと言って、引数をObject型にしたら、意味が分かりにくくなってしまうので、まあ・・・どうするかと・・・。
こんな感じで、あれこれ考える必要が出てくるので、設計に必要な時間が増えるんです。
f.正しい。
これはメリットとなる場合もあれば、デメリットとなる場合もあるのですが、このような傾向があるということだけは押さえておきましょう。
クラス数が増えると通常、強度(凝集度)も上がるため、一般には、これはメリットです。
しかし、クラス数があまりにも多いとうんざりすることがあるんです。なので、あえてメリットとしませんでした。
g.正しい。
特に説明することはないが、多態性を考慮した設計を行うときはリスコフの置換原則をしっかり守る必要があるということですね。
このページを作成する際に参考にしたページや、もっと勉強したい人向けの資料です。
このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方は
メール をお願いします。
Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft
Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS
、Mac OS
X は米国Apple
Computer,Inc.の登録商標または商標です。
Sun、Sun Microsystems、サンのロゴマーク、Java、及び、Sun/Solaris/Java に関連するすべての商標およびロゴマークは米国 Sun Microsystems, Inc. の米国およびその他の国における商標または登録商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。
このホームページの作成者はこれらの会社とはいっさい関係がありません。