Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ケント・ベックに学ぶ『良いコード』の書き方
Search
しが あきとし(akitoshiga)
August 17, 2024
Programming
780
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ケント・ベックに学ぶ『良いコード』の書き方
『良いコード』というテーマに対して自分がケント・ベックから学んだことをまとめました
しが あきとし(akitoshiga)
August 17, 2024
More Decks by しが あきとし(akitoshiga)
See All by しが あきとし(akitoshiga)
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
1
240
雑草エンジニア
akitoshiga
5
2.6k
テスト駆動開発✅️
akitoshiga
1
960
Other Decks in Programming
See All in Programming
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
1k
気持ちぃ〜角丸 Squircle
ryu1013
0
340
GraphQL の onError と Nullability のこれから
quramy
0
180
golang-bob.pdf
iwatsukayura
0
140
Domain-Driven Transformation
hschwentner
2
2.3k
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
120
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
0
150
パスワード再設定メールのURLについて知っておこう
uyuki234
0
190
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
1.8k
JIS keyboard support in Omarchy
lef237
0
160
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
210
ChromeでローカルLLM
ryu1013
0
160
Featured
See All Featured
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
580
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
230
エンジニアに許された特別な時間の終わり
watany
109
250k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Skip the Path - Find Your Career Trail
mkilby
1
260
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
650
The untapped power of vector embeddings
frankvandijk
2
2k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
1k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Transcript
ケント・ベックに学ぶ 『良いコード』の書き方 2024.08.17 Kansai Dev Garage しが あきとし
自己紹介 • なまえ ◦ しが あきとし(@akitoshiga) • 普段何してる? ◦
医療系HR企業のWebエンジニア ◦ 主にRuby on Railsアプリの開発 • 好きなプログラマー ◦ ロバート・C・マーティン ◦ ケント・ベック
目次 1. ケント・ベックについて 2. ケント・ベックの『良いコード』 3. パターン 4. パターンの具体例
5. まとめ
1. ケント・ベックについて
ケントベックとは 1. ケント・ベックについて • プログラマー • アジャイル開発におけるエクスト リーム・プログラミング(XP)の考案 者 •
テスト駆動開発(TDD)の第一人者と しても有名 • 代表的な著書 ◦ 「エクストリームプログラミング」 ◦ 「テスト駆動開発」
なぜケント・ベックから学ぶのか?
ケント・ベックの『良いコード』に対する熱量がすごい 1. ケント・ベックについて 『 70年の人生は、20億秒を少し超えるに過ぎない。誇りの持てない仕事で無駄にする時 間はない。良いコードを書くこと自体が喜びであり、そのコードを他の人が理解し、評価 し、使用し、拡張してくれればさらに喜びは増す。 』 ケント・ベック「実装パターン」より引用
ケントベックの凄いところ 1. ケント・ベックについて • 職業人生を捧げるほどの『良いコード』に対する熱量 • コーディングに対する深い洞察 • 後述する『パターン』を用いてコーディングにおける個々の課題とその解決方法を抽 象化して再利用可能にするアプローチを推進した
2. ケント・ベックの『良いコード』
ケント・ベックの考える『良いコード』とは? 2. ケント・ベックの『良いコード』 『 70年の人生は、20億秒を少し超えるに過ぎない。誇りの持てない仕事で無駄にする時 間はない。良いコードを書くこと自体が喜びであり、そのコードを他の人が理解し、評価 し、使用し、拡張してくれればさらに喜びは増す。 』 ケント・ベック「実装パターン」より引用
コミュニケーション・シンプル・柔軟性
コミュニケーション・シンプル・柔軟性 2. ケント・ベックの『良いコード』 『 卓越したプログラミングにおいて必要とされる価値は、コミュニケーション、シンプル、 柔軟性である。これらの価値は互いに衝突するときもあるが、補完し合うことの方が多 い、拡張方法が数多く存在し、余分な要素が存在せず、読みやすく、理解しやすいのが 最高のプログラムだ。 』 ケント・ベック「実装パターン」より引用
コミュニケーション 2. ケント・ベックの『良いコード』 • 読み手が理解できるコード • 実装意図を正しく伝えらえるコード • 人間とコミュニケーションができるコードは保守のコストを大きく減らすことができる ◦
コードは書いた時間より読まれる時間の方が長い • ケント・ベックは開発をコードと人間のコミュニケーションと捉えた
シンプル 2. ケント・ベックの『良いコード』 • 『余分な複雑性』のないコード • 『余分な複雑性』とは ◦ 動作に影響のないコード ◦
一生懸命動かそうとした痕跡のあるコード ◦ メンテナンス(リファクタ)されていないコード • 複雑なコード全てが悪というわけではない ◦ 解決すべき問題が複雑な場合はその複雑さが反映される →『本質的な複雑さ』 ◦ プログラミングには複雑さの玉と石を分ける作業が必要 • 何をシンプルとするかは個人による所がある ◦ ベテランにとってのシンプルは、初心者には難しすぎることも ◦ 読み手を意識した時に良いプログラムは生まれる
柔軟性 2. ケント・ベックの『良いコード』 • 変更を容易に行えるコード • 柔軟性は非効率なコードや設計を正当化するために悪用されがちなので注意 ◦ プログラムが柔軟であるべきなのは、プログラムがその方向に変更される場合だけ ◦
明日必要と思われた柔軟性すら必要とされない場合が多い • 凝った設計から得られる柔軟性よりも、シンプルと包括的なテストから得られる柔軟 性の方が効果的 • 「YAGNI」・「KISS」の原則を尊重する ◦ YAGNI →「You Ain’t Gonna Need It」 ◦ KISS →「Keep It Simple, Stupid」
これらの要素にケント・ベックは どうアプローチしたのか?
3. パターン
パターンについて 3. パターン • ソフトウェア設計上の課題とその有効な解決策を再利用可能なように一般化したも の ◦ 例 GoFのデザインパターン •
ケント・ベックはこのパターンの先駆け ◦ 1987年のOOPSLAで 「Using Pattern Languages for Object-Oriented Programs」を発表 • ケント・ベックはパターンを用いて『良いコード』を書くことを推進した
ケント・ベックの用いるパターンの特徴 3. パターン • 粒度が細かく幅広い ◦ ケント・ベックは多くのパターンを組み合わせてプログラミングをした ◦ クラスやメソッドの命名までにもパターンの考え方を取り入れている •
どのパターンも必ずコミュニケーション・シンプル・柔軟性のいずれかの価値を反映 している • どのパターンも以下の6つの原則に従っている 1. 結果の局所化 2. 繰り返しの最小化 3. 対称性 4. ロジックとデータの一体化 5. 宣言型の表現 6. 変更頻度
4. パターンの具体例
注意 4. パターンの具体例 • 以降のパターンは全てRubyで書いています • Rubyに馴染みがない人向けに一般的なイディオムからは外れた書き方をしている 部分があります
パターン1. Composed Method
パターン1. Composed Method 4. パターンの具体例 Before After
パターン1. Composed Method 4. パターンの具体例 • プログラムを一つの事のみにするメソッドに 分割する • メソッド内部のメッセージは
同じ抽象度になる ようにする • メソッド内部の対称性が保たれ、かつ宣言型 で意図が表現されるため読みやすく、意図が 伝わりやすくなる • Beforeではメソッドの処理を追わなければな らないが、Afterではメソッドの呼び出しを見る だけで何をやっているかわかるようになる
パターン2. Double Dispatch
パターン2. Double Dispatch 4. パターンの具体例 Before After
2. Double Dispatch 4. パターンの具体例 • オブジェクト指向的なパターン • 異なる2つの関心事の変更頻度を分割 •
多態性を用いて冗長な 『余分な複雑性』の排 除
パターン3. Method Object
パターン3. Method Object 4. パターンの具体例 Before After
パターン3. Method Object 4. パターンの具体例 • Composed Methodでも単純化できないほど メソッドが大きい場合は、そのメソッド自体を オブジェクトにしてしまう
• 関連するデータをプロパティとして持つことで ロジックとデータを一体化 する • 多くの引数を持つ場合は、メソッドから引数が なくなることで可読性も向上する • Composed Methodと組み合わせて使うこと でより明確でシンプルなコードになる
5. まとめ
まとめ 5. まとめ • ケント・ベックの考える『良いコード』はコミュニケーション・シンプル・柔軟性から成り 立つ • パターンを積極的に再利用し、効率的で的確なコーディングを行っている • ケントベックのパターンは6つの原則に従っている
◦ 結果の局所化・繰り返しの最小化・対称性 ◦ ロジックとデータの一体化・宣言型の表現・変更頻度 • 本日紹介したパターンやその他のパターンを学んだり、普段コーディングを行う中で パターンを発見することは良いコードを書くことに繋がっていく • 普段コードを書く中でパターンの6つの原則を意識するのも効果的
ご清聴ありがとうございました
Appendix パターンが従う6つの原則
本編で割愛したパターンが従う6つの原則について紹介 Appendix パターンが従う6つの原則 1. 結果の局所化 2. 繰り返しの最小化 3. 対称性 4.
ロジックとデータの一体化 5. 宣言型の表現 6. 変更頻度
原則1. 結果の局所化 Appendix パターンが従う6つの原則 • コードの変更の結果が一箇所に留まるようにコードを構成すること • コードの変更が想定外の場所に影響するとその変更コストは劇的に上昇する • 結果の局所化ができているコードであれば、コード全体を把握しなくても段階的に
理解すれば良くなる
原則2. 繰り返しの最小化 Appendix パターンが従う6つの原則 • 同じ目的の下に同じ処理を行うコードは一箇所にまとめて共通化すること • (当たり前だけど)コードが重複していると一つを変更すると他のすべても変更しな ければいけなくなる ◦
重複したコードの分だけ変更コストは増大する • ただし、必ずしも重複を排除すれば良いのではなく、目的が異なれば同じ処理で あってもコードは共通化しない方が良い ◦ 参考「クソコード動画『カプセル化 Mk-II』で考える、上手くカプセル化できない理由 ミノ駆動 @MinoDriven #ooc_2024」
原則3. 対称性 Appendix パターンが従う6つの原則 • 対称性を意識するとコードは劇的に読みやすくなる • コードの粒度や行える操作を対称的にする ◦ クラス内のプロパティの生存期間を同一にする
◦ あるメソッドのグループがあれば全て同じ引数を取るようにする ◦ 長い処理のメソッドを均一の粒度に分割する ◦ etc…
原則4. ロジックとデータの一体化 Appendix パターンが従う6つの原則 • ロジックとそのロジックが操作するデータは近くに置くこと • 結果の局所化を順守すると必然的にロジックとデータは一体化する • 関連するロジックとデータは同じタイミングで変更することが多くなる
◦ これらが同じ場所にあれば変更の結果も局所化が保たれる • ただし、ロジックとデータをどこに置くべきかは最初から明確ではない場合がある ◦ コードに対する継続的な責務の見直しは大事だなというのが個人的な所感
原則5. 宣言型の表現 Appendix パターンが従う6つの原則 • 実装の詳細を書くよりこの処理が何をするかという意図を宣言する ◦ JavaScriptを例にすると、for文よりforEachメソッド ◦ Javaを例にすると、for文よりStream
• 命令型のプログラミングは制御とデータのフローを頭の中でイメージしながら読む 必要がある • 宣言型で表現されていれば読み手の認知負荷を大幅に抑えられる
原則6. 変更頻度 Appendix パターンが従う6つの原則 • 変更されるタイミングが異なるロジックやデータは分けておく • 変更されるタイミングが同じロジックやデータは同じ場所に置いておく • クラス内のプロパティはなるべく一緒のタイミングで変更されるべき
◦ あるメソッドの実行中にだけ変更されるプロパティは、プロパティにせずローカル変数にすべき • 税額計算のソフトウェアを例にすると... ◦ 一般的な計算ロジックのコードと、年ごとに固有なコードは一緒にせず分けておく