SlideShare uma empresa Scribd logo
1 de 57
Baixar para ler offline
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
リーダブルコードを
読み解こう
7章 制御フローを読みやすくする
須藤功平
株式会社クリアコード
schoo
2015-04-03
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
質問(1)
前回の授業は…
A:参加した✓
B:参加できなかった
(都合が合わなかった、知らなかったなど)
✓
C:知っていたが参加していない✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
質問(2)
プログラミングについて
A:未経験✓
B:学習中(schooや学校、独学など)✓
C:趣味・仕事でたまに書く
(趣味でWebサイトを作っている、職業がデザイナーなど)
✓
D:趣味・仕事でバリバリ書く
(趣味でOSSを開発している、職業がエンジニアなど)
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
質問(3)
リーダブルコード(本)を…
A:読んだ✓
B:読んでいる✓
C:まだ読んでいない✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
内容
自己紹介✓
リーダブルコードとは✓
実例で考えよう✓
実際の改善にチャレンジ!✓
まとめ✓
質疑応答✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
自己紹介(1)
リーダブルコードの
「解説」の著者
http://www.clear-code.com/blog/2012/6/11.html
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
自己紹介(2)
クリアコードの代表取締役
「クリア」な(意図が明確な)
「コード」を大事にする
ソフトウェア開発会社
✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
自己紹介(3)
毎日コードを書いている
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
リーダブルコードとは(1)
本書の目的は、君のコードを
よくすることだ
[「はじめに p. x」より引用]
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
リーダブルコードとは(2)
その中心となるのは、コード
は理解しやすくなければいけな
いという考えだ
[「はじめに p. x」より引用]
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
リーダブルコードとは(3)
「コードを理解する」という
のは、変更を加えたりバグを見
つけたりできるという意味
[「1.2 読みやすさの基本定理 p. 3」より引用]
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
リーダブルコード
読む人が…
変更できるコード✓
バグを見つけられるコード✓
↓
読む人視点!
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
何をしているコード?
Node* node = list->head;
if (node == NULL) return;
while (node->next != NULL) {
Print(node->data);
node = node->next;
}
if (node != NULL) Print(node->data);
「優れた」コードって何? p. 2より
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
何をしているコード?
for (Node* node = list->head;
node != NULL;
node = node->next)
Print(node->data);
「優れた」コードって何? p. 2より
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
どちらがリーダブル?
// どちらがリーダブルコード?どうして?
// リーダブルコード:変更できる・バグを見つけられるコード
// A // B
Node* node = list->head; | for (Node* node = list->head;
if (node == NULL) return; | node != NULL;
while (node->next != NULL) { | node = node->next)
Print(node->data); | Print(node->data);
node = node->next; |
} |
if (node != NULL) |
Print(node->data); |
「優れた」コードって何? p. 2より
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
実例で考えよう
7章
「制御フローを読みやすくする」
より
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.1 例:式の並び順(1)
/* A */
if (length >= 10)
/* B */
if (10 <= length)
どちらがリーダブル?
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.1 例:式の並び順(2)
/* A */
while (bytes_received < bytes_expected)
/* B */
while (bytes_expected > bytes_received)
どちらがリーダブル?
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.1 式の並び順の指針
左側
「調査対象」の式。変化する。✓
length, bytes_received✓
✓
右側
「比較対象」の式。変化しにくい。✓
10, bytes_expected✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.1 指針に沿った並び順
/* ↓調査対象。変化する。 */
if (length >= 10)
/* ↑比較対象。変化しない。 */
/* ↓調査対象 */
while (bytes_received < bytes_expected)
/* ↑比較対象 */
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.1 指針の理由
自然言語の並び順に近い
/* もし長さが10以上なら */
if (length >= 10)
/* もし10が長さ以下なら */
if (10 <= length)
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:別の指針
左側
小さい値✓
✓
右側
大きい値✓
✓
左から右にいくほど
大きくなることは自然
(例:数直線)
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:指針に沿った並び順
使う比較演算子は「<」と「<=」
if (10 <= length)
while (bytes_received < bytes_expected)
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.1:まとめ
条件式内の並び順を工夫すると
リーダブル度があがる
✓
指針:
左側:変化する式✓
右側:変化しにくい式✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.2 例:処理の順番(1)
/* どちらがリーダブル? */
/* A */ | /* B */
if (a == b) { | if (a != b) {
/* ケース1 */ | /* ケース2 */
} else { | } else {
/* ケース2 */ | /* ケース1 */
} | }
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.2 例:処理の順番(1)
/* A:条件が肯定形だから */
/* A */ | /* B */
if (a == b) { | if (a != b) {
/* ケース1 */ | /* ケース2 */
} else { | } else {
/* ケース2 */ | /* ケース1 */
} | }
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.2 例:処理の順番(2)
/* どちらがリーダブル? */
/* (ケース1の方が処理が長い) */
/* A */ | /* B */
if (a == b) { | if (a != b) {
/* ケース1 */ | /* ケース2 */
/* ... */ | } else {
/* ... */ | /* ケース1 */
} else { | /* ... */
/* ケース2 */ | /* ... */
} | }
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.2 例:処理の順番(2)
/* B:単純な処理の条件が先 */
/* if/elseを一望しやすい */
/* A */ | /* B */
if (a == b) { | if (a != b) {
/* ケース1 */ | /* ケース2 */
/* ... */ | } else {
/* ... */ | /* ケース1 */
} else { | /* ... */
/* ケース2 */ | /* ... */
} | }
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.2 指針
否定形は肯定形にして書く
if (!debug)よりif (debug)✓
✓
単純な処理の条件を先に書く
ifとelseを一望できて読みやすい✓
✓
関心を引く条件を先に書く✓
目立つ条件を先に書く✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.2 指針:注意
同時に満たせないことがある✓
自分で優劣を判断すること✓
優劣は明確になることが多い✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.2 判断してみよう
if (!url.HasQueryParameter("expand_all")) {
response.Render(items);
// ...
} else {
for (int i = 0; i < items.size(); i++) {
items[i].Expand();
}
// ...
}
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.2 !を外して順番を逆に
// 関心を引く条件「expand_all」を優先
// (肯定形になったのはおまけ)
if (url.HasQueryParameter("expand_all")) {
for (int i = 0; i < items.size(); i++) {
items[i].Expand();
}
// ...
} else {
response.Render(items);
// ...
}
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.2 まとめ
処理する条件の順番次第で
リーダブル度があがる
✓
指針:
否定形は肯定形にして書く✓
単純な条件を先に書く✓
関心がある・目立つ条件を先に書く✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.5 関数から早く返す
「ガード節」
public boolean Contains(String str, String substr) {
if (str == null || substr == null) // ガード節
return false;
if (substr.equals("")) // ガード節
return true;
// 大事な処理だけに興味があるなら↑までは無視可能。
// 大事な処理は↓から。
// ...
}
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.5 ガード節なし
public boolean Contains(String str, String substr) {
if (str == null || substr == null) {
return false; // 異常値
} else {
if (substr.equals("")) {
return true; // 特別値
} else {
// 大事な処理はここ。ネストが深い。
// ...
}
}
}
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
7.5 ガード節の効果
以降の処理が単純になる
異常値・特別値を考慮しなくてよい✓
→考える事が減る✓
✓
ネストが浅くなる
→コードの見通しがよくなる✓
✓
リーダブルコードにつながる!
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:ifとreturnの使い方
ifとreturnの使い方
ククログ(2012-03-28)
http://www.clear-code.com/blog/2012/3/28.html
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:パス
同じ処理でも流れ(パス)は違う
if 条件 | return if !条件
サブ処理 |
end | サブ処理
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:パスとリーダブル
パス
処理を実行するときの流れ✓
コードを読むときの流れでもある✓
✓
読みやすい流れ
→リーダブル!✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:例(1)
def add_comment(post, user, text)
if post.hidden_from?(user)
report_access_error
else
comment = Comment.create(text)
post.add(comment)
end
end
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:例(1)コメント付き
# コメントを追加するメソッドだな!
def add_comment(post, user, text)
if post.hidden_from?(user) # ユーザーに見えない投稿なら…
report_access_error
# エラー処理か。ifの後にもなにか処理はあるのかな?
else
comment = Comment.create(text)
post.add(comment)
# ユーザーに見えるときだけコメント追加か。
# こうやってコメントを追加するんだな。
end # ifの後にはなにも処理はないんだな。
end
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:例(1)return付き
# コメントを追加するメソッドだな!
def add_comment(post, user, text)
if post.hidden_from?(user) # ユーザーに見えない投稿なら…
report_access_error # エラー処理をして、
return # それで終了か。
end
# エラー処理が終わったからここからは通常の処理だな。
comment = Comment.create(text)
post.add(comment) # こうやってコメントを追加するんだな!
end
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:例(1)まとめ
異常系と正常系の扱いを変える✓
異常系はすぐにreturn
エラー処理だけというのをアピール✓
✓
正常系はネストしない
正常系の方が重要なコード✓
重要なコードは見やすい場所に✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:例(2)
def prepare_database(path)
if not File.exist?(path)
return Database.create(path)
end
Database.open(path)
end
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:例(2)コメント付き
# データベースを準備するんだな
def prepare_database(path)
if not File.exist?(path) # なかったら…
# 作ってすぐに終了か。あれ、作るのも普通の「準備」なような…
return Database.create(path)
end
# あったら開くのか。これも「準備」だよなぁ。
# なにか特別な意図があるんだろうか…
Database.open(path)
end
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:例(2)returnなし
# データベースを準備するんだな
def prepare_database(path)
if File.exist?(path) # あったら…
Database.open(path) # 開いて
else # なかったら…
Database.create(path) # 作るのか
end
end
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
番外:例(2)まとめ
正常系同士の扱いを変えない
変えると意図があると勘違いする✓
「Aの処理は何か特別なのかも…」✓
✓
なんでもガード節にしない
特別なケースや異常系のときだけ✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
他の例
三項演算子✓
ネストを浅くする✓
…✓
(詳細は本を買ってください)✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
実際の改善にチャレンジ!
// 読みやすい制御フローにして投稿・よい投稿に「いいね!」して応援
function positiveIntegerSum(n) { // n以下の正の整数の合計を返す
if (0 >= n) { // ヒント:
return -1; // エラー // 1. 条件式の並び順
} else { // * 左に変化するもの
var total = 0; // * 右に変化しにくいもの
for (; n > 0; n--) { // 2. 処理する条件の順番
total += n; // * 肯定形で書く
} // * 単純な条件を先に書く
return total; // * 関心がある条件を先に書く
} // * 目立つ条件を先に書く
} // 3. ガード節
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
まとめ(1)
リーダブルコードとは
変更できるコード✓
バグを見つけられるコード✓
↑は読む人視点✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
まとめ(2)
「読みやすい制御フロー」を
考えた
条件式内の並び順
→左に変化するもの・右に変化しにくいもの✓
✓
処理する条件の順番
→肯定形で書く・単純な条件を先に書くなど✓
✓
ガード節
→特別なケースはすぐにreturn✓
✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
まとめ(3)
実際の改善にチャレンジした
「読む人が理解しやすいか?」を
とことん考えたはず
✓
✓
行数を短くするよりも、他の
人が理解するのにかかる時間を
短くする。
[「7章 制御フローを読みやすくする p. 89」より引用]
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
これから(1)
これからも読む人のことを
考えてコードを書こう
✓
読む人のことを考えるには?
読む経験をたくさん積む✓
たくさんコードを読もう✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
これから(2)
たくさんコードを読むコツ
コードから学ぶ気持ちで読む✓
×悪いこと探し✓
○いいこと探し✓
✓
読むコード
オススメは自分が使っているOSS✓
↑動作を知っているから読みやすい✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
悪いコード
見つけやすい
異質✓
リーダブルじゃない✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
よいコード
見つけにくい
リーダブルだから✓
すーっと理解できてひっかからない✓
✓
これからのチャレンジ
意識して見つけよう!✓
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
これから(3)
「解説」を読む
http://www.clear-code.com/blog/2012/6/11.html
本文:個人で
リーダブルコードを書く方法
✓
解説:チームで
リーダブルコードを書く方法
✓

