作成日 2007/5/19 最終更新日 2009/2/1
エンティティクラス、バウンダリクラス、コントロールクラス、その他のクラス
えーと、オブジェクト指向ではエンティティクラスが一番の基本であるのですが、当然それ以外の種類のクラスもあります。
ここではBCEパターン(※1)におけるエンティティクラスとはどのようなクラスなのか簡単に説明し、BCEパターンにはそれ以外にどのようなクラスがあって、どのような特徴を持っているのかについて説明します。
それと、さらにBCEパターン以外で出てくるクラス(※2)についても簡単に説明します。
-----
※1:BCEパターンを知らない人はGoogleで「BCEモデル」、「BCEパターン」、「ロバストネス分析」などの単語で調べてください。
ちなみに”BCE”の”B”はバウンダリ(Boundary)、”C”はコントロール(Control)、”E”はエンティティ(Entity)のことです。
それと、BCEパターンの”C”はMVCパターンの”C”とは別物なので注意してください。
※2:”BCEパターン以外で出てくるクラス”というときりがないです。
というのは、BCEパターン以外のパターンなんてたくさんあるし、そもそもクラスの種類なんてものは設計者が勝手に定義できる(※3)ので。
ですので、だるまが知っているものだけ説明します。
※3:UMLを勉強したことがある人なら「ステレオタイプ」というものを聞いたことがあると思います。
エンティティクラス(Entity
Class)というのは、簡単に言うとデータを保持するクラスです。
ER図のEもエンティティのEなので、ER図を知っている人はすぐにわかると思います。(わからない人は「クラス図とER図とクラスの抽出 」を見てください。)
あと、エンティティクラスの特徴としては、
データベースに永続化(※1)されることが多い。
抽出方法がER図におけるEntityに似ている(※2)。
DOA(データ中心アプローチ)との関連が深いかも(※2)。
クラスの凝集度が高く、変更がかかりにくい(※3)。
クラス図でステレオタイプ<<entity>>をつけることがある。
クラス図で下記のアイコンで表記することがある。
くらいかなぁ。
-----
バウンダリクラス(Boundary
Class)自分が作ろうとしているシステムと外部システムやユーザ(ユースケース図においてアクターとして抽出するもの)とのやり取りをするクラスです。
Boundaryを日本語に直すと「境界」です。つまり自分が作ろうとしているシステムの境界部分のクラスです。
バウンダリクラスの例としては、画面クラスかなぁ。他にも他のシステムとの連携用にファイルを出力したり、ユーザがあとで確認する書類を出力したりするようなクラスです。あ、ファイルを出力するからといっても、必ず、バウンダリクラスになるわけではないです。ファイルを出力しても外部システムやユーザが読むわけでなく、単に自分が作ったプログラムしか読み書きしないファイルを出力するのであれば、それはバウンダリクラスにはなりません。
それと、画面でもなければ、ファイルを出力しないからといってバウンダリクラスではないということにもなりません。DLL を作った場合は、外部に公開しているクラスは当然バウンダリクラスになりますし、分散システムで外部システムとのやり取りにCORBA
を使うならIDLで定義したインターフェースがバウンダリクラスとなります。
バウンダリクラスの特徴としては
エンティティクラスやコントロールクラスと比べると変化しやすいらしい。
バウンダリクラスの属性や、画面レイアウトを決めるのはウォーターフォールモデル でいうところの外部設計か?
クラス図でステレオタイプ<<boundary>>をつけることがある。
クラス図で下記のアイコンで表記することがある。
くらいかなぁ。
コントロールクラスは…、なんだろう。
あまり理解できてない…。すまん。
ただ、エクセルにおいては、最後に"s"がついているクラスがこれに相当するみたいだ。(例えば、AddInsクラス)
↑間違っている気がする。良く分からない。(このページを見ている人へ:すいません。)
詳しいことは、参考文献 の1を見て。
コントロールクラスの特徴としては
属性があまりないらしい。
クラス図でステレオタイプ<<control>>をつけることがある。
ユースケース図でのユースケースを実現するためのクラス。
だるまがあまり理解していない。
クラス図で下記のアイコンで表記することがある。
くらいかなぁ。
BCEパターン以外で出てくるクラスについて説明します。
ここでは、クラスの機能で分類したときに出てくるクラスについて説明します。
抽象クラス、具象クラス(※1)、インターフェースクラスなど、機能ではなく、えーと、定義方法で分類したクラスについては説明しません。
ユーティリティクラス
java.lang.Mathクラス
のような、なんというか、関数を提供するクラスで、インスタンスを生成できないようになっている。
クラス図においてステレオタイプ<<utility>>(※2)をつけることがある。
エクセルVBAでは標準モジュールを使用して定義する。
DAO(Data Access
Object)クラス
なんだろう…、簡単に言うとデータベースにアクセスするクラスでいいと思う。
多分、オブジェクト指向とRDB (リーレーショナルデータベース)の間のインピーダンスミスマッチ(※3)を解決する部分。
その他
まあ、他にも適用するデザインパターンやシステムの対象(例えば、組み込みなど)によってもいろいろなクラスがある。
-----
※1:抽象クラスの反対。インスタンスを生成できるクラスのこと
※2:もしかしたら、ステレオタイプではなくキーワードかもしれない。
※3:O/Rインピーダンスミスマッチがわからない人は
参考文献
の2番を見てください。
エンティティ、コントロール、バウンダリなどと、分離するメリットについて説明します。
分離しない方がソースの行数が少なくすむので、プログラミング工程のみを考えた場合は分離しない方が良かったりします。しかし、その後のテストや機能拡張による修正までを考えた場合は分離した方が良いです。
分離するメリットには以下のものがあります。
1つのクラスが小さくなるので、見やすくなります。クラスの凝集度も変わってくると思います。
ちなみに、クラスは凝集度が高く、結合度が小さい方が良いです。
再利用がしやすくなる。
バウンダリとコントロールがごっちゃになった場合、例えば、今まで画面から行っていた処理をバッチで実施しようとしたとき再利用できないです。
仕様変更による変更の影響を抑えることが出来ます。
バウンダリ、コントロール、エンティティでは変更を受ける頻度が異なります。エンティティが最も変更を受ける可能性が低く、バウンダリが最も高いです。
変更の可能性が高いところと低いところを分けることにより、変更がかかったときの影響を少なくすることが出来ます。
分離していた方がテストがしやすいです。
テストは1度やったらおしまいではないです。回帰テスト といい、後で、何度も行う場合があります。
また、テストの自動化がしやすい箇所としにくい箇所は分けておいたほうが良いです。
関連や依存の方向性について説明します。
要するに2つのクラスがあったとき、片方のクラスからもう片方のクラスを使用したり、もう片方のクラスのオブジェクトを保持(例えば集約)して良いかどうかという話です。
当たり前の話になりますが、関連や依存の方向性は、
変更のかかりやすいクラス → 変更のかかりにくいクラス
としてください(変更のかかりやすいクラスが変更のかかりにくいクラスを使用するようにしてください)。
エンティティ、コントロール、バウンダリで変更のかかりやすさは、
バウンダリ
コントロール
エンティティ
の順となっています。ですので、エンティティからコントロールを使用したり保持したりしないようにしてください。
もし、どうしても・・・と言う場合(逆の方向性を持たせたい場合)、例えば、エンティティのデータが変わったときにコントロールに通知したい場合は、イベントを発信する(※1)ようにした方がよいです。
-----
※1:イベントの発信はVBA(Ver.6.0以上)ではEventステートメントを使用して実現できます。VBA(Ver.5.0)の場合はイベントは作成できません。これは困る・・・。
Javaの場合は
オブザーバパターン を使用して実現することとなります。
このページを作成するのに参考にしたページです。
ただし、だるまは、このページを作成するにあたり、これらのページを100%理解してから作成したわけではない(おいおい。)です。
間違い(リンク先のページではなく、このページに)があったら、ごめんなさい。
このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方は
メール をお願いします。
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. の米国およびその他の国における商標または登録商標です。
OMG、UML、Unified Modeling Languageは、Object Management Groupの商標または登録商標です。
CORBAは、Object Management Groupが提唱する分散処理環境アーキテクチャの名称です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。
このホームページの作成者はこれらの会社とはいっさい関係がありません。