SlideShare a Scribd company logo
1 of 57
凡人の
凡人による
凡人のための
デザインパターン
第一幕
黒澤 慎太郎
自己紹介
• 僕らはみんな生きている
• あなたの心の中のようじょ
なぜデザインパターン
は
失敗するのか?
失敗例
• 「どう使っていいのかわからない」
• 「そんなものなくても動く」
• 「無駄じゃね?」
• 「パターン適用したコードが読みづらい」
狙い
• デザインパターンの意義を知る
• GoFデザインパターンの分類を知る
• Factory Methodパターンを知る
• AbstractFactoryパターンを知る
• デザインパターンの注意点を知る
デザインパターンとは
何か?
–Wikipediaより
“様々なプログラムで再利用できる
汎用的な設計パターンのことです”
わからなくても
今は気にしない
デザインパターンの
意義を知る
デザインパターンとは
• 何度も遭遇する似たような問題に対する解法
GoFデザインパターン
の
分類を知る
GoFとは
Gang of Four
• ある4人が基本的なデザインパターンを23種類にまとめた
• エーリッヒ・ガンマ
• リチャード・ヘルム
• ラルフ・ジョンソン
• ジョン・ブリシディーズ
• そのため、GoF(4人組)のデザインパターンと呼ばれる
• 日本的に言えば「四天王」みたいなニュアンスか?
GoFのデザインパターン
の
分類
目的
生成 構造 振る舞い
範囲
クラス
Factory
Method
Adapter
Interpreter
etc...
オブジェクト
Abstract
Factory
etc...
Bridge
etc...
Command
tec...
目的と範囲
• GoFは、目的と範囲で分類される
• 目的とは、パターンが何をするかを示す
• 範囲とは、主に適用されるのが何かを規定する
目的による分類
• 目的には、生成、構造、振る舞いがある
• 生成は、オブジェクト生成のプロセスを扱う
• 構造はクラスまたはオブジェクトの構成を扱う
• 振る舞いは、クラスあるいはオブジェクト間の
通信方法を特徴付る
範囲による分類
• 範囲にはクラスまたはオブジェクトがある
• クラスパターンはクラスとサブクラス間の関連
• オブジェクトパターンは、オブジェクト間の関
連を扱う
大抵は
さらっと
流される
「分類」ですが
実は重要です
この分類についてよく考える
と
GoFのパターンが
何のためにまとめられたのか
知ることができる
目的による分類
• デザインパターンの目的は、もちろん3つだけ
ではない。
• 並行処理のパターン
• 分散プログラミングのパターン
• ドメイン依存のパターン
GoFの目的は
• GoFが分類しているのは、「生成」「構造」「
振る舞い」の三つ
• これらは、オブジェクト指向プログラミングを
する上で、必ず考えなければならない。
• よってGoFは、最もよく使う、基本的なパター
ンがまとめられているということ
「生成」
• オブジェクトは、必ず「生成」される
• 設計上において、必ず考えなければならない責
務の一つ
• 「どうやってオブジェクトを生成するか?」と
いう問題に対するパターン
「構造」
• オブジェクトは、必ず他のオブジェクトと組み
合わせて利用される。
• オブジェクト指向プログラミングで、一つのオ
ブジェクトだけで完結するアプリケーションは
ほぼありえない。
• 「どうやって組み合わせるか?」という問題に
対するパターン
「振る舞い」
• オブジェクトは、必ず他のオブジェクトとやりとり
をする
• オブジェクト指向プログラミングにおいて、「振る
舞い」が存在しないアプリケーションはありえない
。(メソッドが一つも存在しないアプリケーション
はありえない)
• 「どうやってオブジェクトに振る舞いをさせるか?
」という問題に対するパターン
範囲による分類
• 範囲は、パターンが何に影響するかを規定する
• つまり、問題を解決するために「何を使うか」
を規定すると思って良い。
「クラス」の範囲
• 問題を解決するために、「クラス」を利用する
• つまりオブジェクト指向の「継承」を利用する
• 静的とも言える
「オブジェクト」の範囲
• 問題を解決するために、「オブジェクト」を利用
する
• つまり、あるオブジェクトの問題を解決するため
に、他のオブジェクトを利用することになる
• オブジェクト指向の「メッセージ」を利用するこ
とになる(平たく言うとメソッドなど)
• 動的と言える
例えば
• 「生成」のクラスパターンは、「生成」を継承
先のサブクラスに任せる
• 「生成」のオブジェクトパターンは、「生成」
を他のオブジェクトに任せる
Factory Method
Creator
FactoryMethod()
OnOperation()
Concrete Creator
FactoryMethod()
Product
Concrete Product
生成
生成
継承 実装
OnOperationがFactoryMethodを利用
Abstract Factory
Abstract Factory
Abstract Product
Client
Concrete Factory
Concrete Product
実装
実装
利用
生成生成
2つのパターンの違い
Factory Method
• Factory Methodは、Productを生成したオブジェ
クトがそのままProductを利用する。
• つまり、Factory Methodを持つオブジェクトは
、Factory Methodのクライアントでもある。
• よって、「クラス範囲」に分類されるパターン
AbstractFactory
• Abstract Factoryは、生成したProductを利用する
クライアントが、別のオブジェクトとして存在
する。
• つまり、Abstract Factoryとは別のオブジェクト
が存在する。
• よって、「オブジェクト範囲」のパターン
Factory Methodの利点
• 以下の場合に有効
• Creatorが、生成しなければならないオブジェ
クトを事前に知ることができない場合
• サブクラスに責任を集中させたい場合
Abstract Factoryの利点
• 以下の場合に有効
• 部品の集合が複数存在し、かつ、組み合わせを
選ぶ場合
• インターフェースは公開しておきたいが、実装
は非公開にしたい場合
• システムを、「部品の生成ルール」や「組み合
わせのルール」などから独立させたい場合
これらのパターンは
どう便利なのか
デザインパターンを
適用する目的
• デザインパターンは、「何度も遭遇する似たよ
うな問題に対する解法」
• では、「生成」が解決しようとしている問題と
は何か
オブジェクト生成の
複雑さ
オブジェクト生成の複雑さ
• 例えば、「車」というオブジェクトを生成する
のは複雑とする。
• 「車」は、「エンジン」「タイヤ」「エアバッ
ク」など’、様々な部品から成り立つ。
• 「車」というオブジェクトを生成するとき、「
これらをどう組み合わせるか?」と問題になる
複雑な生成
車
エンジン
タイヤ
ハンドル
鉄
ガソリン
etc…etc…
ゴム
これはデザインパターン
が
浸透しない理由の一つ
デザインパターンは、
適切にモデル化されている
必要がある
開発の流れ
• まずは、要求仕様を明確にする
• その後、モデル化する
• モデルを忠実に設計する
• 実装を考慮した設計を加える
• コーディング
望ましくない開発の流れ
• まずは、要求仕様を明確にする
• コーディング
つまり、
オブジェクト指向プログラミングが
できない環境では
デザインパターンは意味がない
デザインパターンで
コードを共有する前に
モデルを共有しなければならない
オブジェクト指向
• 目的を達成するための手段(考え方)の一つ。
• 目的を達成するために、解決すべき問題をオブ
ジェクトとして捉え、定義し、用いる。
目的を達成するために、
解決すべき問題を
オブジェクトとして
捉え、
定義し、
用いる。
デザインパターンの再利
用
• デザインパターンは、再利用する部品を「オブジェ
クト指向」として提供する。
• オブジェクト指向でないのであれば、デザインパタ
ーンでの再利用がそもそも不可。
• つまり、デザインパターンを適用した素晴らしいコ
ードも、「オブジェクト」という概念を共有するこ
とができず、「なんだこの変なコードは」と言われ
て終わる。
デザインパターンの
注意点
注意点
• むやみやたらにデザインパターンを適用すべき
ではない
• 全てのオブジェクト生成にFactory Method等を
適用すると大変なことになる(経験談
• 「複雑なこと」を、ちょっとマシにするために
、「まだマシと言える複雑なこと」をするのが
、デザインパターン
まとめ
まとめ
• デザインパターンの分類
• Factory MethodとAbstract Factory
• デザインパターンとオブジェクト指向
• 「コードにこだわり()のある人」として言われて
も負けない強い心
ご静聴ありがとう
ございました

More Related Content

What's hot

オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
Kota Mizushima
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
 

What's hot (20)

Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうPython 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則現場で役立つシステム設計の原則
現場で役立つシステム設計の原則
 
テストを書こう、Unity編
テストを書こう、Unity編テストを書こう、Unity編
テストを書こう、Unity編
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
テスト駆動開発のはじめ方
テスト駆動開発のはじめ方テスト駆動開発のはじめ方
テスト駆動開発のはじめ方
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
OSS強化学習フレームワークの比較
OSS強化学習フレームワークの比較OSS強化学習フレームワークの比較
OSS強化学習フレームワークの比較
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
工学系大学4年生のための論文の読み方
工学系大学4年生のための論文の読み方工学系大学4年生のための論文の読み方
工学系大学4年生のための論文の読み方
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 

Similar to 凡人の凡人による凡人のためのデザインパターン第一幕 Public

PFPファシグラ(2009/07/03)
PFPファシグラ(2009/07/03)PFPファシグラ(2009/07/03)
PFPファシグラ(2009/07/03)
nishikawa_makoto7
 

Similar to 凡人の凡人による凡人のためのデザインパターン第一幕 Public (10)

パスワードシステムのデザインパターン作成(Janog用)
パスワードシステムのデザインパターン作成(Janog用)パスワードシステムのデザインパターン作成(Janog用)
パスワードシステムのデザインパターン作成(Janog用)
 
ビジネスReモデル 3
ビジネスReモデル 3ビジネスReモデル 3
ビジネスReモデル 3
 
PFPファシグラ(2009/07/03)
PFPファシグラ(2009/07/03)PFPファシグラ(2009/07/03)
PFPファシグラ(2009/07/03)
 
ノンデザイナー向けデザイン思考《準備編》
ノンデザイナー向けデザイン思考《準備編》ノンデザイナー向けデザイン思考《準備編》
ノンデザイナー向けデザイン思考《準備編》
 
Vi Boot Camp #1
Vi Boot Camp #1Vi Boot Camp #1
Vi Boot Camp #1
 
議論を描く技術「ファシリテーショングラフィック」
議論を描く技術「ファシリテーショングラフィック」議論を描く技術「ファシリテーショングラフィック」
議論を描く技術「ファシリテーショングラフィック」
 
casualにRubyをパースしてみたい
casualにRubyをパースしてみたいcasualにRubyをパースしてみたい
casualにRubyをパースしてみたい
 
UIの色のコントラスト比十分ですか?
UIの色のコントラスト比十分ですか?UIの色のコントラスト比十分ですか?
UIの色のコントラスト比十分ですか?
 
エンジニア向け即効デザイン講座
エンジニア向け即効デザイン講座エンジニア向け即効デザイン講座
エンジニア向け即効デザイン講座
 
10+1 Things you should know about JavaScript testing
10+1 Things you should know about JavaScript testing10+1 Things you should know about JavaScript testing
10+1 Things you should know about JavaScript testing
 

凡人の凡人による凡人のためのデザインパターン第一幕 Public