Mais conteúdo relacionado

Mais procurados

Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころJunya Hayashi
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するshigeki_ohtsu
 
Deep dive into swift UI
Deep dive into swift UIDeep dive into swift UI
Deep dive into swift UIOsamaGamal26
 
Domain Driven Design Made Functional with Python
Domain Driven Design Made Functional with Python Domain Driven Design Made Functional with Python
Domain Driven Design Made Functional with Python Jean Carlo Machado
 
Swift UI - Declarative Programming [Pramati Technologies]
Swift UI - Declarative Programming [Pramati Technologies]Swift UI - Declarative Programming [Pramati Technologies]
Swift UI - Declarative Programming [Pramati Technologies]Pramati Technologies
 
UMLモデルを使った自動生成
UMLモデルを使った自動生成UMLモデルを使った自動生成
UMLモデルを使った自動生成Norihito Ohshima
 
Exploring ZIO Prelude: The game changer for typeclasses in Scala
Exploring ZIO Prelude: The game changer for typeclasses in ScalaExploring ZIO Prelude: The game changer for typeclasses in Scala
Exploring ZIO Prelude: The game changer for typeclasses in ScalaJorge Vásquez
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと増田 亨
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門増田 亨
 
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割Recruit Lifestyle Co., Ltd.
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方増田 亨
 
