第7章 オブジェクト指向

7章:オブジェクト指向
オブジェクト指向とは
オブジェクト指向分析
オブジェクト指向設計
オブジェクト指向プログラミング
もの作りにおける進化
7.1 オブジェクト指向とは
歴史的流れ
1.
2.
実世界のモデリング
1.
シミュレーション言語:SIMULA,Smalltalk
2.
モデル化記述:フレーム理論,初期のオブジェクト指向分析
プログラム構成法
1.
2.
3.
構造化設計
情報隠蔽の形式としてのオブジェクト指向
両者の統合化(OMG)
1.
2.
3.
Java・・・プログラミング言語
CORBA・・・通信プロトコル
UML・・・モデル記述言語
7.1 オブジェクト指向とは
基本概念
1. 基本構成要素:オブジェクトとメッセージ
1. オブジェクトを唯一の存在として,すべての出来事をオブジェクト同士が
メッセージを送り合うことにより表現する
2. オブジェクトは,メッセージを受けられるように識別を持ち,受信可能なメッ
セージ形式が定義されている
2. 3つの言語機構
1. カプセル化
1. オブジェクトとの振舞いを,起動するメッセージインタフェース(仕様)とそれ
を果たす機能の実現(実装)とに分け,実装を隠す.
2. 抽象データ型
3. クラス
4. インスタンス
5. 具象化
7.1 オブジェクト指向とは
基本概念
2. 3つの言語機構
2. 継承
•
•
•
•
クラス間の関係
単純で抽象的なクラスの特性を,複雑で具体的なクラスに引き継ぐ
汎化・・・同じ性質を持つクラスを抽象クラスに統合する
特殊化・・・汎化の逆
3. ポリモリフェイズ
1. 本来は,型のあるプログラム言語で,型の束縛されずにアルゴリズムを再利
用するための言語理論的構造
2. オブジェクト指向では,メッセージ送信において受信側のオブジェクトが動作
を決定することを指す.
3. 実現のためには,メッセージによって呼出される機能が動的に決まらねばな
らない
7.1 オブジェクト指向とは
基本概念
3. オブジェクト指向によるもの作り
1.特徴
1. オブジェクトを中心に対象世界をモデリングする
2. 高いモジュール性と再利用可能性
2.問題領域の性質に強く依存するので,良いクラス設計を行うには,上流
過程の分析と設計において考慮されねばならない
1. モデリングの統一化・標準化により,開発者間での分析・設計のレビューが容
易になる
2. 仕様書などの中間成果物とプログラムとの間の連続性が確保され,要求や設
計事項の追跡がスムースになり,仕様変更などの後戻りが比較的容易になる
3. オブジェクト指向分析・設計の結果が,オブジェクト指向言語による良いクラス
設計へとつながり,ソフトウェアの再利用性と保守性を高める
分析
設計
プログラミング
7.2 オブジェクト指向分析
1. 分析の目的とオブジェクト指向分析
1. 要求分析
1. 問題領域の理解
1. 実世界の対象物とそれらとの関係を理解
2. ユーザが望むシステムの振舞いを把握
3. 実現する上での制約を明らかにする
2. 問題の解の仕様化
1. 厳密な要求仕様としてまとめ
2. 設計者に渡す
2. オブジェクト指向分析
1. オブジェクト指向のモデリング
1. 「もの」を中心にシステム機能を記述
2. ユーザ要求が表現しやすい→コミュニケーションが高まる
7.2 オブジェクト指向分析
UML(Unified Modeling Language)記法
1.
クラス図
1.
2.
2.
システムをデータの視点から記述
システムが扱う情報構造を表す
ユースケース
1.
2.
3.
システムの機能的な流れを記述
システムの使用イメージを表現
シーケンス図
1.
2.
4.
システムの一機能を実行の視点から記述
システム機能がオブジェクトのメッセージのやり取りによりどのように
達成されるのかを示す
状態図
1.
2.
システムを振舞いの視点から記述
個々のオブジェクトが状態機械としてモデリングされる
7.2 オブジェクト指向分析
クラス図
1. クラス・属性・オペレーション
1. クラス・・・同じ属性,オペレーションを持つインスタンスのグループ
2. 属性・・・クラスに属する各オブジェクトによって保持されるデータ
3. オペレーション・・・クラスに属するオブジェクトが持つ機能,
クラスのインスタンスが他からどのように使われるかを定めるメッセージ
インタフェース
2. 名詞(クラス,属性)と動詞(オペレーション)
1. クラスと属性は相互に混同されやすい
1. クラスは値が同じでも異なるものとして認識されるという意味でアイデンティティ
をもつ,属性はそうではない.
2. 動詞は意味的に曖昧な単語を用いる場合が多い
1. 意味的に複数の機能を統合する動詞(処理する,管理する)
2. 意味的に異なるオペレーションを同じ名前で呼ぶもの(描画色を反転,図形を
反転)
7.2 オブジェクト指向分析
クラス図
3. クラス図
クラス名
飛行機
属性
残燃料
高度:Height
オペレーション
着陸する
離陸する
7.2 オブジェクト指向分析
クラス図
2. 関連・役割・多重度
1.関連・・・クラス間の関係を示す
2.役割・・・相手のクラスを見たときの呼び名
3.多重度・・・2つのクラスの間での他方のインスタンスの数に対する制
約
クラス1
1
*
0..1
関連名
役割1
クラス
役割2
クラス1
厳密に1
ドライバー
クラス
多数(0以上)
クラス
選択(0または1)
車
1
乗客 人
0..3
7.2 オブジェクト指向分析
クラス図
3. 集約・・・部品を表すクラスと,それを用いて組み立てられる
クラスを対応つける関連,関連の特殊なもの
1.
特徴:組立てクラス側の特性が何らかの形で伝播する場合
1.
2.
2.
段落の移動・削除は,構成する文の移動・削除を意味する
車のタイヤの位置は車の位置に依存する
集約関連の記法と例
組立クラス
部品クラス
4輪車
4
1
タイヤ
ハンドル
7.2 オブジェクト指向分析
クラス図
4. 継承・・・2つのモデル化技法である汎化と特殊化を表現
する手段
汎化・・・複数のクラスに共通な特性を持ったクラスを作る
特殊化・・属性やオペレーションの追加や属性間制約の追加
を行うために,新たにクラスを子クラスとして作る
•
•
5.継承関連の記法と例
哺乳類
親クラス
体温を保つ
乳
子クラス1
子クラス2
犬
像
人
7.2 オブジェクト指向分析
ユースケース
セミナー情報システム
4. ユースケース
– ユースケース名
– ユースケースを駆動するアクタ
– 前提条件と事後条件
– 利用手順
– 例外事項 職
員
受講申し込み
受験票受取
個人別成績表受取
科目設定
レポート提出
受講者募集
資格認定申請
受講証発行
資格認定書受取
受
講
者
受講者名簿作成
認定証発行
レポート課題出題
レポート採点
講
師
7.2 オブジェクト指向分析
シーケンス図
1. 1つのユースケースに関する1つのシナリオを,オブジェクト間の
メッセージのやり取りによって表現する図法
2. オブジェクト間のやり取りを時間軸に沿って記述する
3. アクターからのメッセージを契機として,開始してからシステムの
応答が一通り完了するまでを記述する
:客
:オペレータ
電話予約
:呼出
:ディスパッチャ
:タクシー1
:タクシー2
:ドライバ2
呼出登録
最優先タクシー選択
呼出受諾問合せ
タイムアウト
最優先タクシー選択
呼出受諾問合せ
完了
了解ボタン
7.2 オブジェクト指向分析
オブジェクト類型化
6. オブジェクト類型化
1.オブジェクトの見つけ方が難しい
2.概念の抽象化の方法には複数の選択肢がある
3.文法的構造に注目した方法
1. 物理的実態と概念的実態のどちらか
2. 問題文の名詞を候補として,実装に関するものは外すなどのルールを用
いる
4.Jacobsonの類型化方法(エンジニアリング系の例)
1. アクタ
2. 端末
3. 計測・制御対象
4. 情報の塊
5. コントローラ
7.2 オブジェクト指向分析
オブジェクト類型化
6. オブジェクト類型化
(a)アクタ
(a)最初のイベントを起こす役割をもったオブジェクト
(b)システムに外からイベントを与える
(b)端末
(a)分析段階では,端末もオブジェクトとする
(b)インタフェースオブジェクト(ModelViewController-model), 参考:UIMS
(c)計測・制御対象
(a)エンジニアリングシステムでは,計測・制御する実世界オブジェクトをその
目的に合わせて抽象化する
(d)情報の塊
(a)概念・社会的実態として認識される名詞
(b)銀行口座,契約,伝送路,航跡,パケット,など.注文(概念)
(e)コントローラ
(a)当該機能を果たすことを使命とするオブジェクト
7.2 オブジェクト指向分析
モデルの洗練化
7. モデルの洗練化
モデルの整合性:分析段階では,クラス図の作成と,振舞いを表すシーケン
ス図や状態図の作成を交互に進める中で,段階的にブラッシュアップする.
モデルのよしあし:
CRCカード
1.役割・責任:システムが果たすべき機能を記述.協力クラスを記述
2.役割・責任がクラス名にふさわしいか否かをレビューする
1. ハードウェアなどの実在オブジェクトに引きずられてないか
2. その役割・責任を容易に想定できるか
3. 役割同士で異質なものはないか
1.
2.
対策:協力クラスのどれかに渡す
役割・責任を果たす新しいクラスを作る
4. クラスの役割・責任を総括してクラスの定義を行う
7.3 オブジェクト指向設計
1. 設計の目的とオブジェクト指向設計
1.
2.
3.
4.
ソフトウェアアーキテクチャの構築
記述すべき仕様の表現のポイントが異なる
問題を如何にして解決しているかが焦点
種々の設計上の問題と,解決策を示したパターンを与える
1. フレームワーク・・・制御構造を部品とするライブラリ群
2. デザインパターン・・・設計知識をより利用しやすい形としたパターン
3. イディオム・・・特定の言語の特質を生かし有効な使い方を説明している
2. 課題設定と初期モデリング
1. 例:図形エディタ
1. 描画要素は,描画位置を持ち,移動・回転できる
2. 描画要素は,楕円・折れ線・四角がある
3. エディタは,描画要素を保持.ユーザは,エディタを用いて描画要素の生
成・移動・回転・削除ができる
4. 描画要素をまとめてグループ描画要素を作り,他の描画要素を同じよう
に扱うことが出来る
7.3 オブジェクト指向設計
初期モデル
7.3 オブジェクト指向設計
3. デザインパターンの利用
•
•
•
ヘテロで再帰的なデータ構造を扱う
パターン
ファイル構造ではディレクトリ
グループ化された図形では複合図
形
1.
2.
3.
4.
抽象的なノードクラスを作る
抽象ノードから継承して,単純ノードとグループノードを作成する
単純描画要素を継承して,具象クラスを作成する
グループノードは,抽象ノードを束ねるように集約関係を張る
7.3 オブジェクト指向設計
3. デザインパターンの利用
7.4 オブジェクト指向プログラミング
1. カプセル化
型の強いプログラム言語における抽象データ型と等価であるため,カプセル化を
抽象データ型と置き換える.
抽象データ型は,データ型を仕様と実現とに分離する言語構造である.
1. 仕様部:データの使い方を定める
–構文:操作のインタフェース・・・引数の型,戻り値の型
–意味:操作の内容,どのような計算を行うか
2. 実現部:内部機構
–表現:操作を実現するための内部データ構造
–アルゴリズム:操作の実現・・・内部データ構造を使う
–データ型の使用者は,仕様部のみを理解することでデータ型を利用することが出来る
–データ型の開発者は,仕様部に示したデータ型の使用法を変えない限り自由に設計で
きる.
7.4 オブジェクト指向プログラミング
クラス定義
C# によるクラス定義
class クラス名
{
クラスの実装
}
7.4 オブジェクト指向プログラミング
クラス定義
class Sample
{
private int x; private int y; // メンバ変数の定義
public int GetX()
// メソッドの定義
{
return x;
}
public int GetY()
{
return y;
}
public void Set(int a, int b)
{
x = a;
y = b;
}
// メソッドの定義 ここまで
}
7.4 オブジェクト指向プログラミング
複素数を実装する方法
class Complex
{
public double re; // 実部を記憶しておく(外部からの読み出し・書き換えも可能)
public double im; // 虚部を記憶しておく(外部からの読み出し・書き換えも可能)
// 絶対値を取り出す
public double Abs()
{
return Math.Sqrt(re*re + im*im); // Math.Sqrt は平方根を求める数
}
}
7.4 オブジェクト指向プログラミング
クラスの利用
複素数クラスのインスタンスを生成し、利用する
Complex z;
z = new Complex();
// インスタンスを格納するための変数を定義
// new を使ってインスタンスを生成
z.re = 3;
z.im = 4;
double abs = z.Abs();
// 実部の値を変更
// 虚部の値を変更
// z の絶対値を取得
Console.Write("abs = {0}¥n", abs);
// abs = 5 と表示される
Sample
// using System;
// 複素数クラス
class Complex
{
public double re; // 実部
public double im; // 虚部
// 絶対値を返す
public double Abs()
{
return Math.Sqrt(re*re + im*im);
}
// 文字列化する
public override string ToString()
{
if(im >0)
return re + "+i" + im;
if(im < 0)
return re + "-i" + (-im);
return re.ToString();
}
}
// class Complex
Sample(continued)
class ClassSample
// 「関数」のところで作った実数入力用関数
{
static double GetDouble(string message)
public static void Main()
{
double x; while(true)
{
{
Complex z = new Complex();
try
z.re = GetDouble("実部を入力してください : ");
{ // 入力を促すメッセージを表示して、値を入力してもらう
z.im = GetDouble("虚部を入力してください : ");
Console.Write(message);
Console.Write(“|{0}| = {1}¥n”, z, z.Abs());
x = double.Parse(Console.ReadLine());
}
}
catch(Exception)
{ // 不正な入力が行われた場合の処理
Console.Write( "error : 正しい値が入力されませんでした¥n
入力しなおしてください¥n");
continue;
}
break;
}
return x;
}
}
7.4 オブジェクト指向プログラミング
MVC-model
7.4 オブジェクト指向プログラミング
MVC-mopdelを UMLで書く