11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS.

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
復習ー I (General Review I) クラスとオブジェクトの概念 Concepts of class and object クラスの宣言とオブジェクトの生成 Definition of a class and creation of an object コンストラクタとメソッドのオーバーロー.
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
アルゴリズムとプログラミング (Algorithms and Programming)
Applet 岡部 祐典 鈴木 敬幸.
プログラミング基礎I(再) 山元進.
第5回 iPhoneアプリ開発勉強会 Objective-C 「継承とクラス」
アルゴリズムとデータ構造1 2007年6月12日
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
独習Java ・ 10.6  Hashtableクラス ・ 10.7  String Tokenizerクラス  12月12日    小笠原 一恵.
オブジェクト指向プログラミング(2) OOPの三大要素 「クラス」「ポリモーフィズム」「継承」
CHAPTER1 UMLとオブジェクト指向の基本概念(2)
アルゴリズムとプログラミング (Algorithms and Programming)
社会人学習講座 「Javaプログラミング概論」
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
第20章 Flyweight ~同じものを共有して無駄をなくす~
Bridge Pattern
オブジェクト指向入門.
計算機プログラミングI 第8回 2002年12月5日(木) メソッドとクラス (教科書6章) クイズ インスタンスメソッド インスタンス変数
CONCURRENT PROGRAMMING
RMI ソフトウェア特論 第6回 /
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
~手続き指向からオブジェクト指向へ[Ⅱ]~
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
変数のスコープ クラス クラス変数 すべてのメソッドの外側でstaticで定義
ソフトウェア工学 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
第7回独習Javaゼミ セクション 1~4 発表者 直江 宗紀.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
第6回 2007年6月1日 応用Java (Java/XML).
第11週:super/subクラス、継承性、メソッド再定義
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
Collection, Generics, Iterator
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
C#プログラミング実習 第3回.
サブゼミ第7回 実装編① オブジェクト型とキャスト.
ソフトウェア制作論 平成30年11月28日.
ソフトウェア工学 知能情報学部 新田直也.
ソフトウェア工学 理工学部 情報システム工学科 新田直也.
ロールを基にした構造進化の表現 Role based Evolution Dependency Structure Matrix
クラスの追加 メソッドの追加 TestCaseの追加 Test Methodの追加.
ソフトウェア工学 知能情報学部 新田直也.
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
コードクローン解析に基づく デザインパターン適用候補の検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS

デザインパターンとは? デザインパターン ■各デザインパターンの主な内容 デザインパターン  過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して,       ノウハウを蓄積し、名前をつけ、再利用しやすいようにカタログ化したもの ■各デザインパターンの主な内容 そのデザインパターンの目的と効果 どのような役割の部品(クラス,インタフェース)が必要か それらの部品をどのように組み立てるか 個々の部品がどのように関連して大きな機能を果たすのか

デザインパターンの例 Factory Method ■生成に関するパターン Singleton Adapter Facade スーパークラスでインスタンスの作り方を抽象的に定め,具体的な作成はサブクラスにまかせる Singleton クラスのインスタンスが一つしかないことを保証する ■構造に関するパターン Adapter 異なるインタフェースをもつ2つのクラスを接続するクラスを作る Facade 複数のサブシステムの窓口となる共通のインタフェースを提供してシステムをシンプルにする ■振る舞いに関するパターン Iterator 複数の要素をもつ集合体の要素を1つ1つ順番にアクセスする方法を提供する Template Method 必要な処理の一部をテンプレートとして抽象的に記述し,その具体的内容(カスタマイズ)をサブクラスにまかせる Observer 状態が変化するクラスと,その変化を通知してもらうクラスを分けて設計する 今回の授業では,Template Methodパターン と Adapterパターン を具体的に学び, Factory Methodパターンの調査を演習課題とする

Template Method パターン 必要な処理の一部をテンプレートとして抽象的に記述し,その具体的内容 (カスタマイズ)をサブクラスにまかせる. いろいろな人がカスタマイズを考案し,それを簡単に実装できる.

