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
依存を意識して安定した変更に強いコードを書こう
Search
akatsuka
August 16, 2024
Technology
0
120
依存を意識して安定した変更に強いコードを書こう
良いコードの書き方勉強会 in 京都 で発表した資料です
https://kansai-web-app-dev.connpass.com/event/325588/
akatsuka
August 16, 2024
Tweet
Share
More Decks by akatsuka
See All by akatsuka
PHPカンファレンス関西2025 コアスタッフ説明会
akinoriakatsuka
0
60
PHPで物理エンジン(PHPysics)を作ってみた - PHPカンファレンス沖縄2024
akinoriakatsuka
0
96
password_hash に詳しくなりたい - PHPオレカンファレンス
akinoriakatsuka
0
270
composer dump-autoloadを「なんとなく使う」から「理解して使う」になる
akinoriakatsuka
0
2.4k
リバーシを作って学ぶテスト駆動開発
akinoriakatsuka
0
110
OSS Gateに参加したら Larastanに コントリビュートできた - Kobe Laravel
akinoriakatsuka
0
99
知っておきたいautoloadのはなし - PHPカンファレンス関⻄2024
akinoriakatsuka
1
1.5k
Other Decks in Technology
See All in Technology
プロダクト価値を引き上げる、「課題の再定義」という習慣
moeka__c
0
210
Japan AWS Jr. Championsがお届けするre:Invent2024のハイライト ~ラスベガスで見てきた景色~
fukuchiiinu
0
1.1k
Autify Company Deck
autifyhq
2
41k
SREとしてスタッフエンジニアを目指す / SRE Kaigi 2025
tjun
15
6.3k
Amazon Aurora バージョンアップについて、改めて理解する ~バージョンアップ手法と文字コードへの影響~
smt7174
1
240
CNAPPから考えるAWSガバナンスの実践と最適化
yuobayashi
5
680
例外処理を理解して、設計段階からエラーを「見つけやすく」「起こりにくく」する
kajitack
12
3.7k
2週に1度のビッグバンリリースをデイリーリリース化するまでの苦悩 ~急成長するスタートアップのリアルな裏側~
kworkdev
PRO
8
6.5k
Power BI は、レポート テーマにこだわろう!テーマのティア表付き
ohata_ds
0
120
インシデントキーメトリクスによるインシデント対応の改善 / Improving Incident Response using Incident Key Metrics
nari_ex
0
4.1k
[TechNight #86] Oracle GoldenGate - 23ai 最新情報&プロジェクトからの学び
oracle4engineer
PRO
1
170
ObservabilityCON on the Road Tokyoの見どころ
hamadakoji
0
210
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
96
5.3k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
192
16k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
20
2.4k
The Cult of Friendly URLs
andyhume
78
6.2k
Optimising Largest Contentful Paint
csswizardry
33
3k
Music & Morning Musume
bryan
46
6.3k
Designing Experiences People Love
moore
139
23k
Thoughts on Productivity
jonyablonski
68
4.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
How GitHub (no longer) Works
holman
312
140k
Transcript
依存を意識して安定した 変更に強いコードを書こう 良いコードの書き方勉強会 in 京都 2024/8/17 あかつか
自己紹介 • あかつか X: aki_artisan • 神戸でPHP書いてます • レガシーPHPをLaravelに移植 •
PHPカンファレンス関西2025実行委員長 2
そもそも良いコードとは? • 読みやすいコード • 保守しやすいコード • 変更しやすいコード • パフォーマンスが良いコード •
安全なコード • バイト数が少ないコード(コードゴルフではね) 3
つまり、良いコードとは? • 読みやすいコード • 保守しやすいコード • 変更しやすいコード • パフォーマンスが良いコード •
安全なコード • バイト数が少ないコード(コードゴルフではね) 目的を満たすコード 4
ソフトウェア開発において良いコードとは? • 自社プロダクトか受託で作るシステムなのかにもよる ◦ 仕様が変化しづらく、再現性を求められる? ◦ 環境に適用して柔軟に振る舞いを変えていくことが求められる? ◦ パフォーマンス最優先? 目的によって、良いコードは異なる
自分たちで考えていくことが大事 5
今回は自社プロダクト開発の文脈で話します プロダクト開発にはアジリティが求められる 作ったものが正しいとは限らない 頻繁に機能拡張や、仕様変更、バグ修正、リファクタリングが行われる 6
変更しやすく保つ必要がある アジリティを失わないようにするためには、 変更しやすく保つ必要がある • テストコードを書く • 疎結合な状態を保つ • こまめにリファクタリングする 7
変更しにくくなる原因は? • 影響範囲がわからない • 複数の責務をもつクラスやメソッド、関数がある • 大事なところほど、手が入りやすくどんどん複雑になっていく 依存関係が複雑になっている 8
「依存」をキーワードに考えてみよう 9
「依存」ってなんだか難しい? AがBに依存している→ピンとこない 大胆に「AがBを使っている」と言い換えよう! AがBを使っている。Bがないと機能しない。AはBに依存している。 AはBを使っている。だから、Bの変更の影響を受ける。 10
11
依存しているとは使っているということ 12
「AがBに依存ている」とは A B AがBを使っている状態 13
例:「ユーザー登録機能がメール送信機能を使っている」 ユーザー 登録機能 メール送信 機能 AがBを使っている状態 14
依存すると何が困るのか 15
依存すると変更の影響をうける(A視点) A B AがBを使っている状態 変更 影響が 波及 16
依存されると変更しづらくなる(B視点) 共通モジュールを変更したら、いろいろなところでバグが波及した! A B AがBを使っている状態 変更し づらい 17
実際のプロダクト開発では 実際の世界では、依存先(われわれが使うもの)は外部のものだったりする メリットの方が大きいので依存することを選んでいるとも言える わたしたちの プロダクト Laravel PHP 18
実際のプロダクト開発では わたしたちの プロダクト Laravel PHP LaravelやPHPのバージョンアップに振り回されるのはこのため だからこそ、できるだけ安定なものに依存したい → 依存注入というアプローチが一役買う 19
実演:依存性を注入してみよう 20
最初の状態 ログ出力処理が べた書き ログ出力の仕様を変えたい時、毎回全ての箇所で変更しないといけない 21
level1 : ログ出力を外部に委譲 ログ出力処理を 切り出した 22
level1 : ログ出力を外部に委譲 ログ出力処理を 切り出した 直接ロガーを 使っている 23
level2 : ログ出力用クラスを外から与える どのロガーを使うかを 外から与えるようにした ログ出力機能との結合が疎になった 24
level2 : ログ出力用クラスを外から与える どのロガーを使うかを 外から与えるようにした ログ出力機能との結合が疎になった 25
level3 : ログ出力用のインターフェースに依存させる logメソッドを 持てば良い (抽象化) 26
level3 : ログ出力用のインターフェースに依存させる logメソッドを 持てば良い (抽象化) 27 抽象に依存するとより安定に
依存を外から与えるメリット 28
依存を外から与えると差し替えることができる • テストがしやすい ◦ 例えばテストの時はログ出力をオフにしたい、などの場合、 logメソッドの実装が空のモックで置き換 えるなどで、安全にテストが行える ◦ 時間がかかる、お金がかかる、副作用が許容できない、など様々なパターンに対応できる •
拡張性が上がる ◦ 既存の部分に影響を与えることなく、別の実装を使うように差し替えることが可能 • 依存関係が追いやすい 29
良いコードの書き方 30
良いコードを書くには依存を意識する • 変更しづらいコードはビジネスとして価値を産みづらい • 無自覚な依存はコードを変更しづらくする • 「これに依存して大丈夫?」「これはどのくらい安定?」と問いかける • 依存しないといけない時は、依存を外から与えるようにする ◦
コンストラクタ経由で与える ◦ Laravelだと、サービスコンテナを使うなど 31
おすすめ資料① https://speakerdeck.com/blue_goheimochi/phperkaigi2024 32
おすすめ資料② なぜ依存を注入するのか DIの原理・原則とパ ターン (Compass Booksシリーズ) 33
まとめ • 依存とは使っている ということ • 変更の影響を受けないように、安定なものに依存しよう • 依存を外から与える ようにすると疎結合になる(依存注入) •
何が何を使っているかを意識してプログラミングしよう • 依存する時は、「それはどのくらい安定?」 を考えるようにしよう 34