ソフトウェア工学 知能情報学部 新田直也
構造化指向の限界 なぜ構造化指向では駄目なのか? 作成するソフトウェアが変わってきた. より短期間での開発が要求されるようになってきた. CUIシステムからGUIシステムへ… より短期間での開発が要求されるようになってきた. そもそもシステム化の対象を関数(入出力)のみで構造化することに限界があった.
関数とオブジェクト(1/2) 関数とは… われわれの身の回りのモノは? 内部状態を持つ オブジェクトである 入力と出力で特徴付けられる. 同じ入力を与えれば必ず同じ結果が得られる. (内部状態を持たない.) われわれの身の回りのモノは? sin π/2 1 入力 出力 お金,ボタン ジュース,おつり 入力 出力 内部状態を持つ オブジェクトである 状態変化 状態参照 お金,ジュースのストック
関数とオブジェクト(2/2) オブジェクトとは… 内部状態(つまりデータ)を持つ. 入力を与えれば出力が返ってくるが,その際内部状態が更新されたり内部状態が出力値に影響を与える(関数とは呼ばず操作と呼ぶ). オブジェクトとは,データと操作を一体化(カプセル化)したもの. 一般に一種類のオブジェクトに対して複数の操作を定義することができる. 自動販売機オブジェクトでは,購入,返却,商品補充など. ちなみに,構造化指向では内部状態は,グローバル変数,ポインタ引数,静的変数などで表現されていた.
カプセル化と情報隠蔽 構造化指向では関数内の処理内容が情報隠蔽されていた. オブジェクト指向では操作の処理内容に加え,内部状態もカプセル化されて情報隠蔽される. オブジェクトにメッセージを送れば,内部で適当に処理してくれるイメージ. オブジェクトA 操作1の呼び出し (メッセージ) 操作1 内部データ 操作2の呼び出し (メッセージ) 操作2
オブジェクト指向パラダイムとは オブジェクト指向言語の発展に伴って形成されてきたソフトウェア開発上の概念.オブジェクト指向分析,オブジェクト指向設計など,プログラミング以外の工程でも用いられる. ソフトウェアを処理や関数ではなくオブジェクトに分解する. オブジェクト指向プログラミングの構成概念は3つ カプセル化(encapsulation,抽象データ型) 継承(inheritance) 多相性(ポリモルフィズム,polymorphism)
オブジェクトの実例 Windowシステムが好例 Windowオブジェクト スライドオブジェクト 矩形オブジェクト 線分オブジェクト 円オブジェクト ツールバーオブジェクト
メッセージの例 閉じよ 最小化せよ 移動せよ サイズ変更せよ 削除せよ 移動せよ サイズ変更せよ
クラスとインスタンス カプセル化についてもう少し詳しく見ていこう. 同型の自動販売機がたくさんあった場合でも,操作の種類や内容,どのような内部状態を持つか(お金とジュースのストックを内部状態として持つ)はすべて同じ. 一方,実際の内部状態は個々の自動販売機によって異なる. モノの種別,内部状態(データ構造)や操作内容の定義→クラス 個々のモノ,内部状態が異なる個体→インスタンス(オブジェクト) ...
クラスと抽象データ型 クラスとインスタンスの関係は,型と変数の関係に等しい. 型 変数 int x; 構造体 構造体変数 実行時にメモリ上に確保される. いくつでも宣言できる. 型 変数 int x; 構造体 構造体変数 struct List l; クラス インスタンス Circle c;
Javaにおけるオブジェクト指向(1) 操作はメソッドと呼ばれる.内部状態はフィールドとして定義. クラス定義の例: クラス名 class Circle { double radius; // 半径 double x; // 中心座標のx成分 double y; // 中心座標のy成分 int color; // 色 void move(double px, double py) { x = px; y = py; } void resize(double scale) { radius = radius * scale; フィールド定義 (インスタンス変数) メソッド定義
Javaにおけるオブジェクト指向(2) インスタンスの生成,利用 Circle c = new Circle(); c.move(100,50); c.color = 255; Circleクラスの インスタンスの生成 moveメソッド呼び出し Circle クラス フィールド(メンバ)へのアクセス new で生成 インスタンス c move()メソッドの呼び出し
なぜカプセル化をするのか 対象領域上の概念と対応付けられるので理解し易い. より大きな単位でまとめられるので再利用し易い. ただし適切なクラス名をつける必要がある. より大きな単位でまとめられるので再利用し易い. カプセル化されていれば,そのデータ構造とそれに対する処理をまとめて持っていける. データ構造などの変更に対して強い. 隠蔽されているデータの構造の変更に伴ってそれに対する処理のアルゴリズムが変わっても,メソッド群のインタフェースさえ変わらなければ,使う側には影響が及ばない. move() jump() Player オブジェクト setHP() getHP()