SlideShare a Scribd company logo
1 of 45
Download to read offline
SOLID原則
佐久間 尚輝
自己紹介
では、本題へ
アジェンダ
SOLID原則とは?
SOLID原則の中身
- 単一責任の原則
- オープン・クローズドの原則
- リスコフの置換原則
- 依存関係逆転の原則
- インターフェース分離の原則
まとめ
アジェンダ
SOLID原則とは?
SOLID原則の中身
- 単一責任の原則
- オープン・クローズドの原則
- リスコフの置換原則
- 依存関係逆転の原則
- インターフェース分離の原則
まとめ
SOLID原則とは?
In object-oriented computer programming, the
term SOLID is a mnemonic acronym for five
design principles intended to make software
designs more understandable, flexible
and maintainable. The principles are a subset of
many principles promoted by Robert C.
Martin. Though they apply to any object-
oriented design, the SOLID principles can also
form a core philosophy for methodologies such
as agile development or adaptive software
development.(wikipediaより抜粋)
完
ちゃんと説明させて
いただきます
SOLID原則とは?
ソフトウェアの設計を
理解しやすく柔軟にすることを
目的とした5つの設計原則のこと
(オブジェクト指向のようなもの)
アジェンダ
SOLID原則とは?
SOLID原則の中身
- 単一責任の原則
- オープン・クローズドの原則
- リスコフの置換原則
- 依存関係逆転の原則
- インターフェース分離の原則
まとめ
SOLID原則の中身
単一責任の原則
- Single responsibility principle
オープン・クローズドの原則
- Open/closed principle
リスコフの置換原則
- Liskov substitution principle
依存関係逆転の原則
- Interface segregation principle
インターフェース分離の原則
- Dependency inversion principle
アジェンダ
SOLID原則とは?
SOLID原則の中身
- 単一責任の原則
- オープン・クローズドの原則
- リスコフの置換原則
- 依存関係逆転の原則
- インターフェース分離の原則
まとめ
単一責任の原則
クラスを変更する理由は
2つ以上存在してはならない
どういうこと?
1つのクラスには1つの役割
悪い例
PlayerManagerクラス
何が悪いの?
・1つのクラスの役割が多すぎる
・機能の修正、追加をする際
思わぬところで不具合が
発生する可能性がある
改善
PlayerMoveクラス
PlayerAttackクラス
PlayerEffectクラス
処理ごとにクラスを分ける
アジェンダ
SOLID原則とは?
SOLID原則の中身
- 単一責任の原則
- オープン・クローズドの原則
- リスコフの置換原則
- 依存関係逆転の原則
- インターフェース分離の原則
まとめ
オープン・クローズドの原則
クラスは
拡張に対して開いていて、
修正に対して閉じて
いなければならない
どういうこと?
仕様変更があった場合は
機能の追加を容易に出来る
その際に既存のコードは
影響をうけない
悪い例
プレイヤーの当たり判定
何が悪いの?
・処理を記述し忘れても気付けない
・当たり判定が増えるたびに
このif文が増える
改善
if文の羅列もなくなり
変更に強いコードに
Playerクラス
改善
基底クラスやインターフェースを使って
抽象化する
当たったときの
インターフェース Enemyクラス
アジェンダ
SOLID原則とは?
SOLID原則の中身
- 単一責任の原則
- オープン・クローズドの原則
- リスコフの置換原則
- 依存関係逆転の原則
- インターフェース分離の原則
まとめ
リスコフの置換原則
派生クラスはその基底クラスと
置換可能でなければならない
どういうこと?
基底クラスで決められた約束を
派生クラスで破ってはいけない
悪い例
値段クラス
税込み価格クラス
悪い例クラス
何が悪いの?
計算機クラス
・結果が違っているのに動いてしまう
・親クラスが望んでいる結果と違う
・チーム制作で起こりやすい
税込み価格クラスの
処理を知らない人が
作ったクラス
改善
税込み価格クラス
専用の属性を用意してあげると
親の挙動を変更せずに
処理がおこなえる
アジェンダ
SOLID原則とは?
SOLID原則の中身
- 単一責任の原則
- オープン・クローズドの原則
- リスコフの置換原則
- 依存関係逆転の原則
- インターフェース分離の原則
まとめ
依存関係逆転の原則
上位モジュールは
下位のモジュールに
依存してはならない
どちらのモジュールも「抽象」に
依存すべきである
どういうこと?
上位クラスが方針を決め、
下位クラスがその方針に従う
悪い例
Playerクラス PlayerのHPを記憶
するクラス
何が悪いの?
・下位クラスに依存してしまっている
・他に記憶させたいものが
出てきた時にif文が増える
改善
Playerクラス 記憶するインター
フェース
下位クラスに依存せずに
抽象クラスに依存している
アジェンダ
SOLID原則とは?
SOLID原則の中身
- 単一責任の原則
- オープン・クローズドの原則
- リスコフの置換原則
- 依存関係逆転の原則
- インターフェース分離の原則
まとめ
インターフェース分離の原則
クライアントが利用しない
メソッドへの依存を
強制してはならない
どういうこと?
インターフェースは
シンプルにする
悪い例
Playerインターフェース
何が悪いの?
Playerインターフェース
・このインターフェイスを継承したクラスの
メソッドを変更した場合、他のメソッドも
変更しなければならない可能性がある
改善
当たったときのインターフェース
インターフェイスの実装は
必要最低限にする
アジェンダ
SOLID原則とは?
SOLID原則の中身
- 単一責任の原則
- オープン・クローズドの原則
- リスコフの置換原則
- 依存関係逆転の原則
- インターフェース分離の原則
まとめ
まとめ
SOLID原則はあくまで「原則」
なので、臨機応変に使用しよう
ご清聴ありがとうございました

