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
YAGNIのお話
Search
chiroruxx
September 26, 2018
Programming
270
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
YAGNIのお話
9/26 php勉強会@東京
chiroruxx
September 26, 2018
More Decks by chiroruxx
See All by chiroruxx
Contextとはなにか
chiroruxx
1
430
初心者エンジニアから中級者エンジニアになるためにオススメの1冊
chiroruxx
0
130
Laravelのパッケージ全部紹介する
chiroruxx
2
140
Gopher のための「自由な話し合い」ワークショップ
chiroruxx
0
51
PHPをGoで動かす
chiroruxx
0
110
Goを使ってTDDを体験しよう!
chiroruxx
1
1.2k
今ならできる!PhpStormプラグイン開発
chiroruxx
0
120
Go Connectへの想い
chiroruxx
0
240
eBPF with PHPをさわる
chiroruxx
0
200
Other Decks in Programming
See All in Programming
今さら聞けない .NET CLI
htkym
0
180
霧の中の代数的エフェクト
funnyycat
1
470
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
210
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
210
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
150
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
320
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
290
Foundation Models frameworkで画像分析
ryodeveloper
1
570
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.7k
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
130
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.2k
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
sira's awesome portfolio website redesign presentation
elsirapls
0
320
Side Projects
sachag
455
43k
New Earth Scene 8
popppiees
3
2.5k
Google's AI Overviews - The New Search
badams
0
1.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Evolving SEO for Evolving Search Engines
ryanjones
0
250
Into the Great Unknown - MozCon
thekraken
41
2.7k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
430
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
360
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.7k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
760
Transcript
YAGNIのお話 9/26 PHP勉強会@東京 前田 和人
PHPConference2018 スピーカー募 集中です!
自己紹介 ▪ 前田 和人 ▪ @chiroruxxxx ▪ 弁護士ドットコム株式会社
みなさんYAGNI知っていますか?
YAGNI実践してますか?
今回の内容 ▪ 私は、なるべくYAGNIを心がけていますが・・・ ▪ 結構むずかしい! ▪ 実際に開発していて、自分でハマりかけたYAGNIポイントを2つお伝えしてい きます! ▪ 熟練者の皆様はマサカリの準備をお願いいたします
ちなみにYAGNIとは ▪ “You ain’t gonna need it” ▪ (どうせ要らないって!) ▪
機能は実際に必要になるまで追加しないほうが良い ということ – 後で使う予定の機能の90%は実際に使用されない
実例
実例 ▪ CSVのダウンロード機能を新規に実装したい ▪ 別データのCSVダウンロード機能はすでに2つ存在している – しかも別々の実装で! ▪ ⇒CSVダウンロードの機能を1つにまとめ、かつ新規の機能も実装する
とりあえず共通化 class CsvBuilder{ public function build($items, array $header): string {
$stream = fopen('php://temp', 'w'); fputcsv($stream, $header); foreach ($items as $item) { fputcsv($stream, $item->toCsvRow()); } rewind($stream); return stream_get_contents($stream); } }
エンコーディング
エンコーディング ▪ 既存のCSVダウンロードの機能はUTF-8で出力している ▪ 新規に作るものは Shift-JISで出力してほしいらしい ▪ ⇒引数でエンコーディングをとればいんじゃね。汎用性ありそうだし ▪ 本日のYAGNIポイントその1
public function build( $items, array $header, string $to = 'SJIS’, string $from = ‘UTF-8’ ): string{/* … */}
YAGNIポイント1 ▪ そもそもデフォルトの文字コードがUTF-8から外れるようなシステムではない ▪ エンコーディング先もShift-JISにするか、そのままのどちらかしか現状は考え られない ▪ 考えることがいっぱいありそう – fromとtoが同じ場合でもmb_convert_encoding走らせるの?
– 不正な文字コードが来た場合は? ▪ ⇒今回のケースでは、「エンコードを変換するか?」だけ指定できれば良かっ たことに気づく
YAGNIポイント1 public function build($items, array $header, bool $convert = false):
string { $stream = fopen('php://temp', 'w'); fputcsv($stream, $header); foreach ($items as $item) { fputcsv($stream, $item->toCsvRow()); } rewind($stream); $contents = stream_get_contents($stream); if ($convert) { return mb_convert_encoding($contents, 'SJIS', 'UTF-8'); } return $contents; }
ヘッダー
ヘッダー ▪ 今回は人がエクセルで読むようなCSVを作る ▪ 機械が読む場合、ヘッダー(タイトル)行は不要な場合は多い ▪ どちらにも対応できるように、ヘッダーは設定なしにできるほうがいいのか? public function build($items,
array $header = [], bool $convert = false): string { // ... if (count($header) > 0) { fputcsv($stream, $header); } // ... }
YAGNIポイント2 ▪ 作ったところでいったいいつ使われるのか・・・ ▪ 保守性が下がる – 「機械が読めるように処理が工夫されている」 – ⇒「このCSVで外部連携されてる可能性が高い」 –
⇒「変更するなら調査せねば」 – ⇒「・・・外部連携されてないじゃないか!」 ▪ 今回のケースでは、コードの修正なし
まとめ
YAGNIとは ▪ “You ain’t gonna need it” ▪ (どうせ要らないって!) ▪
つまり、実装のコスト支払いをできる限り遅らせる取り組み ▪ XPのスローガンの「なんとか動いて、最も無駄のないものを作れ」を支えるプ ラクティスのひとつ
YAGNIをするとどうなるか ▪ 無駄な抽象度がなくなる – コードが限定的になり読みやすくなる ▪ ユニットテストがシンプルになる ▪ コード量が無駄に増えない –
“コードをできるだけ小さく軽量に維持すること”(リーダブルコード)
YAGNIポイント ▪ 以下のようなものを作ろうとしたときには「本当に必要?」と自問しよう – フレームワーク – 再利用可能なコンポーネント – フレキシブルな設計 ▪
エンジニアはキラキラした言葉に踊らされやすい ▪ パターンが使えるときも注意 – 必要ないのにコンストラクタインジェクションしてるコードはよく見かけ る ▪ ⇒本当に価値のあるものを作ろう