SlideShare a Scribd company logo
1 of 57
Download to read 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
本文:個人で
リーダブルコードを書く方法
✓
解説:チームで
リーダブルコードを書く方法
✓

More Related Content

What's hot

なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - 健人 井関
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話Yoshinori Matsunobu
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐkwatch
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀増田 亨
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話Takuto Wada
 
The only one big thing every programmer should know
The only one big thing every programmer should knowThe only one big thing every programmer should know
The only one big thing every programmer should knowTakuto Wada
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビューTakafumi ONAKA
 
GroongaでRedmineを高速全文検索
GroongaでRedmineを高速全文検索GroongaでRedmineを高速全文検索
GroongaでRedmineを高速全文検索Kouhei Sutou
 
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話Yoshitaka Kawashima
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことgree_tech
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0Masakazu Matsushita
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
Unified JVM Logging
Unified JVM LoggingUnified JVM Logging
Unified JVM LoggingYuji Kubota
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)Koichiro Matsuoka
 
社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみたIosif Takakura
 
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~hideakikabuto
 

What's hot (20)

なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
The only one big thing every programmer should know
The only one big thing every programmer should knowThe only one big thing every programmer should know
The only one big thing every programmer should know
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
GroongaでRedmineを高速全文検索
GroongaでRedmineを高速全文検索GroongaでRedmineを高速全文検索
GroongaでRedmineを高速全文検索
 
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
Unified JVM Logging
Unified JVM LoggingUnified JVM Logging
Unified JVM Logging
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
 
社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた
 
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
 

Viewers also liked

[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
 

Viewers also liked (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で作る消費電力モニタリングシステム
 
モーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみるモーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみる
 

Similar to 名著『リーダブルコード』を解説者と一緒に読み解こう - 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
 

Similar to 名著『リーダブルコード』を解説者と一緒に読み解こう - 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
 
よい名前を付けましょう リーダブルなんたらとか
よい名前を付けましょう   リーダブルなんたらとかよい名前を付けましょう   リーダブルなんたらとか
よい名前を付けましょう リーダブルなんたらとか
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦う
 

More from 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
 

More from 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!
 

Recently uploaded

持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 

Recently uploaded (11)

持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 

名著『リーダブルコード』を解説者と一緒に読み解こう - 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 本文:個人で リーダブルコードを書く方法 ✓ 解説:チームで リーダブルコードを書く方法 ✓