プログラム再構成に関する 特許申請について

ソフトウェア工学
知能情報学部
新田直也
オブジェクト指向パラダイムとは
オブジェクト指向言語の発展に伴って形成されてき
たソフトウェア開発上の概念.オブジェクト指向分析,
オブジェクト指向設計など,プログラミング以外の工
程でも用いられる.
 ソフトウェアを処理や関数ではなくオブジェクトに分
解する.
 オブジェクト指向プログラミングの構成概念は3つ




カプセル化(抽象データ型)
継承
多相性(ポリモルフィズム,polymorphism)
継承に関する注意

円クラスと楕円クラスはどちらが親か?



楕円は円を一般化した概念なので,楕円クラスの方が親?
円クラスの方がメンバが少ないので,円クラスの方が親?
技術者の答え.


楕円と円を同じクラスにする.
楕円クラスと円クラスを兄弟にする.
Shape
継承
Circle
過剰な継承はむしろ弊害が多い.
 答えは1つではない.
 実際にプログラミングしてみないとわからない.

継承
Ellipse
設計は何のためにするのか

設計の主目的:



もっとも楽でない作業は?



実装者,保守者が楽をするため.
作業の無駄をなくすため.(作業が混乱しないように)
他人のプログラムを読んで理解すること.
同じようなプログラムを何度も書くこと.
よって,いい設計とは?


各人が読むべき箇所の少ない設計.
同じ処理が一箇所にまとめられている設計.
多相性の考え方(1)

クラスを区別することなくメッセージを送りたい.


新しくクラスが付け加わっても,送り側を変更しないで済む.
送り側のプログラムの可読性が向上する.
図形移動
コマンド
移動せよ
移動せよ
移動せよ
多相性の考え方(2)

ただし,クラスによって定義されているメッセージが異なる.
そのクラスで定義されていないメッセージが送られてきたとき
どう対処すればよいのか?
→共通の親クラスを持つことを前提とすればよい.
図形移動
コマンド
移動せよ
移動せよ
移動せよ
「図形
クラス」
多相性の考え方(3)

クラス図を使った説明.

相手を親クラスのオブジェクトとみなしてメッセージを送る.
移動せよ
図形移動
コマンドクラス
図形クラス
継承
継承
継承
移動せよ
円クラス
移動せよ
移動せよ
矩形クラス
線分クラス
多相性の例

複数種の図形を同時に選択,編集する機能など.
矩形オブジェクト
線分オブジェクト
円オブジェクト
抽象クラスとインタフェース



インタフェース(interface): 定数と抽象メソッドだけを持つことが
できる(クラスと並ぶ)記述単位.インスタンス化できない.またクラ
スへの引継ぎは継承ではなく実装で行われる.多相性はインタ
フェースを介しても実現できる.
抽象クラス(復習): 抽象メソッドを1つ以上持つクラス.インタ
フェース同様インスタンス化できない.
抽象クラスはひな型(未完成なクラス),インタフェースは会話のた
めの規格と考えればよい?
ウィンドウクラス
マウスが押されたよ
実装
スライドクラス
実装
円クラス
マウスリスナ
インタフェース
実装
矩形クラス
実装
線分クラス
Javaにおける多相性(1)

子クラスのオブジェクトを親クラスまたはインタフェースの変数で参
照できる.(型キャストのようなもの)
Shape s = new Circle();
s.move(100,50);
s = new Rectangle();
s.move(100,50);
s = new Line();
s.move(100,50);
Lineクラスの
moveメソッド呼び出し
Circleクラスの
インスタンスの生成
Circleクラスの
moveメソッド呼び出し
Rectangleクラスの
インスタンスの生成
Rectangleクラスの
moveメソッド呼び出し
Lineクラスの
インスタンスの生成
Javaにおける多相性(2)

もう少し現実的なプログラム
Shapeクラスの配列
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);
s[i]の実際のクラスに
非依存なコード
}
Javaにおけるインタフェース

Javaではクラスを定義するときに継承できるクラスは1つだ
けだが,インタフェースは複数実装することができる.
親クラス
継承
インタフェースA
インタフェースB
実装
実装
子クラス


インタフェースは,interface キーワードを使って定義する.
実装には,implements キーワードを用いる.
インタフェースの記述例

マウスリスナインタフェース


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 {
本日のまとめ
多相性について.
 多相性はカプセル化および継承の概念から自然に
導かれるもの.
 多相性こそがオブジェクト指向設計の醍醐味.
 デザインパターン(後述)は,多相性を基盤に構築さ
れている.
