Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
7章:オブジェクト指向
オブジェクト指向とは
オブジェクト指向分析
オブジェクト指向設計
オブジェクト指向プログラミング
もの作りにおける進化
7.1 オブジェクト指向とは歴史的流れ
1. 実世界のモデリング
1. シミュレーション言語:SIMULA,Smalltalk2. モデル化記述:フレーム理論,初期のオブジェクト指向分析
2. プログラム構成法
1. 構造化設計
2. 情報隠蔽の形式としてのオブジェクト指向
3. 両者の統合化(OMG)1. Java・・・プログラミング言語2. CORBA・・・通信プロトコル3. 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関連名
役割1 役割2
クラス1
クラス*
クラス0..1
厳密に1
多数(0以上)
選択(0または1)
車 人
ドライバー
乗客1
0..3
7.2 オブジェクト指向分析クラス図
3. 集約・・・部品を表すクラスと,それを用いて組み立てられるクラスを対応つける関連,関連の特殊なもの
1. 特徴:組立てクラス側の特性が何らかの形で伝播する場合1. 段落の移動・削除は,構成する文の移動・削除を意味する
2. 車のタイヤの位置は車の位置に依存する
2. 集約関連の記法と例
組立クラス 部品クラス
4輪車 タイヤ
ハンドル
4
1
7.2 オブジェクト指向分析クラス図
4. 継承・・・2つのモデル化技法である汎化と特殊化を表現する手段
• 汎化・・・複数のクラスに共通な特性を持ったクラスを作る
• 特殊化・・属性やオペレーションの追加や属性間制約の追加を行うために,新たにクラスを子クラスとして作る
5.継承関連の記法と例
親クラス
子クラス2子クラス1
哺乳類
体温を保つ乳
犬 人像
セミナー情報システム
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 と表示される
// 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
Sample(continued)
class ClassSample{
public static void Main() {
Complex z = new Complex(); z.re = GetDouble("実部を入力してください : "); z.im = GetDouble("虚部を入力してください : "); Console.Write(“|{0}| = {1}¥n”, z, z.Abs());
}
// 「関数」のところで作った実数入力用関数static double GetDouble(string message) {
double x; while(true) {
try { // 入力を促すメッセージを表示して、値を入力してもらう
Console.Write(message); 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で書く