Swift in SwiftUI
Swift in SwiftUISwift in SwiftUI
Swift in SwiftUIBongwon Lee
 
Inversion of Control and Dependency Injection
Inversion of Control and Dependency InjectionInversion of Control and Dependency Injection
Inversion of Control and Dependency InjectionDinesh Sharma
 
最近、僕がハマったFuelPHPの紹介
最近、僕がハマったFuelPHPの紹介最近、僕がハマったFuelPHPの紹介
最近、僕がハマったFuelPHPの紹介Naoto Mawatari
 

Mais procurados (20)

Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 
Deep dive into swift UI
Deep dive into swift UIDeep dive into swift UI
Deep dive into swift UI
 
Stack pivot
Stack pivotStack pivot
Stack pivot
 
Domain Driven Design Made Functional with Python
Domain Driven Design Made Functional with Python Domain Driven Design Made Functional with Python
Domain Driven Design Made Functional with Python
 
Swift UI - Declarative Programming [Pramati Technologies]
Swift UI - Declarative Programming [Pramati Technologies]Swift UI - Declarative Programming [Pramati Technologies]
Swift UI - Declarative Programming [Pramati Technologies]
 
UMLモデルを使った自動生成
UMLモデルを使った自動生成UMLモデルを使った自動生成
UMLモデルを使った自動生成
 
Kotlinアンチパターン
KotlinアンチパターンKotlinアンチパターン
Kotlinアンチパターン
 