More Related Content

What's hot

Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Preferred Networks
 
Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こうShinnosuke Tokuda
 
インタフェース完全に理解した
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解したtorisoup
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...NTT DATA Technology & Innovation
 
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022Takayuki Shimizukawa
 
Sphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメントSphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメントIosif Takakura
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
東京工業大学「ロボット技術」ロボットミドルウェア
東京工業大学「ロボット技術」ロボットミドルウェア東京工業大学「ロボット技術」ロボットミドルウェア
東京工業大学「ロボット技術」ロボットミドルウェアNoriakiAndo
 
ネットワークエンジニア的Ansibleの始め方
ネットワークエンジニア的Ansibleの始め方ネットワークエンジニア的Ansibleの始め方
ネットワークエンジニア的Ansibleの始め方akira6592
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring増田 亨
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Masahito Zembutsu
 
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021whywaita
 
Multibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだことMultibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだことRecruit Lifestyle Co., Ltd.
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集akipii Oga
 
Unityネイティブプラグインの勧め
Unityネイティブプラグインの勧めUnityネイティブプラグインの勧め
Unityネイティブプラグインの勧めKLab Inc. / Tech
 

What's hot (20)

Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こう
 
インタフェース完全に理解した
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解した
 
Jenkins 再入門
Jenkins 再入門Jenkins 再入門
Jenkins 再入門
 
GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
 
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
 
入門!Jenkins
入門!Jenkins入門!Jenkins
入門!Jenkins
 
Sphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメントSphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメント
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
東京工業大学「ロボット技術」ロボットミドルウェア
東京工業大学「ロボット技術」ロボットミドルウェア東京工業大学「ロボット技術」ロボットミドルウェア
東京工業大学「ロボット技術」ロボットミドルウェア
 
ネットワークエンジニア的Ansibleの始め方
ネットワークエンジニア的Ansibleの始め方ネットワークエンジニア的Ansibleの始め方
ネットワークエンジニア的Ansibleの始め方
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
 
Multibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだことMultibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだこと
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集
 
Unityネイティブプラグインの勧め
Unityネイティブプラグインの勧めUnityネイティブプラグインの勧め
Unityネイティブプラグインの勧め
 

SOLID原則とは