作成日 2011/1/2
最終更新日 2011/1/2

問題2.6(問題タイトル:カプセル化 その2)

オブジェクト指向設計についての問題(中級レベル)です。

問題タイトル:カプセル化 その2
重要度:★★★★★(非常に重要)
難易度:★★★☆☆(普通)


1.問題
2.解答・解説
3.参考文献


1.問題

問題タイトル:カプセル化 その2
重要度:★★★★★(非常に重要)
難易度:★★★☆☆(普通)

問題:情報隠蔽 + カプセル化のメリットもしくは使用法として正しいものを全て選択せよ。

 a.コンストラクタ以外からのデータの設定が出来ないようなクラスのオブジェクト(イミュータブルオブジェクト)を作成するときに使用する。
 b.処理のバリエーションが複数あり、かつ、そのバリエーションが増えたとしても、クラスを使用する側のif文もしくはswitch文の増加を抑え、モジュールの低下を防ぐことが出来る
 c.フィールド名の名前の衝突を防ぎ、フィールド名を短くすることが出来る。
 d.データチェック処理やメモリ確保処理などデータを設定するときに、クラスを使用する側が意識する必要の無い処理を行うことにより、クラスを使用する側のモジュールの強度の低下を抑えることが出来る。

問題文終わり

このページのトップへ












注意:これ以上、下にスクロールすると解答・解説が見えちゃいます。

2.解答・解説

解答:a,d
解説:
 カプセル化についての問題は初級レベルでも出題しましたが、より突っ込んだ内容となり、また難易度がかなり上がってます。
 ※難易度はむやみに上げてません。設計時に必要であると判断し、出題しています。

 a.正しい。
 b.間違い。これは多態性の説明です。「エー」という方もいると思うので、後で説明します。
 c.間違い。これは、クラスやパッケージ(Javaの場合です。UML2.0、C++の場合はネームスペース(名前空間)です。VBAにはパッケージもネームスペースもありません)の説明です。
 d.正しい。


 さて、問題のbなのですが、以下は、わかる人にしかわからない説明です(説明が下手ですみません)。
 読んで理解できなくても問題ありません。というか理解できてしまった方は今まで悪いコードを書いていた可能性あります。その場合は次から気をつけましょう。

 前置きが長くなりましたが、bは確かに、多態性の説明であることはわかります。
 しかし、処理をクラスを使用する側ではなくカプセル化しているクラスの方に移動してしまえば、問題文の通りではないかという疑問がわいてくる。
 言葉での説明が難しいので、ソースコード(JavaとVBA)を出します。

プログラム(Java)
// クラス(Class0)を使う側のクラス
public class Class1 {
    
    public void method1(){
        Class0 obj0 = new Class0();

        obj0.method0(Class0.FLAG1);
    }
}

// 共通クラス
public class Class0 {
    public static final int FLAG1 = 1;
    public static final int FLAG2 = 2;
    public static final int FLAG3 = 3;
    public static final int FLAG4 = 4;

    public void method0(int flag){
        switch (flag){
        case FLAG1:
            // 業務処理1
            break;
        case FLAG2:
            // 業務処理2
            break;
        case FLAG3:
            // 業務処理3
            break;
        case FLAG4:
            // 業務処理4
            break;
        default:
            // エラー
            throw new IllegalArgumentException("flag=" + flag );

        }
    }
}


プログラム(VBA)
Class1(クラスモジュール)
'' クラス(Class0)を使う側のクラス
Option Explicit

Public Sub method1()
    Dim obj0 As New Class0
    Call obj0.method0(FLAG1)
End Sub
Class0(クラスモジュール)
'' 共通クラス
Option Explicit

Public Sub method0(flag As Integer)
    Select Case flag
    Case FLAG1
        ' 業務処理1
    Case FLAG2
        ' 業務処理2
    Case FLAG3
        ' 業務処理3
    Case FLAG4
        ' 業務処理4
    Case Else
        ' エラー
        Call Err.Raise(5, , "flag=" & flag)
    End Select
End Sub
Module0(標準モジュール)
Option Explicit

Public Const FLAG1 As Integer = 1
Public Const FLAG2 As Integer = 2
Public Const FLAG3 As Integer = 3
Public Const FLAG4 As Integer = 4

 ・・・で、これの何が悪いのか?「Class1にはif文もswitch文(VBAの場合はSelect文)も無いのだからOKでしょ」って、switch文(VBAの場合はSelect文)がClass0に移動しただけじゃないですか・・・。
 Class0の中の「業務処理1」って書いてありますが、これは、本当にClass0で行う処理なのでしょうか?
 それから、Class0のモジュールの強度(凝集度)を考えたことはあるでしょうか?

 実は、Class0の強度(凝集度)は「理論的強度(凝集度):関連した複数の機能をもち、モジュールが呼び出されるときの引数(機能コード)で、モジュール内の1つの機能が選択、実行される。」であり、 2番目に悪い強度(凝集度)なんですよ。(更に付け加えると、コード自体は単方向依存に見えますが、内容的には双方向依存になってます。詳しくは説明しませんが、これは非常に危険です。)

 共通クラス(土台部分)の強度(凝集度)が低いのは非常に危険です。
 ということで、bは間違いです。
このページのトップへ

3.参考文献

 このページを作成する際に参考にしたページや、もっと勉強したい人向けの資料です。

番号

リンク先の名称

リンク先の説明

リンクした日

1 カプセル化と属性と操作 - だるまのエクセルVBA オブジェクト指向の3大要素の1つであるカプセル化のメリット(正確には情報隠蔽+カプセル化のメリット)を具体的に説明します。 2011/1/2
2 オブジェクト指向とモジュールの凝集度、モジュールの結合度 - だるまのエクセルVBA オブジェクト指向を理解するうえで、凝集度と結合度の理解は欠かせません。ここではその2つについて説明します。 2011/1/2
3 オブジェクト指向設計と試験性 - だるまのエクセルVBA 設計する際には凝集度や結合度も重要ですが、試験性についても考慮したほうがいいです。 2011/1/2


Prev Up Next  Top
このページのトップへ


このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方はメールをお願いします。

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. の米国およびその他の国における商標または登録商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。

このホームページの作成者はこれらの会社とはいっさい関係がありません。