Exploring ZIO Prelude: The game changer for typeclasses in Scala
Exploring ZIO Prelude: The game changer for typeclasses in ScalaExploring ZIO Prelude: The game changer for typeclasses in Scala
Exploring ZIO Prelude: The game changer for typeclasses in Scala
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
Pythonのmain関数
Pythonのmain関数Pythonのmain関数
Pythonのmain関数
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
 
Swift in SwiftUI
Swift in SwiftUISwift in SwiftUI
Swift in SwiftUI
 
Swagger 入門
Swagger 入門Swagger 入門
Swagger 入門
 
Inversion of Control and Dependency Injection
Inversion of Control and Dependency InjectionInversion of Control and Dependency Injection
Inversion of Control and Dependency Injection
 
最近、僕がハマったFuelPHPの紹介
最近、僕がハマったFuelPHPの紹介最近、僕がハマったFuelPHPの紹介
最近、僕がハマったFuelPHPの紹介
 

Destaque

[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来Masahiro Nishimi
 
リーダブルコード
リーダブルコードリーダブルコード
リーダブルコードKeita Otsuka
 
Manage Myself
Manage MyselfManage Myself
Manage Myselfbash0C7
 
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェアプログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェアRyota Nakamura
 
YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 横河電機(株)
YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 	横河電機(株) YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 	横河電機(株)
YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 横河電機(株) 教育CSR大賞
 
20140910 Arduino for beginners
20140910 Arduino for beginners20140910 Arduino for beginners
20140910 Arduino for beginnersKenichi Ohwada
 
「納品のない受託開発」を支えるコードレビューの取り組み
「納品のない受託開発」を支えるコードレビューの取り組み「納品のない受託開発」を支えるコードレビューの取り組み
「納品のない受託開発」を支えるコードレビューの取り組みMasahiro Nishimi
 
Arduinoをこれから始める人のためのArduino紹介スライドβ版
Arduinoをこれから始める人のためのArduino紹介スライドβ版Arduinoをこれから始める人のためのArduino紹介スライドβ版
Arduinoをこれから始める人のためのArduino紹介スライドβ版Katsuhiro Morishita
 
平成25年社会人講座 Arduinoによるマイコン入門講座
平成25年社会人講座 Arduinoによるマイコン入門講座平成25年社会人講座 Arduinoによるマイコン入門講座
平成25年社会人講座 Arduinoによるマイコン入門講座Katsuhiro Morishita
 
リーダブルコード勉強会
リーダブルコード勉強会リーダブルコード勉強会
リーダブルコード勉強会norimatsu2012
 
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
 プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター) プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)Ryota Nakamura
 
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)Masahiro Nishimi
 
納品のない受託開発を支える レガシーコードを作らない仕組み
納品のない受託開発を支える レガシーコードを作らない仕組み納品のない受託開発を支える レガシーコードを作らない仕組み
納品のない受託開発を支える レガシーコードを作らない仕組みMasahiro Nishimi
 
Arduino 入門
Arduino 入門Arduino 入門
Arduino 入門mitunaga
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣Masahiro Nishimi
 
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステム
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステムPython, RaspberryPi, Arduinoで作る消費電力モニタリングシステム
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステムJunichi Kakisako
 
モーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみるモーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみるKeiichi Sakai
 

Destaque (19)

[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来
 
リーダブルコード
リーダブルコードリーダブルコード
リーダブルコード
 
Manage Myself
Manage MyselfManage Myself
Manage Myself
 
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェアプログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
 
YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 横河電機(株)
YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 	横河電機(株) YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 	横河電機(株)
YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 横河電機(株)
 
20140910 Arduino for beginners
20140910 Arduino for beginners20140910 Arduino for beginners
20140910 Arduino for beginners
 
計測計量の基礎   measuring
計測計量の基礎   measuring計測計量の基礎   measuring
計測計量の基礎   measuring
 
「納品のない受託開発」を支えるコードレビューの取り組み
「納品のない受託開発」を支えるコードレビューの取り組み「納品のない受託開発」を支えるコードレビューの取り組み
「納品のない受託開発」を支えるコードレビューの取り組み
 
Arduinoをこれから始める人のためのArduino紹介スライドβ版
Arduinoをこれから始める人のためのArduino紹介スライドβ版Arduinoをこれから始める人のためのArduino紹介スライドβ版
Arduinoをこれから始める人のためのArduino紹介スライドβ版
 
平成25年社会人講座 Arduinoによるマイコン入門講座
平成25年社会人講座 Arduinoによるマイコン入門講座平成25年社会人講座 Arduinoによるマイコン入門講座
平成25年社会人講座 Arduinoによるマイコン入門講座
 
リーダブルコード勉強会
リーダブルコード勉強会リーダブルコード勉強会
リーダブルコード勉強会
 
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
 プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター) プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
 
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
 
