Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
オブジェクト指向設計原則から学ぶアプリケーション設計(SOLID原則についてのまとめ)
Search
Takahito Hashimoto
October 12, 2018
8
3.6k
オブジェクト指向設計原則から学ぶアプリケーション設計(SOLID原則についてのまとめ)
Takahito Hashimoto
October 12, 2018
Tweet
Share
More Decks by Takahito Hashimoto
See All by Takahito Hashimoto
Webエンジニア超入門!
mosmos21
0
290
OSSのライセンスを知ろう
mosmos21
0
170
今日から始めるVue.js
mosmos21
0
220
ゼロから始める競技プログラミング
mosmos21
0
250
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Building Your Own Lightsaber
phodgson
103
6.1k
We Have a Design System, Now What?
morganepeng
51
7.3k
The Pragmatic Product Professional
lauravandoore
32
6.3k
Designing Experiences People Love
moore
138
23k
RailsConf 2023
tenderlove
29
940
Thoughts on Productivity
jonyablonski
67
4.4k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Scaling GitHub
holman
458
140k
Transcript
オブジェクト指向設計原則から 学ぶアプリケーション設計 サポーターズColab勉強会 2018/11/14 @mosmos_21
目次 1. はじめに 2. ソフトウェア設計についての概要 3. オブジェクト指向設計原則の5個の原則 4. その他原則に関すること 5.
まとめ 1
1. はじめに 自己紹介とか 2
自己紹介 【氏名】 橋本 尚儒(はしもと たかひと) 【Twitter】 もっさん @mosmos_21 【職業】 ソフトウェアエンジニア(自社製品)
Java/Spring + javascript/AngularJS 【趣味】 競技プログラミング ビリヤード 3
今日話すこと • SOLID原則の話 • ソフトウェア設計に役立つ原則の紹介 4
今日話さないこと • オブジェクト指向とは何か • デザインパターンの詳しい話 注意 • コード例はJavaです 5
こんな人が対象 6 • 何となくオブジェクト指向分かった気がするけどアプリ ケーション作れない人 • デザインパターンの勉強をしたけど実際にアプリにうま く組み込めない人
対象じゃない人 7 • オブジェクト指向の本質が理解できている人 • SOLID原則を完全に理解している人
2. ソフトウェア設計についての概要 オブジェクト指向 + α の話 8
オブジェクト指向についてのおさらい • オブジェクト同士の相互作用としてシステムのふるまいをとら える考え方(Wikipediaより) • 基本的な考え方はオブジェクト同士のメッセージのやり取り • カプセル化、継承、ポリモーフィズムなどの考え方がある 9
オブジェクト指向についてのおさらい • カプセル化 データのアクセスを直接させない 状態の変更に制約を課すことでオブジェクトの正当性を保証する • 継承 上位オブジェクトの「ふるまい」を受け継ぐ • ポリモーフィズム
オブジェクトではなく「ふるまい」そのものに注目して、処理を記 述する 10
デザインパターンについてのおさらい • ソフトウェア設計における設計のノウハウをまとめたもの (全部で23パターン) • 生成に関するパターン、構造に関するパターン、ふるまいに関 するパターンに分類することができる • 再利用性の高い設計がしやすかったり、技術者同士の意思疎通 が取りやすくなったりする
11
アプリケーションの設計方針 アプリケーションを作るときにどのように設計しますか? • オブジェクト指向? • デザインパターン? • MVC?3層アーキテクチャ? その設計、拡張性や保守性は高いですか? 12
何とか設計できても… • ソフトウェア全体を見た時に変更に弱くなっている • ただ、一部分に関してみるとうまく設計できている ↓ デザインパターンはソフトウェア設計の どの部分のための設計手法でしょうか? 13
3. オブジェクト指向設計原則の 5個の原則について SOLID原則の話 14
SOLID原則とは 1 SRP 単一責任の原則 2 OCP オープン・クローズドの原則 3 LSP リスコフの置換原則
4 ISP インターフェース分離の原則 5 DIP 依存関係逆転の原則 アプリケーションの再利用性、保守性を高くするために必要な設計 の考え方を5個の原則としてまとめた 15
SOLID原則に従うことのメリット 16 • 拡張性が向上する • メンテナンスがしやすくなる • テストのしやすさ • 統制された構造を持つため、読みやすく理解のしやすい
3.1. 単一責任の原則 Single Responsibility Principle 17
単一責任の原則 すべてのオブジェクトはたった一つの 物事に対して責任を持つ必要がある ↓ 複数の物事に対して責任を持っていると、 変更に対する柔軟性が保てなくなる 18
単一責任の原則 <オブジェクトA> <オブジェクトB> 責任が複数ある状態とは? <オブジェクト> ふるまい1 ふるまい2 ふるまい2の動作が変わると二つのオブジェクトに影響が及ぶ … 19
単一責任の原則 <人事部> <営業部> <社員> 労働時間の更新 業務ランクの計算 … 例)社員情報を 管理するシステム •
人事部で使う業務ランクの計算 方法が変更になる • 開発者は営業部から利用されて いることに気づかずふるまいを 変更 営業部が利用している部分の動作 がおかしくなってしまう ↓ 20
単一責任の原則 責任を単一にする例(抽象クラスと実装に分ける) <人事部> <営業部> <社員:抽象クラス> 労働時間の更新 ランク計算 … <実装クラスA >
<実装クラスB> ランク計算 ランク計算 21
3.2. オープン・クローズドの原則 Open Closed Principle 22
オープン・クローズドの原則 • オープン 拡張が簡単にできる状態にしておく • クローズド 拡張を行った際に影響範囲が少なくなるようにする ロジックを追加するときは、 既存のコードをできるだけ改修せずに 新しいコードを簡単に追加できるようにする
↓ 23
オープン・クローズドの原則 原則が守られていない例(決済サービス) <決済管理> 支払い カード払い モジュール 電子マネー払い モジュール モジュールの修正・追加によって 支払いロジックそのものに大きな修正が入る
24
オープン・クローズドの原則 解決策: インターフェースに依存させる • 支払いロジックが実装に依存していない • モジュールの追加による支払ロジックの修正がない <決済管理> 支払い カード払い
モジュール 電子マネー払い モジュール <インターフェース> 支払いモジュール 25
3.3. リスコフの置換原則 Liskov Substitution Principle 26
リスコフの置換原則 27 派生した型は基本型と置換可能でなければならない ↓ 置き換えができない そもそも継承すべきではない 置き換えができる 継承関係が正しいことの指標として見れる
リスコフの置換原則 28 <四角形> 違反例 面積取得 Height 設定 Width 設定 <正方形>
class Square extends Rectangle Rectangle r = new Square(); r.setHeight(5); r.setWidth(2); System.out.println(r.getArea()); これはどのように動作しますか?
リスコフの置換原則 29 置き換えができない(= ふるまいが異なる)と何が起こるか • 利用元で派生先に応じた分岐が必要になる • オープン・クローズドの原則に反する 置き換えができる状態では、 •
ポリモーフィズムのメリットを最大限享受できる • オブジェクトの処理から関心を話すことができる
3.4. インターフェース分離の原則 Interface Segregation Principle 30
インターフェース分離の原則 31 上位オブジェクトが利用しない下位オブジェクト のふるまいへの依存を強制してはならない 下位オブジェクトの無関係なふるまいが 変更されたことによる影響を受けてしまうことがある インターフェースによって依存を制限する ↓ ↓
インターフェース分離の原則 32 <下位オブジェクト> Method – A Method - B Method
- C <インターフェース> Method – A Method – B Method – C 上位オブジェクト 上位オブジェクト 上位オブジェクト 実装を分離する (まだ不足)
インターフェース分離の原則 33 <下位オブジェクト> Method – A Method - B Method
- C <インターフェース> Method – A <インターフェース> Method – B <インターフェース> Method – C 上位オブジェクト 上位オブジェクト 上位オブジェクト 必要なものにだけ依存させる
インターフェース分離の原則 34 • オブジェクト間だけでなく、モジュール間でも同じことが 言える • 依存が分離されていれば、リファクタリング、変更、障害、 再デプロイの影響が最小限になる • 結合が弱くなることにより、拡張にも強くなる
3.5. 依存関係逆転の原則 Dependency Inversion Principle 35
依存関係逆転の原則 36 • 上位モジュールは下位モジュールに依存してはならない • どちらのモジュールとも抽象に依存させるべき ↓ 具体的なものは変わりやすいから 詳細に依存させないため
依存関係逆転の原則 37 Main Task TaskRepository 例) Todoアプリ(タスクを登録してDBに格納する) Class Task {
public Task(String todo) { this.todo = todo; } public save() { TaskRepository r = new TaskRepository(); r.save(this); } }
依存関係逆転の原則 38 Main Task TaskRepository 依存関係を外部から注入する Class Task { public
Task(String todo, Repository repo) { this.todo = todo; this.repo = repo; } public save() { r.save(this); } } Repository
依存関係逆転の原則 39 外部とは? AbstractFactory(依存の注入) 本番用メイン テスト用メイン サービス メインクラス(環境の注入) Application Service
ServiceFactory
4. その他原則に関すること SOLID原則だけがソフトウェア設計のすべてじゃない 40
コンウェイの法則 41 「システムを設計する組織は、その構造を そっくりまねた構造の設計を生み出してしまう」 • ソフトウェアを作るのは人であるからチームの構造がソフ トウェアの構造に反映される • コミュニケーションをうまくとることでソフトウェアの品 質も上がる
GRASPパターン 42 • オブジェクト指向設計において用いられる、クラスやオブ ジェクトに責務を割り当てる方針を導くパターンや原則であ る。(Wikipediaより) • 9個のソフトウェアに対する課題の質問と回答をまとめている 情報エキスパート 生成者
コントローラー 疎結合 高凝縮性 多態性 純粋人工物 変動からの保護 間接化
DRY原則 43 • Don’t Repeat Yourself. の略 • 「ソフトウェア開発においてすべての情報は単一で明確 な信頼できる表現になっていることが求められる」
• ソースコードだけでなくテストやビルドも対象 • コードであれば抽象化し、デザインパターンを活用する • テストやビルドは自動化し、人間が何度も行わない
5. まとめ 全体のおさらい 44
まとめ 45 • オブジェクト指向での設計における原則としてSOLID原則 と呼ばれるものがある • SOLID原則を意識しながらソフトウェア設計を行うと、拡 張性、メンテナンス性が高くなりやすい • 全体の構成が洗練され、読みやすいコードを書くことが
できる
もうちょっとだけ 46 • 今回はオブジェクト指向における設計原則 • さらに上位のコンポーネントに関する原則もいろいろあ ります • 「Clean Architecture
達人に学ぶソフトウェアの構造と 設計」という書籍に目を通してみてください
ご清聴ありがとうございました! ご質問がありましたらどうぞ 47