ソフトウェア工学 知能情報学部 新田直也
オブジェクト指向パラダイムとは オブジェクト指向言語の発展に伴って形成されてきたソフトウェア開発上の概念.オブジェクト指向分析,オブジェクト指向設計など,プログラミング以外の工程でも用いられる. ソフトウェアを処理や関数ではなくオブジェクトに分解する. オブジェクト指向プログラミングの構成概念は3つ カプセル化(抽象データ型) 継承 多相性(ポリモルフィズム,polymorphism)
継承に関する注意 円クラスと楕円クラスはどちらが親か? 技術者の答え. 過剰な継承はむしろ弊害が多い. 答えは1つではない. 楕円は円を一般化した概念なので,楕円クラスの方が親? 円クラスの方がメンバが少ないので,円クラスの方が親? 技術者の答え. 楕円と円を同じクラスにする. 楕円クラスと円クラスを兄弟にする. 過剰な継承はむしろ弊害が多い. 答えは1つではない. 実際にプログラミングしてみないとわからない. Shape 継承 継承 Circle Ellipse
設計は何のためにするのか 設計の主目的: もっとも楽でない作業は? よって,良い設計とは? 実装者,保守者が楽をするため. 作業の効率を上げるため. もっとも楽でない作業は? 他人のプログラムを読んで理解すること. プログラムを広範囲に渡って修正しテストすること. 同じようなプログラムを何度も記述すること. よって,良い設計とは? 作業に関係ない部分を読まずに済む設計.(関心事の分離) 修正箇所が局所化される設計. 再利用できる範囲が大きい設計.
多相性の考え方(1) 相手のクラスを区別することなく操作したい. 新しくクラスが付け加わっても,送り側を変更しないで済む. 送り側のプログラムの可読性が向上する. 図形移動 コマンド 移動 移動 移動
多相性の考え方(2) ただし,クラスによって定義されている操作(メソッド)が異なる.そのクラスに定義されていない操作が要求されたときどう対処すればよいのか? →共通の親クラスを持つことを前提とすればよい. 「図形 クラス」 図形移動 コマンド 移動 移動 移動
多相性の考え方(3) クラス図を使った説明. 相手を親クラスのオブジェクトとみなして操作する. 図形移動 コマンドクラス 図形クラス 継承 継承 継承 円クラス 矩形クラス 線分クラス
多相性の例 複数種の図形を同時に選択,編集する機能など. 矩形オブジェクト 線分オブジェクト 円オブジェクト
抽象クラスとインタフェース インタフェース(interface): 定数と抽象メソッドだけを持つことができる(クラスと並ぶ)記述単位.インスタンス化できない.またクラスへの引継ぎは継承ではなく実装で行われる.多相性はインタフェースを介しても実現できる. 抽象クラス(復習): 抽象メソッドを1つ以上持つクラス.インタフェース同様インスタンス化できない. 抽象クラスはひな型(未完成なクラス),インタフェースは会話のための規格と考えればよい? ウィンドウクラス マウスが押されたよ マウスリスナ インタフェース 実装 実装 実装 実装 スライドクラス 円クラス 矩形クラス 線分クラス
Javaにおける多相性(1) Shape s = new Circle(); s.move(100,50); 子クラスのオブジェクトを親クラスまたはインタフェースの変数で参照できる.(型キャストのようなもの) Shape s = new Circle(); s.move(100,50); s = new Rectangle(); s = new Line(); Circleクラスの インスタンスの生成 Circleクラスの moveメソッド呼び出し Rectangleクラスの インスタンスの生成 Rectangleクラスの moveメソッド呼び出し Lineクラスの インスタンスの生成 Lineクラスの moveメソッド呼び出し
Javaにおける多相性(2) もう少し現実的なプログラム Shape s[] = new Shape[3]; s[0] = new Circle(); s[1] = new Rectanlge(); s[2] = new Line(); : for (i = 0; i < 3; i++) { s[i].move(x,y); } Shapeクラスの配列 実際は様々な子クラス のオブジェクトが積まれる s[i]の実際のクラスに 非依存なコード
Javaにおけるインタフェース Javaではクラスを定義するときに継承できるクラスは1つだけだが,インタフェースは複数実装することができる. インタフェースは,interface キーワードを使って定義する. 実装には,implements キーワードを用いる. 親クラス インタフェースA インタフェースB 継承 実装 実装 子クラス
インタフェースの記述例 マウスリスナインタフェース Javaの組み込みパッケージAWTに含まれている. マウスのイベントを監視するインタフェース. public interface MouseListener extends EventListener { public void mouseClicked(MouseEvent e); public void mousePressed(MouseEvent e); public void mouseReleased(MouseEvent e); public void mouseEntered(MouseEvent e); public void mouseExited(MouseEvent e); } public class Circle extends Shape implements MouseListener {
本日のまとめ 多相性について. 多相性はカプセル化および継承の工学的帰結. 多相性こそがオブジェクト指向設計の神髄. 再利用の範囲を最大限広げることができる. 有効に使えるようになるには修業が必要? デザインパターン(後述)は,多相性を基盤に構築されている. アプリケーションフレームワーク(後述)は,多相性を使わなければ実現できない.