納品のない受託開発を支える レガシーコードを作らない仕組み
納品のない受託開発を支える レガシーコードを作らない仕組み納品のない受託開発を支える レガシーコードを作らない仕組み
納品のない受託開発を支える レガシーコードを作らない仕組み
 
Arduino 入門
Arduino 入門Arduino 入門
Arduino 入門
 
良いコードとは
良いコードとは良いコードとは
良いコードとは
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステム
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステムPython, RaspberryPi, Arduinoで作る消費電力モニタリングシステム
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステム
 
モーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみるモーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみる
 

Semelhante a 名著『リーダブルコード』を解説者と一緒に読み解こう - 7章 制御フローを読みやすくする

リーダブルコードを読んだ後
リーダブルコードを読んだ後リーダブルコードを読んだ後
リーダブルコードを読んだ後Kouhei Sutou
 
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こうKouhei Sutou
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
リーダブルコード勉強会 in 筑波大 - 練習
リーダブルコード勉強会 in 筑波大 - 練習リーダブルコード勉強会 in 筑波大 - 練習
リーダブルコード勉強会 in 筑波大 - 練習Kouhei Sutou
 
リーダブルコード勉強会 in 筑波大 - コードチェンジ
リーダブルコード勉強会 in 筑波大 - コードチェンジリーダブルコード勉強会 in 筑波大 - コードチェンジ
リーダブルコード勉強会 in 筑波大 - コードチェンジKouhei Sutou
 
SEゼミ2015 - OSS Hack 4 Beginners - フィードバック
SEゼミ2015 - OSS Hack 4 Beginners - フィードバックSEゼミ2015 - OSS Hack 4 Beginners - フィードバック
SEゼミ2015 - OSS Hack 4 Beginners - フィードバックKouhei Sutou
 
リーダブルコード 1.0'
リーダブルコード 1.0'リーダブルコード 1.0'
リーダブルコード 1.0'Yamamura Takashi
 
SEゼミ2015 - 練習
SEゼミ2015 - 練習SEゼミ2015 - 練習
SEゼミ2015 - 練習Kouhei Sutou
 
SEゼミ2015 - コードチェンジ
SEゼミ2015 - コードチェンジSEゼミ2015 - コードチェンジ
SEゼミ2015 - コードチェンジKouhei Sutou
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~CHY72
 
Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門晃 遠山
 
SEゼミ2014 - リーダブルコード勉強会のアイスブレイク
SEゼミ2014 - リーダブルコード勉強会のアイスブレイクSEゼミ2014 - リーダブルコード勉強会のアイスブレイク
SEゼミ2014 - リーダブルコード勉強会のアイスブレイクKouhei Sutou
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
リーダブルコードワークショップ(パイオニア向け)の概要
リーダブルコードワークショップ(パイオニア向け)の概要リーダブルコードワークショップ(パイオニア向け)の概要
リーダブルコードワークショップ(パイオニア向け)の概要Kouhei Sutou
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Hiro Yoshioka
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルにHiroko Tamagawa
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacksHiro Yoshioka
 
Let s database_testing
Let s database_testingLet s database_testing
Let s database_testingYuji Shimada
 
よい名前を付けましょう リーダブルなんたらとか
よい名前を付けましょう   リーダブルなんたらとかよい名前を付けましょう   リーダブルなんたらとか
よい名前を付けましょう リーダブルなんたらとかよしだ あつし
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦うYugo Shimizu
 

Semelhante a 名著『リーダブルコード』を解説者と一緒に読み解こう - 7章 制御フローを読みやすくする (20)

リーダブルコードを読んだ後
リーダブルコードを読んだ後リーダブルコードを読んだ後
リーダブルコードを読んだ後
 
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
リーダブルコード勉強会 in 筑波大 - 練習
リーダブルコード勉強会 in 筑波大 - 練習リーダブルコード勉強会 in 筑波大 - 練習
リーダブルコード勉強会 in 筑波大 - 練習
 
リーダブルコード勉強会 in 筑波大 - コードチェンジ
リーダブルコード勉強会 in 筑波大 - コードチェンジリーダブルコード勉強会 in 筑波大 - コードチェンジ
リーダブルコード勉強会 in 筑波大 - コードチェンジ
 
SEゼミ2015 - OSS Hack 4 Beginners - フィードバック
SEゼミ2015 - OSS Hack 4 Beginners - フィードバックSEゼミ2015 - OSS Hack 4 Beginners - フィードバック
SEゼミ2015 - OSS Hack 4 Beginners - フィードバック
 
リーダブルコード 1.0'
リーダブルコード 1.0'リーダブルコード 1.0'
リーダブルコード 1.0'
 
SEゼミ2015 - 練習
SEゼミ2015 - 練習SEゼミ2015 - 練習
SEゼミ2015 - 練習
 
SEゼミ2015 - コードチェンジ
SEゼミ2015 - コードチェンジSEゼミ2015 - コードチェンジ
SEゼミ2015 - コードチェンジ
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門
 
