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

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