オブジェクト指向設計
オブジェクト指向とは
オブジェクト指向設計を従来の設計手法(パラダイム)である手続き的手法と比較すると次のようになる.
- オブジェクト指向パラダイム
- 手続き的パラダイム(Procedural Paradigm)
- データとデータを操作する手続きとは独立に存在する.
- データは手続きにより操作される受動的存在である.
- オブジェクト指向パラダイム(Object Oriented Paradigm)
- データとデータを操作する手続きをひとまとめ(オブジェクト)にして扱う.
- オブジェクトはメッセージを受け取ると,その内容に応じて自身の手続きを実行する能動的存在である.
- オブジェクト指向設計の特徴
- 情報のカプセル化
- オブジェクト内に情報を隠蔽し,不要なアクセスを制限する.
- 再利用性の向上
- 生産性の向上
- オブジェクト中心の考え方と実世界の類似性により,処理対象のモデル化を容易にする.
- オブジェクト化によりシステムの複雑性を減少させ,生産性を向上させる.
オブジェクト指向設計の概要
- オブジェクトとクラス
- オブジェクト
固有のデータ(インスタンス変数)とそのデータを操作するための手続き(メソッド)を持った実体
- インスタンス変数(メンバ変数)
オブジェクトの内部状態を保持
- メソッド(メンバ関数)
オブジェクトの持つ機能を実現
- クラス
- 同じ性質を持つオブジェクトを示す型がクラスであり,あるクラスに属する全てのオブジェクトは同じインスタンス変数とメソッドを持つ.
- クラスはクラス階層を持ち,上位クラスの性質が下位クラスに継承される.
- インスタンス
あるクラスに属するオブジェクトをそのクラスのインスタンスと呼ぶ.
- オブジェクトの属性
メソッドとインスタンス変数は,次のアクセス属性を持つ.
- 公開(Public) 属性
クラス定義と同じスコープ内からアクセスできる.
- 非公開(Private) 属性
同じクラス内のメソッドによってのみアクセスできる.
- 保護(Protected) 属性
同じクラスのメソッドおよび派生クラスのオブジェクトからアクセスできる.
- 継承
すでに定義されている1つまたは複数のクラス(基底クラス)から,その特性(メソッドとインスタンス変数)を受け継ぐ新しいクラス(派生クラス)を作る.
- 継承関係
- 上位クラス(Super Class)
継承関係において,抽象化レベルの上位にあるクラス
- 下位クラス(Sub Class)
上位クラスから派生したクラス
- 継承クラスの数
- 単一継承
上位クラスを 1 つしか許さない.
- 多重継承
上位クラスを複数許す.
- 継承のタイプ
- 詳細化型継承
- サブクラスがスーパクラスを特殊化,詳細化する.
- サブクラスもスーパクラスと同程度にインスタンスを生成する.
- 多層化型継承
- インスタンスの生成はサブクラスで行われるが,型としてはスーパクラスが使われる.
- オブジェクトの動作はどのサブクラスのインスタンスかによって異なる.
- 抽象化型継承
インスタンスの生成も型としての使用もサブクラスで行われる(スーパクラスはサブクラスに共通の機能を抽象化).
オブジェクト指向設計の手順
オブジェクト指向設計における一般的な手順を示す.
- 問題領域の分析
- システムが理解ないし記憶すべき情報(データ)を抽出する.
- システムが応答すべき事象(イベント)を抽出する.
- システムが果たすべき機能を抽出する.
- システムに存在する自明なオブジェクトを抽出する.
- オブジェクトの決定
- 必要なオブジェクトの型(クラス)を決定する.
- 継承によるクラス型を決定する.
- 各オブジェクトについて,内部データとメソッドの概要を決定する.
- オブジェクト間の相互作用を把握する.
- オブジェクトの組み立て
オブジェクトに必要とされる機能を実現するためのデータやメソッドを詳細化する.
- システムの構築
オブジェクトを部品としてシステムを構築する.
オブジェクト指向によるシステム開発では,UML (統一モデリング言語) を用いることが多い.
オブジェクト指向設計の留意点
オブジェクト指向設計における一般的な留意点を示す.
- 設計方針
- カプセル化
- 互いに関連するデータやメソッドを同一オブジェクトに格納
- メソッドはアルゴリズムを実現する実装部と外部に対するインタフェースを実現する論理部に分離(実装部のメソッドは非公開)
- 簡明性
クラスやメソッドは明確な機能を単純化して実現
- 情報の隠蔽
- 実装に依存したデータ構造はクラス内部に隠蔽
- 内部データへの直接アクセスは禁止
- 結合関係
オブジェクト間のインタフェースを少なくし,各オブジェクトを可能な限り独立化する.
- 継承関係
各クラスに共通するインタフェースをまとめてクラスの継承関係を構築する.
- クラスの設計
- クラス機能の単純化
1 つのクラスは多くの機能を持つべきではない(再利用性を考慮し目的の明確な機能を実現).
- データ構造の隠蔽
内部のデータ構造は隠蔽する(クラスのデータはクラス内のメソッドをとおしてのみアクセス可能にする).
- アクセス権の制限
クラスの外部インタフェースとして公開する範囲は必要最小限にする(メソッドを公開と非公開に明確に区分).
- メソッドの設計
- メソッドの明確化
文脈に依存した処理(方針)と実装を分離する.
- インタフェースの最小化
メソッドが参照するクラスは必要最小限にする.
- メソッドの汎用化
引数の型,メソッドの適用条件と制約,メソッドが作用する文脈の一般化(再利用性の考慮)
- 大域情報の排除
必要な情報は引数で渡すかオブジェクト内で管理
- 引数の検査
障害の回避のための引数の厳格な検査
- 制約の排除
動的記憶割当てなどによるメソッド利用制限の排除
- 継承の設計
- 継承関係の増加
メソッドのインタフェースの見直し(引数やメソッド名の統一化)
- スーパクラスの抽出
- クラス集合の中から共通した操作やインスタンス変数を抽出し,スーパクラス(抽象クラス)としてまとめる.
- 特殊化した機能のみをサブクラスに残す.