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
Dara / Shidara Kota
January 22, 2023
Technology
0
190
日常と照らし合わせて理解するSOLID原則
SOLID原則について
Dara / Shidara Kota
January 22, 2023
Tweet
Share
More Decks by Dara / Shidara Kota
See All by Dara / Shidara Kota
CA.unity#7 Windows/Macの証明書の取得と、署名済みインストーラーを作成するビルドプロセスの紹介
dara_dara
0
1.7k
会話を分析するAIアシスタントの実装 (Unity × OpenAI API × AWS)
dara_dara
0
150
Zip配布の卒業 インストーラーはいいぞ!
dara_dara
0
47
ビジネスサイドでもわかる ドメイン駆動設計とは?
dara_dara
0
130
素早いリリースと自身のCTO化を実現した爆速成長サイクルを振り返る
dara_dara
0
250
初心者必見!Unityを用いた、cluster worldと自作VRアプリの作り方
dara_dara
0
67
VRMアバターのキャリブレーションや表情設定とマルチプレイ同期
dara_dara
0
240
Other Decks in Technology
See All in Technology
旬のブリと旬の技術で楽しむ AI エージェント設計開発レシピ
chack411
1
170
Master Dataグループ紹介資料
sansan33
PRO
1
4.2k
「駆動」って言葉、なんかカッコイイ_Mitz
comucal
PRO
0
140
わが10年の叡智をぶつけたカオスなクラウドインフラが、なくなるということ。
sogaoh
PRO
1
390
First-Principles-of-Scrum
hiranabe
3
1.7k
2025-12-27 Claude CodeでPRレビュー対応を効率化する@機械学習社会実装勉強会第54回
nakamasato
4
1.4k
『君の名は』と聞く君の名は。 / Your name, you who asks for mine.
nttcom
1
150
Claude Codeを使った情報整理術
knishioka
20
12k
Cloud WAN MCP Serverから考える新しいネットワーク運用 / 20251228 Masaki Okuda
shift_evolve
PRO
0
140
Oracle Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
3
310
AIと融ける人間の冒険
pujisi
0
110
Models vs Bounded Contexts for Domain Modularizati...
ewolff
0
120
Featured
See All Featured
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
0
34
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
870
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
230
Balancing Empowerment & Direction
lara
5
840
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.1k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
13k
Designing Experiences People Love
moore
143
24k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
71k
Heart Work Chapter 1 - Part 1
lfama
PRO
4
35k
Into the Great Unknown - MozCon
thekraken
40
2.2k
sira's awesome portfolio website redesign presentation
elsirapls
0
110
Transcript
日常と照らし合わせて理解する SOLID原則 だーら(twitter: @3tdara) Iwaken Lab / Flamers
自己紹介 - だーら / 設楽広太 - Flamers CPO - VRマッチングアプリ
Memoria - VRChatter / 作曲なども - zenn
これが神資料です。いったんこれ見れば最強。 - Unity開発で使える設計の話+Zenjectの紹介 by とりすーぷさん こちらもよき - リスコフの置換原則(LSP)をしっかり理解する
SOLID原則とは - オブジェクト指向で開発するときに、守った方がよい基本原則 - 5つの原則の頭文字 - S … Single Responsibility
Principle: 単一責任の原則 - O … Open-Closed Principle: オープン・クローズドの原則 - L … Liskov Substitution Principle: リスコフの置換原則 - I … Interface Segregation Principle: インターフェイス分離の原則 - D … Dependency Inversion Principle: 依存性逆転の原則
単一責任の原則とインターフェイス分離の原則は、原則 自体の理解は割と簡単なので軽く。
単一責任の原則と、インターフェイス分離の原則 - 単一責任の原則 - クラスが担当する責任は 1つだけ - Why?: クラスの中でたくさん機能を持つと、変更がクラス内の他の箇所や、そのクラスに依存して いるクラスに及びやすい
- How?: 命名に気を付ける(〇〇Manager => 〇〇Mover, 〇〇Animator) - インターフェイス分離の原則 - 使ってないメソッドに依存しない - Why?: 意図しない動作が出来てしまうので、バグが起きやすい。 - How?: インターフェイスを適切に分離
残り3原則は、 「抽象」をうまく使おうという点で通じる部分がある。
「抽象」をうまく使う3原則 - オープン・クローズドの原則 - クラスは、拡張にはオープンで、変更にはクローズドであるべきだ。 - リスコフの置換原則 - 派生型(サブクラス)は、その基底型(スーパークラス)と置換可能でなければならない。 -
依存性逆転の原則 - 上位のモジュールは下位のモジュールに依存してはならない。どちらのモジュールも「抽象」に依存 すべきである。 - 「抽象」は実装の詳細に依存してはならない。実装の詳細が「抽象」に依存すべきである。
これらは、原則の内容や目的が、いまいち掴みにくい。 日常に照らし合わせて考えてみる。
会社に新しいメンバーが入社し、Slackに入れる - ストーリー - 新入社員が入社した。 - Slack係は、その人がビズかエンジニアかを考慮し、チャンネルに招待する。 - ビズは、#general・#bussiness -
エンジニアは、#general・#develop 君はビズだね。 では、 #general・#businessに 入ってください。 君はエンジニアだね。 では、 #general・#developに 入ってください。
コード ここが闇 追加の度に変更
新しい職種が追加された - 新職種 - 会計係 - 人事 - お手伝いのお母さん -
Slack係は混乱し始めた - 会計係、#general・#finance - 人事は、#general・#recruit - …あれ、お手伝いのお母さんって Slack入れるんだっけ?言われてないけど? 新しい職種が追加されるたびに、Slack係のやることが変更されている。 これは、オープン・クローズドの原則に違反している。
Slack係が混乱する原因 - 新しいメンバーの職種を見極め、入るチャンネルを指示する分岐処理を、Slack係 が担当している。 - 職種が増えるたびに、Slack係には新しい分岐処理を追加しなければならない。 ↓ - 各職種ごとにクラスを作り、親クラスを継承させる、または、インターフェイスを実装 させることで解決する。
抽象を継承/実装する - 各職種クラスに、Memberクラスを継承させる。 または、ISlackJoinableインターフェイスを実装させる。 - 自分自身で、自分が入る必要のあるチャンネルを調べ、自分で入る。 - (談義テーマ: このインターフェイスの命名って何が良い?) -
Slack係は、新メンバーの職種を知らない。入れと命令だけする。 Slackに入れ! Slackに入れ!
基底クラス継承の場合 ただ命令するだけ 条件分岐しない 自分で判断 基底クラスで受けとる 継承 継承
インターフェイス実装の場合 インターフェイス ただ命令するだけ 条件分岐しない 実装 実装
(職種クラスがMemberクラスを継承する設計としたとき) この設計が機能するのは、 Slack係がMember(基底クラス)に対して、 「Slack入れ!」と言えば、 (派生クラスが)必ず入ってくれる からである。
例えばもしエンジニアが、 「自分で調べるのめんどいので、Notionリンクだけくれ」 とか言い出したら破綻する。 また、if文で判断する設計に巻き戻り。 Slackに入れ! まじか、エンジニアは面倒くさがりだか ら、職種ごとに対応変えないと ... あー、チャンネル一覧の Notionのリンクも
らえます?
派生型(サブクラス)が、その基底型(スーパークラス)と 置換可能ではなくなっている。 ↓ リスコフの置換原則違反 オープン・クローズドの原則違反に繋がる。
(Interfaceを実装する場合)依存性も逆転している 抽象(Slackに入れ!という、変わらないやりたいこと)が安定する 詳細(それぞれの職種が、どう Slackに入るか)は変わりやすいので、抽象から依存させたくない。
残したトピック - 継承の方で書いた場合、依存性って逆転してないですよね? - Memberクラスは、Slack係の都合で設計されてるわけではない。 - Interface実装でやる方が良い?( can-do関係) - デメテルの法則(尋ねるな、命じろ)とも関連しそう?
- 使う側が、使われる側の中身について考えない。命じて、あとは自分自身で考えさせる - 依存性注入の話 余談 - リアルの職場でも依存性逆転させたい場面ありそう(マネージャーが楽になる)