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
210
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
日常と照らし合わせて理解するSOLID原則
SOLID原則について
Dara / Shidara Kota
January 22, 2023
More Decks by Dara / Shidara Kota
See All by Dara / Shidara Kota
CA.unity#7 Windows/Macの証明書の取得と、署名済みインストーラーを作成するビルドプロセスの紹介
dara_dara
0
2.1k
会話を分析するAIアシスタントの実装 (Unity × OpenAI API × AWS)
dara_dara
0
170
Zip配布の卒業 インストーラーはいいぞ!
dara_dara
0
63
ビジネスサイドでもわかる ドメイン駆動設計とは?
dara_dara
0
160
素早いリリースと自身のCTO化を実現した爆速成長サイクルを振り返る
dara_dara
0
280
初心者必見!Unityを用いた、cluster worldと自作VRアプリの作り方
dara_dara
0
92
VRMアバターのキャリブレーションや表情設定とマルチプレイ同期
dara_dara
0
270
Other Decks in Technology
See All in Technology
AI研修(Day1)【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
1.3k
事業成長とAI活用を止めないデータ基盤アーキテクチャの設計思想
hiracky16
0
730
AIコード生成×サプライチェーン攻撃 — PHPが直面する“二重の信頼問題
shinyasaita
0
490
MCPをつなげて作る組織横断のAIエージェント基盤
tsubakimoto_s
0
160
GoでCコンパイラを作った話
repunit
0
170
AI時代におけるエンジニアの新たな役割──FDEとクオリアの探求/登壇資料(戸井田 裕貴)
hacobu
PRO
0
480
データ活用研修 問いの発見と仮説構築【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
330
PHPで作って学ぶリアルタイム音声対話AIとWebSocket入門 by ムナカタ
munakata
0
160
SRENEXT_2026_Chairs__Talks_in_Tamachi.sre.pdf
srenext
1
160
『モデル + ハーネス』で読み解く AIエージェント入門
oracle4engineer
PRO
2
200
複数プロダクトで進めるAI機能実装 ── 実践から得たリアルな学びとロードマップ実現への挑戦 / AICon2026_yanari
rakus_dev
1
310
データエンジニアリングとドメイン駆動設計
masuda220
PRO
15
2.7k
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Ruling the World: When Life Gets Gamed
codingconduct
0
290
How to Ace a Technical Interview
jacobian
281
24k
The agentic SEO stack - context over prompts
schlessera
0
850
The Cost Of JavaScript in 2023
addyosmani
55
10k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
A better future with KSS
kneath
240
18k
Utilizing Notion as your number one productivity tool
mfonobong
4
460
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
200
How STYLIGHT went responsive
nonsquared
100
6.2k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
220
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関係) - デメテルの法則(尋ねるな、命じろ)とも関連しそう?
- 使う側が、使われる側の中身について考えない。命じて、あとは自分自身で考えさせる - 依存性注入の話 余談 - リアルの職場でも依存性逆転させたい場面ありそう(マネージャーが楽になる)