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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
2k
会話を分析するAIアシスタントの実装 (Unity × OpenAI API × AWS)
dara_dara
0
170
Zip配布の卒業 インストーラーはいいぞ!
dara_dara
0
58
ビジネスサイドでもわかる ドメイン駆動設計とは?
dara_dara
0
160
素早いリリースと自身のCTO化を実現した爆速成長サイクルを振り返る
dara_dara
0
280
初心者必見!Unityを用いた、cluster worldと自作VRアプリの作り方
dara_dara
0
86
VRMアバターのキャリブレーションや表情設定とマルチプレイ同期
dara_dara
0
260
Other Decks in Technology
See All in Technology
FinOps X 2026 Recap from Engineer Side #JapanFinOps
chacco38
0
230
「勝手に広まる」人気 AI エージェントを爆速で作ろう!(AWS Summit Japan 2026講演資料)
minorun365
PRO
10
2.8k
「ビジネスがわかるエンジニア」とは何か?
ryooob
0
440
5分でわかる Amazon Connect_20260608
hwangbyeonghun
0
160
LiDAR SLAMの実装とセンサ融合 ~Lie群からContinuous-Time LIOまで~
naokiakai
1
780
AIをフル活用してオンコール機能のプロトタイプを2日で作った話 / Building an AI-Powered On-Call Prototype in Just Two Days
nari_ex
0
160
Kotlin 開発のツラミを爆破した話! / Explode the difficulty of Kotlin dev!
eller86
0
130
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
8.3k
AI・ロボティクスと自動化社会 / AI, Robotics, and the Automated Society
ks91
PRO
0
130
Docker Desktop不要の時代が来る? WSL標準の「wslc」で Linuxコンテナを動かしてみた.
ueponx
0
430
製造現場での生成AIの活用、およびエージェントAIの実装のあり方、AVEVAの取り組み
iotcomjpadmin
0
210
From Prompt Engineering to Loop Engineering
shibuiwilliam
1
320
Featured
See All Featured
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Building the Perfect Custom Keyboard
takai
2
810
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
880
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
The Spectacular Lies of Maps
axbom
PRO
1
840
WENDY [Excerpt]
tessaabrams
11
38k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
330
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Discover your Explorer Soul
emna__ayadi
2
1.2k
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関係) - デメテルの法則(尋ねるな、命じろ)とも関連しそう?
- 使う側が、使われる側の中身について考えない。命じて、あとは自分自身で考えさせる - 依存性注入の話 余談 - リアルの職場でも依存性逆転させたい場面ありそう(マネージャーが楽になる)