SEゼミ2014 - リーダブルコード勉強会のアイスブレイク
SEゼミ2014 - リーダブルコード勉強会のアイスブレイクSEゼミ2014 - リーダブルコード勉強会のアイスブレイク
SEゼミ2014 - リーダブルコード勉強会のアイスブレイク
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
リーダブルコードワークショップ(パイオニア向け)の概要
リーダブルコードワークショップ(パイオニア向け)の概要リーダブルコードワークショップ(パイオニア向け)の概要
リーダブルコードワークショップ(パイオニア向け)の概要
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacks
 
Let s database_testing
Let s database_testingLet s database_testing
Let s database_testing
 
よい名前を付けましょう リーダブルなんたらとか
よい名前を付けましょう   リーダブルなんたらとかよい名前を付けましょう   リーダブルなんたらとか
よい名前を付けましょう リーダブルなんたらとか
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦う
 

Mais de Kouhei Sutou

RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowRubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowKouhei Sutou
 
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Kouhei Sutou
 
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowRubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowKouhei Sutou
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアKouhei Sutou
 
Apache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかApache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかKouhei Sutou
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataKouhei Sutou
 
Redmine検索の未来像
Redmine検索の未来像Redmine検索の未来像
Redmine検索の未来像Kouhei Sutou
 
Apache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataApache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataKouhei Sutou
 
Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Kouhei Sutou
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームKouhei Sutou
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムMySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムKouhei Sutou
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroongaKouhei Sutou
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Kouhei Sutou
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムKouhei Sutou
 
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!Kouhei Sutou
 

Mais de Kouhei Sutou (20)

RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowRubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
 
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
 
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowRubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェア
 
Apache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかApache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのか
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory data
 
Apache Arrow 2019
Apache Arrow 2019Apache Arrow 2019
Apache Arrow 2019
 
Redmine検索の未来像
Redmine検索の未来像Redmine検索の未来像
Redmine検索の未来像
 
Apache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataApache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory data
 
Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムMySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroonga
 
My way with Ruby
My way with RubyMy way with Ruby
My way with Ruby
 
Red Data Tools
Red Data ToolsRed Data Tools
Red Data Tools
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システム
 
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!
 

Último

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 

Último (9)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 