テンプレートの概念 抽象カード printCard( ){ … } printCenter( ); 祝 誕生! 実装2 実装1 具体カード 枠組みはテンプレートで実装済み (テンプレート) 処理の枠組み(framework)を定め,細部は利用者が カスタマイズできる printCenter( ); 抽象メソッドは未実装 (カスタマイズ可能な部分) 祝 誕生! printCenter() { 文字列をプリント } 実装2 printCenter() { 画像をプリント } 実装1 具体カード 利用者1 利用者2

テンプレートのデザイン AbstractCard printCard printFrame printCenter ImageCard 抽象カード AbstractCard printCard printFrame printCenter テンプレート (スーパクラス) テンプレートメソッド 抽象メソッド extends ImageCard image: Image printCenter (サブクラス) 具体カード StringCard string: String printCenter 実装 実装

AbstractCard クラス AbstractCard printCard printFrame printCenter 【Javaによる記述】 抽象クラス public abstract class AbstractCard { public void printCard(Graphics g) { printFrame(g); printCenter(g); } public void printFrame(Graphics g) { 〈省略〉 // g を使って枠を表示する高品質のプログラム public abstract void printCenter(Graphics g); テンプレートメソッド 抽象メソッド

StringCardクラス StringCard string: String printCenter サブクラスの定義 public class StringCard extends AbstractCard{ private String string; public StringCard(String str) { string = str; } public void printCenter(Graphics g) { g.drawString(string, 140, 70); コンストラクタ (140, 70) は表示する位置の x-y座標

ImageCardクラス ImageCard image: Image printCenter サブクラスの定義 public class ImageCard extends AbstractCard{ private Image image; public ImageCard(Image img) { image = img; } public void printCenter(Graphics g) { g.drawImage(image, 140, 70); コンストラクタ (実際にはもう少し複雑な実装となる)

AbstractCard printCard(g) printFrame(g) printCenter(g) 利用のしかた 利用者 uses ImageCard image: Image printCenter(g) StringCard string: String printCenter(g) public void printTwoCards(Graphics g, Image img, String str) { AbstractCard cardholder[2]; cardholder[0] = new ImageCard(img); cardholder[1] = new StringCard(str); for(int i=0; i<2; i++) { cardholder[i].printCard(g); } AbstractCard が規定する統一的なインタフェース

ホットスポット AbstractCard abstract superclass concrete subclass 高度なサービス内容が書かれているが,このままでは動かない ニーズに合わせて簡単にカスタマイズ済みであり,このままで動く printCard template method(サービス) printFrame printCenter abstract method concrete method hot spot implementation (カスタマイズ)

Template Method パターン 【Template Method パターン】 一般化すると,つぎのデザインパターンが得られる AbstractClass templateMethod primitiveOperation1 primitiveOperation2 ●AbstractClass   - 抽象メソッド primitiveOperations を定義し   - それを使い,アルゴリズムの枠組みを定義する     templateMethod を実装 ●ConcreteClass   - この具体クラス特有の処理を実行するように     primitiveOperations を実装 ConcreteClass primitiveOperation1 primitiveOperation2

Template Methodパターンのありがたみ システムプラグラマが作成 【システムプラグラマの立場からのありがたみ】 AbstractCard printCard(g) printFrame(g) printCenter(g) printCenterのインタフェースだけをアプリプログラマ に示せばよく, printCardとprintFrameのソースコー ドを公開しなくてよい すべてのアプリに影響を与えずに,printCardと printFrameの実装の修正が可能 【アプリケーションプラグラマの立場からのありがたみ】 printCardとprintFrameのコードを修正することなく, printCenterのみを実装すればよい ImageCardもStringCardもAbstractCardの一種なので, その統一的なインタフェース(API)であるprintCardを利 用してアプリを作成可能 ImageCard image: Image printCenter(g) StringCard string: String printCenter(g) 異なるアプリプラグラマが作成

Adapter パターン 異なるインタフェースをもつ2つのクラスを接続する. 開発するシステムのインタフェースを変えずに,外部のいろいろな インタフェースに接続できる.

アダプターの概念 USB GamePrinter string printUSB printGame USBクラス 【例】 利用者 GamePrinter printGame アダプター 2つの異なるインタフェース(クラス)が固定されていて変更できないとき,両者を接続するクラス 抽象メソッド 【提供されているもの】   USBクラスがプリンタメーカーから提供済. usb.printUSB( ) により string を印字可. 【欲しいもの】   GamePrinterクラスのprintGame抽象メソッドを実装したクラス(アダプター). (それにより,gamePrinter.printGame( ) によって string を印字できるようになる.)

委譲を使うデザイン(1/4) USBAdapter USB GamePrinter string printUSB printGame ? (delegation) アダプタークラス USBクラス USBAdapter ? USB string printUSB GamePrinterクラス 利用者 GamePrinter printGame public class USB { private String string; public USB(String str) {..} public void printUSB() } 実際にはクラスファイルのみ提供 public abstract class GamePrinter { public abstract void printGame( ); } 利用者に対して USB が隠されている public static void main(String[ ] args) { GamePrinter gp = new USBAdapter(”You win!”); gp.printGame( ); } ※ USBAdapter は,GamePrinterでもある

委譲を使うデザイン(2/4) GamePrinter printGame USB string printUSB USBAdapter 利用者 uses GamePrinter printGame USB string printUSB extends 継承 スーパークラス サブクラス has a USBAdapter printGame usb: USB 委 譲 (delegation) usb.printUSB( ) ※ USBAdapter は,GamePrinterでもある

委譲を使うデザイン(3/4) GamePrinter USBAdapter USB string printUSB printGame extends uses GamePrinter printGame USBAdapter printGame USB string printUSB 利用者 has a usb: USB public class USBAdapter extends GamePrinter { private USB usb; public USBAdapter(String str) { usb = new USB(str); } public void printGame() { usb.printUSB(); コンストラクタ                                  委 譲

委譲を使うデザイン(4/4) Adapter Target Adaptee specificRequest request request 一般化すると,つぎのデザインパターンが得られる 【Adaperパターン】 ●Client: Target オブジェクトを利用する ●Target: Client が使用できる特定のインタフェースを規定する ●Adaptee: 適合させたい既存のインタフェースをもつ実装 ●Adapter: Adaptee のインタフェースを Target のインタフェースに適合させる 依頼者 対象 アダプター 適合される側 extends Client uses Target request Adapter request Adaptee specificRequest has a adaptee 委 譲 adaptee.specificRequest()

Adapterパターンのありがたみ(1/2) 【アプリケーションプラグラマの立場からのありがたみ】 GamePrinterとUSBのソースコードを修正することなく, 利用者から見たインタフェース(printGame)を変えずにUSBAdapterを作成可能 USB以外との様々なAdapterを実装したとき,どれもGamePrinterの一種なので, 利用者は統一的なインタフェース(API)printGameを利用してアプリを作成可能 extends uses GamePrinter printGame USBAdapter printGame USB string printUSB 利用者 has a usb: USB 異なるシステムプラグラマが作成 異なるアプリプラグラマが作成

Adapterパターンのありがたみ(2/2) 【システムプラグラマの立場からのありがたみ】 利用者と GamePrinter に影響を与えずに USB (printUSB)の実装を変更可能 アプリプログラマに GamePrinter と USB のソースコードを公開しなくてもよい extends uses GamePrinter printGame USBAdapter printGame USB string printUSB 利用者 has a usb: USB 異なるシステムプラグラマが作成 異なるアプリプラグラマが作成

演習問題 11 Factory Method パターンについて調べ,概略を説明し,パターンの構造を図示しなさい.