@yoshitaro-yoyo 2022/09/03
デザインパターン⼊⾨とオブジェクト指向
エンジニア前
2021年11月


      


2022年8月




@yoshitaro-yoyo


薬局店長・臨床工学技士・せどり・スクール講師


大阪の受託開発企業


大阪の自社開発のSES部門


エンジニアの輪・京都プログラミング教室運営メンバー


ストリートダンス・音楽・バイク・映画・漫画・料理好き
yoshitaro
1.デザインパターンとは?
2.デザインパターンの注意点
3.現代のデザインパターンの立ち位置
4.デザインパターンが『僕に』教えてくれたこと
1.オブジェクト指向について
2.本当の再利用の視点
デザインパターン⼊⾨とオブジェクト指向
1. デザインパターンとは?
繰り返し現れる解決策・設計に
名前を与えて、形式知にしたもの
パターンとは「型、類型、様式、繰り返される模様」
書籍
『オブジェクト指向に
おける再利用のための
デザインパターン』
1995年出版
Erich Gamma, Richard Helm,
Ralph Johnson, John Vlissides
通称 Gang of Four:GoF
Template Method Pattern
共通な処理(処理順序)
場合で異なる具体的な処理内容
分離したデザインパターン
public abstract class AbstractDisplay {
//サブクラスに実装をまかせる抽象メソッド
public abstract void displayHeader();
public abstract void displayBody();
public abstract void displayFooter();
// AbstractDisplayで実装してるメソッド
public final void display() {
displayHeader();
for (int i = 0; i < 5; i++) {
displayBody();
}
displayFooter();
}
}
繰り返し現れる解決策・設計に
名前を与えて、形式知にしたもの
パターンとは「型、類型、様式、繰り返される模様」
パターンは再利用される
パターンとは「型、類型、様式、繰り返される模様」
• Abstract Pattern (AbstractClass )


• Template Method Pattern ( Abstract )


• Factory Method Pattern ( TemplateMethod )


• Dependency Injection Pattern ( FactoryMethod )
パターンの中に別のパターンが存在する
パターンを知る人には
「パターン名」を伝えるだけで
設計意図が伝わる
解決したい課題を、効率良く相手に伝える為の語彙でもある
2. デザインパターンの注意点
1995年
当時、Javaはリリース前(1996年)
2層アーキテクチャ全盛時代
C++での開発上の課題のソリューションとしての側面が強かった
つまり
現代にそのまま
当て嵌まるわけではない
15年後
GoFにより再定義
変更
 Core:最 使⽤ 重要
 Creational:⽣成 関
 Peripheral: 使
 Other: 他
変更(1):Factory Method Factory ⼀般化
新規追加(4):Null Object, Type Object, Dependency Injection, Extension Object/Interface
削除(6):Singleton, Adapter, Bridge, Chain of Responsibility, Memento, Observer
格下 :Flyweight, Interpreter
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaa
3. 現代のデザインパターンの立ち位置
GoFデザインパターン
当時の立ち位置
変更容易性を
『設計によって実現するため』
の見本としてのデザインパターン
変更に強い構造の設計を行うための見本
GoFデザインパターン
現在の立ち位置
リファクタリングに
『方向性・ターゲット・語彙』
を与えるための良いサンプル
リファクタリングの方向性としての見本(自動テストが前提)
4. デザインパターンが
『僕に』教えてくれたこと
①オブジェクト指向についてわかったこと
1. 保守コスト削減に焦点を当てた設計手法
2. 『不変を軸に、可変であろう箇所をクラスに抽出する』ことを想定
3. よくみる動物でオブジェクト指向を説明するのまじ無駄
1.
保守コスト削減に
焦点を当てた設計手法
(逆に開発コストが高い)
変更容易性
(内部・外部)
機能追加時の影響が少ない
影響範囲の特定し易さ
修正・機能追加のし易さ
データ抽象化・情報隠蔽・再利用
2.
不変を軸に
可変であろう箇所を
クラスに抽出する
分かり易いのは不変の抽出
こちらから話します
不変の抽出
処理の固まり三つ
それぞれの処理の中で
共通の処理が濃いグレーの部分
赤はそれぞれの中で
処理が異なる部分
可変な処理
不変な処理
可変な処理
不変な処理
重複箇所を括り上げる
抽出された
不変な処理
可変な処理
抽出された
不変な処理
可変な処理
継承
抽出された
不変な処理
可変な処理
継承
複数のクラスにおいて
何度も現れる重複部分を
「共通の処理」「不変な部分」
として抽出。サブクラスは
「可変(変更されやすい)」
処理を表現する場所
では次は可変を抽出
処
理
の
流
れ
不変な処理
可変な処理
不変な処理
処
理
の
流
れ
不変な処理 可変な処理を抽出
して抽象化する
可変な処理
不変な処理
処
理
の
流
れ
不変な処理 可変な処理を抽出
して抽象化する
(interface / abstract)
不変な処理
可変を外部に
抽出!!
処
理
の
流
れ
不変な処理 可変な処理を抽出
して抽象化する
(interface / abstract)
不変な処理
抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)
可変な処理を抽出
して抽象化する
(interface / abstract)
抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)


処
理
の
流
れ
不変な処理
不変な処理
可変が消えて
不変が残り
安定化!!
単体で⾒れば
具象クラス達は
安定している!
可変な処理を抽出
して抽象化する
(interface / abstract)
新しい処理は


クラス追加
で実現する
抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)


処
理
の
流
れ
不変な処理
不変な処理
可変な処理を抽出
して抽象化する
(interface / abstract)
抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)


処
理
の
流
れ
不変な処理
不変な処理
3.
動物でオブジェクト指向
の説明まじ無駄
・不⼗分!
・不正確!!
・不適当!!!
・ !!
・理解 !!
・親 神 !!!
理由
継承をフィーチャーすな!
※ Golang / Rust には継承自体ない
継承
ポリモーフィズム
カプセル化
(データ抽象化・情報隠蔽)
抽象化
オブジェクトとは
機能に必要な
関数とデータの(最小)単位
それ以上でも以下でもない
オブジェクト指向についてわかったこと
・継承 委譲( )
・具象 (抽象)
・「変更 部分」 「変更 部分」 分離
・ 指向 本質的 再利⽤性 提⽰
デザインパターンが教えてくれたこと
本当の意味での再利用とは
差分 実装
再利⽤ 、
利⽤側 再利⽤
抽出された
不変な処理
可変な処理
継承
複数のクラスにおいて
何度も現れる重複部分を
「共通の処理」「不変な部分」
として抽出。サブクラスは
「可変(変更されやすい)」
処理を表現する場所
差分 実装
再利⽤ 、
利⽤側 再利⽤
処
理
の
流
れ
不変な処理 可変な処理を抽出
して抽象化する
(interface / abstract)
不変な処理
不変な処理
抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)


抽象化処理
の具象化
(implements /
extends)


可変な処理が
不変な処理に!
まとめ
・ 指向 ⽬標 「変更容易性」
・ 変更 強 構造
・ 使 注意 必要
・現代 ⽅向性
・継承 委譲
・具象 (抽象)
・ 指向 本質的 再利⽤性 提⽰
・「変更 部分」 「変更 部分」 分離
デザインパターンが教えてくれたこと
ご静聴
ありがとうございました

Introduction to Design Patterns_and_Object_Orientation.pdf