名著『リーダブルコード』を解説者と一緒に読み解こう - 7章 制御フローを読みやすくする

  • 1. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 リーダブルコードを 読み解こう 7章 制御フローを読みやすくする 須藤功平 株式会社クリアコード schoo 2015-04-03
  • 2. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 質問(1) 前回の授業は… A:参加した✓ B:参加できなかった (都合が合わなかった、知らなかったなど) ✓ C:知っていたが参加していない✓
  • 3. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 質問(2) プログラミングについて A:未経験✓ B:学習中(schooや学校、独学など)✓ C:趣味・仕事でたまに書く (趣味でWebサイトを作っている、職業がデザイナーなど) ✓ D:趣味・仕事でバリバリ書く (趣味でOSSを開発している、職業がエンジニアなど) ✓
  • 4. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 質問(3) リーダブルコード(本)を… A:読んだ✓ B:読んでいる✓ C:まだ読んでいない✓
  • 5. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 内容 自己紹介✓ リーダブルコードとは✓ 実例で考えよう✓ 実際の改善にチャレンジ!✓ まとめ✓ 質疑応答✓
  • 6. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 自己紹介(1) リーダブルコードの 「解説」の著者 http://www.clear-code.com/blog/2012/6/11.html ✓
  • 7. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 自己紹介(2) クリアコードの代表取締役 「クリア」な(意図が明確な) 「コード」を大事にする ソフトウェア開発会社 ✓ ✓
  • 8. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 自己紹介(3) 毎日コードを書いている
  • 9. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 リーダブルコードとは(1) 本書の目的は、君のコードを よくすることだ [「はじめに p. x」より引用]
  • 10. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 リーダブルコードとは(2) その中心となるのは、コード は理解しやすくなければいけな いという考えだ [「はじめに p. x」より引用]
  • 11. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 リーダブルコードとは(3) 「コードを理解する」という のは、変更を加えたりバグを見 つけたりできるという意味 [「1.2 読みやすさの基本定理 p. 3」より引用]
  • 12. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 リーダブルコード 読む人が… 変更できるコード✓ バグを見つけられるコード✓ ↓ 読む人視点!
  • 13. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 何をしているコード? Node* node = list->head; if (node == NULL) return; while (node->next != NULL) { Print(node->data); node = node->next; } if (node != NULL) Print(node->data); 「優れた」コードって何? p. 2より
  • 14. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 何をしているコード? for (Node* node = list->head; node != NULL; node = node->next) Print(node->data); 「優れた」コードって何? p. 2より
  • 15. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 どちらがリーダブル? // どちらがリーダブルコード?どうして? // リーダブルコード:変更できる・バグを見つけられるコード // A // B Node* node = list->head; | for (Node* node = list->head; if (node == NULL) return; | node != NULL; while (node->next != NULL) { | node = node->next) Print(node->data); | Print(node->data); node = node->next; | } | if (node != NULL) | Print(node->data); | 「優れた」コードって何? p. 2より
  • 16. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 実例で考えよう 7章 「制御フローを読みやすくする」 より
  • 17. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.1 例:式の並び順(1) /* A */ if (length >= 10) /* B */ if (10 <= length) どちらがリーダブル?
  • 18. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.1 例:式の並び順(2) /* A */ while (bytes_received < bytes_expected) /* B */ while (bytes_expected > bytes_received) どちらがリーダブル?
  • 19. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.1 式の並び順の指針 左側 「調査対象」の式。変化する。✓ length, bytes_received✓ ✓ 右側 「比較対象」の式。変化しにくい。✓ 10, bytes_expected✓ ✓
  • 20. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.1 指針に沿った並び順 /* ↓調査対象。変化する。 */ if (length >= 10) /* ↑比較対象。変化しない。 */ /* ↓調査対象 */ while (bytes_received < bytes_expected) /* ↑比較対象 */
  • 21. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.1 指針の理由 自然言語の並び順に近い /* もし長さが10以上なら */ if (length >= 10) /* もし10が長さ以下なら */ if (10 <= length)
  • 22. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:別の指針 左側 小さい値✓ ✓ 右側 大きい値✓ ✓ 左から右にいくほど 大きくなることは自然 (例:数直線)
  • 23. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:指針に沿った並び順 使う比較演算子は「<」と「<=」 if (10 <= length) while (bytes_received < bytes_expected)
  • 24. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.1:まとめ 条件式内の並び順を工夫すると リーダブル度があがる ✓ 指針: 左側:変化する式✓ 右側:変化しにくい式✓ ✓
  • 25. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 例:処理の順番(1) /* どちらがリーダブル? */ /* A */ | /* B */ if (a == b) { | if (a != b) { /* ケース1 */ | /* ケース2 */ } else { | } else { /* ケース2 */ | /* ケース1 */ } | }
  • 26. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 例:処理の順番(1) /* A:条件が肯定形だから */ /* A */ | /* B */ if (a == b) { | if (a != b) { /* ケース1 */ | /* ケース2 */ } else { | } else { /* ケース2 */ | /* ケース1 */ } | }
  • 27. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 例:処理の順番(2) /* どちらがリーダブル? */ /* (ケース1の方が処理が長い) */ /* A */ | /* B */ if (a == b) { | if (a != b) { /* ケース1 */ | /* ケース2 */ /* ... */ | } else { /* ... */ | /* ケース1 */ } else { | /* ... */ /* ケース2 */ | /* ... */ } | }
  • 28. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 例:処理の順番(2) /* B:単純な処理の条件が先 */ /* if/elseを一望しやすい */ /* A */ | /* B */ if (a == b) { | if (a != b) { /* ケース1 */ | /* ケース2 */ /* ... */ | } else { /* ... */ | /* ケース1 */ } else { | /* ... */ /* ケース2 */ | /* ... */ } | }
  • 29. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 指針 否定形は肯定形にして書く if (!debug)よりif (debug)✓ ✓ 単純な処理の条件を先に書く ifとelseを一望できて読みやすい✓ ✓ 関心を引く条件を先に書く✓ 目立つ条件を先に書く✓
  • 30. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 指針:注意 同時に満たせないことがある✓ 自分で優劣を判断すること✓ 優劣は明確になることが多い✓
  • 31. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 判断してみよう if (!url.HasQueryParameter("expand_all")) { response.Render(items); // ... } else { for (int i = 0; i < items.size(); i++) { items[i].Expand(); } // ... }
  • 32. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 !を外して順番を逆に // 関心を引く条件「expand_all」を優先 // (肯定形になったのはおまけ) if (url.HasQueryParameter("expand_all")) { for (int i = 0; i < items.size(); i++) { items[i].Expand(); } // ... } else { response.Render(items); // ... }
  • 33. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 まとめ 処理する条件の順番次第で リーダブル度があがる ✓ 指針: 否定形は肯定形にして書く✓ 単純な条件を先に書く✓ 関心がある・目立つ条件を先に書く✓ ✓
  • 34. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.5 関数から早く返す 「ガード節」 public boolean Contains(String str, String substr) { if (str == null || substr == null) // ガード節 return false; if (substr.equals("")) // ガード節 return true; // 大事な処理だけに興味があるなら↑までは無視可能。 // 大事な処理は↓から。 // ... }
  • 35. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.5 ガード節なし public boolean Contains(String str, String substr) { if (str == null || substr == null) { return false; // 異常値 } else { if (substr.equals("")) { return true; // 特別値 } else { // 大事な処理はここ。ネストが深い。 // ... } } }
  • 36. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.5 ガード節の効果 以降の処理が単純になる 異常値・特別値を考慮しなくてよい✓ →考える事が減る✓ ✓ ネストが浅くなる →コードの見通しがよくなる✓ ✓ リーダブルコードにつながる!
  • 37. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:ifとreturnの使い方 ifとreturnの使い方 ククログ(2012-03-28) http://www.clear-code.com/blog/2012/3/28.html
  • 38. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:パス 同じ処理でも流れ(パス)は違う if 条件 | return if !条件 サブ処理 | end | サブ処理
  • 39. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:パスとリーダブル パス 処理を実行するときの流れ✓ コードを読むときの流れでもある✓ ✓ 読みやすい流れ →リーダブル!✓ ✓
  • 40. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(1) def add_comment(post, user, text) if post.hidden_from?(user) report_access_error else comment = Comment.create(text) post.add(comment) end end
  • 41. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(1)コメント付き # コメントを追加するメソッドだな! def add_comment(post, user, text) if post.hidden_from?(user) # ユーザーに見えない投稿なら… report_access_error # エラー処理か。ifの後にもなにか処理はあるのかな? else comment = Comment.create(text) post.add(comment) # ユーザーに見えるときだけコメント追加か。 # こうやってコメントを追加するんだな。 end # ifの後にはなにも処理はないんだな。 end
  • 42. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(1)return付き # コメントを追加するメソッドだな! def add_comment(post, user, text) if post.hidden_from?(user) # ユーザーに見えない投稿なら… report_access_error # エラー処理をして、 return # それで終了か。 end # エラー処理が終わったからここからは通常の処理だな。 comment = Comment.create(text) post.add(comment) # こうやってコメントを追加するんだな! end
  • 43. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(1)まとめ 異常系と正常系の扱いを変える✓ 異常系はすぐにreturn エラー処理だけというのをアピール✓ ✓ 正常系はネストしない 正常系の方が重要なコード✓ 重要なコードは見やすい場所に✓ ✓
  • 44. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(2) def prepare_database(path) if not File.exist?(path) return Database.create(path) end Database.open(path) end
  • 45. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(2)コメント付き # データベースを準備するんだな def prepare_database(path) if not File.exist?(path) # なかったら… # 作ってすぐに終了か。あれ、作るのも普通の「準備」なような… return Database.create(path) end # あったら開くのか。これも「準備」だよなぁ。 # なにか特別な意図があるんだろうか… Database.open(path) end
  • 46. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(2)returnなし # データベースを準備するんだな def prepare_database(path) if File.exist?(path) # あったら… Database.open(path) # 開いて else # なかったら… Database.create(path) # 作るのか end end
  • 47. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(2)まとめ 正常系同士の扱いを変えない 変えると意図があると勘違いする✓ 「Aの処理は何か特別なのかも…」✓ ✓ なんでもガード節にしない 特別なケースや異常系のときだけ✓ ✓
  • 48. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 他の例 三項演算子✓ ネストを浅くする✓ …✓ (詳細は本を買ってください)✓
  • 49. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 実際の改善にチャレンジ! // 読みやすい制御フローにして投稿・よい投稿に「いいね!」して応援 function positiveIntegerSum(n) { // n以下の正の整数の合計を返す if (0 >= n) { // ヒント: return -1; // エラー // 1. 条件式の並び順 } else { // * 左に変化するもの var total = 0; // * 右に変化しにくいもの for (; n > 0; n--) { // 2. 処理する条件の順番 total += n; // * 肯定形で書く } // * 単純な条件を先に書く return total; // * 関心がある条件を先に書く } // * 目立つ条件を先に書く } // 3. ガード節
  • 50. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 まとめ(1) リーダブルコードとは 変更できるコード✓ バグを見つけられるコード✓ ↑は読む人視点✓ ✓
  • 51. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 まとめ(2) 「読みやすい制御フロー」を 考えた 条件式内の並び順 →左に変化するもの・右に変化しにくいもの✓ ✓ 処理する条件の順番 →肯定形で書く・単純な条件を先に書くなど✓ ✓ ガード節 →特別なケースはすぐにreturn✓ ✓ ✓
  • 52. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 まとめ(3) 実際の改善にチャレンジした 「読む人が理解しやすいか?」を とことん考えたはず ✓ ✓ 行数を短くするよりも、他の 人が理解するのにかかる時間を 短くする。 [「7章 制御フローを読みやすくする p. 89」より引用]
  • 53. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 これから(1) これからも読む人のことを 考えてコードを書こう ✓ 読む人のことを考えるには? 読む経験をたくさん積む✓ たくさんコードを読もう✓ ✓
  • 54. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 これから(2) たくさんコードを読むコツ コードから学ぶ気持ちで読む✓ ×悪いこと探し✓ ○いいこと探し✓ ✓ 読むコード オススメは自分が使っているOSS✓ ↑動作を知っているから読みやすい✓ ✓
  • 55. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 悪いコード 見つけやすい 異質✓ リーダブルじゃない✓ ✓
  • 56. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 よいコード 見つけにくい リーダブルだから✓ すーっと理解できてひっかからない✓ ✓ これからのチャレンジ 意識して見つけよう!✓ ✓
  • 57. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 これから(3) 「解説」を読む http://www.clear-code.com/blog/2012/6/11.html 本文:個人で リーダブルコードを書く方法 ✓ 解説:チームで リーダブルコードを書く方法 ✓