Rabbit Slide Show

名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう

2014-12-09

Description

2014年12月9日(火)21:00-22:00に実施する授業の資料です。今回は「3章 誤解されない名前」を読みながら、よい名前のつけ方について学びます。

Text

Page: 1

リーダブルコードを
読み解こう
3章 誤解されない名前
須藤功平
株式会社クリアコード
schoo
2014/12/9
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 2

質問(1)
プログラミングについて
✓ A:未経験
✓ B:学習中 (schooや学校、独学など)
✓ C:趣味・仕事でたまに書く
(趣味でWebサイトを作っている、職業がデザイナーなど)
✓ D:趣味・仕事でバリバリ書く
(趣味でOSSを開発している、職業がエンジニアなど)
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 3

質問(2)
リーダブルコード(本)を…
✓ A:読んだ
✓ B:読んでいる
✓ C:まだ読んでいない
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 4

内容
✓ 自己紹介
✓ リーダブルコードとは
✓ 実例で考えよう
✓ 実際の改善にチャレンジ!
✓ まとめ
✓ 質疑応答
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 5

自己紹介(1)
✓ リーダブルコードの
「解説」の著者
http://www.clear-code.com/blog/2012/6/11.html
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 6

自己紹介(2)
✓ クリアコードの代表取締役
✓ 「クリア」な(意図が明確な)
「コード」を大事にする
ソフトウェア開発会社
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 7

自己紹介(3)
毎日コードを書いている
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 8

リーダブルコードとは(1)
本書の目的は、君のコードを
よくすることだ
[「はじめに p. x」より引用]
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 9

リーダブルコードとは(2)
その中心となるのは、コード
は理解しやすくなければいけな
いという考えだ
[「はじめに p. x」より引用]
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 10

リーダブルコードとは(3)
「コードを理解する」という
のは、変更を加えたりバグを見
つけたりできるという意味
[「1.2 読みやすさの基本定理 p. 3」より引用]
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 11

リーダブルコード
✓ 変更できるコード
✓ バグを見つけられるコード
↓
読む人視点!
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 12

何をしているコード?
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より
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 13

何をしているコード?
for (Node* node = list->head;
node != NULL;
node = node->next)
Print(node->data);
「優れた」コードって何? p. 2より
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 14

どちらがリーダブル?
// どちらがリーダブルコード?どうして?
// リーダブルコード:変更できる・バグを見つけられるコード
// A.
Node* node = list->head;
if (node == NULL) return;
while (node->next != NULL) {
Print(node->data);
node = node->next;
}
if (node != NULL) Print(node->data);
// B.
for (Node* node = list->head; node != NULL; node = node->next)
Print(node->data);
「優れた」コードって何? p. 2より
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 15

実例で考えよう
3章「誤解されない名前」
より
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 16

3.1 例:filter()(1)
results =
Database.all_objects.filter("year <= 2011")
resultsはなに?
✓ 2011年以前のレコード?
✓ 2012年以降のレコード?
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 17

3.1 例:filter()(2)
✓ filterはあいまいな言葉
✓ 選択する→select()
✓ 除外する→exclude()
select("year <= 2011")
exclude("year <= 2011")
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 18

番外1:sort()(1)
✓ どっちの名前がよい?
✓ sort()
✓ quick_sort()/merge_sort()
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 19

番外1:sort()(2)
✓ ソートすることが重要
✓ sort()
✓ ソート方法が重要
✓ quick_sort()/merge_sort()
ヒント:抽象化・カプセル化
(abstraction barrier, abstraction layer)
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 20

3.2 例:Clip()(1)
# textの最後を切り落として、
# 「...」をつける
def Clip(text, length):
✓ 最後からlength文字を削除する?
✓ 最大length文字まで切り詰める?
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 21

3.2 例:Clip()(2)
切り詰めるなら:Clip→Truncate
def Clip(text, length):
# ↓
def Truncate(text, length):
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 22

3.2 例:Clip()(3)
最大length文字なら:maxをつける
def Truncate(text, length):
# ↓
def Truncate(text, max_length):
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 23

3.2 例:Clip()(4)
最大length文字なら:
length→chars
def Truncate(text, max_length):
# ↓
def Truncate(text, max_chars):
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 24

番外2:add()(1)
✓ どの名前がよい?
✓ add()
✓ append()/prepend()
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 25

番外2:add()(2)
✓ 追加することが重要
例:集合に追加するとき
✓ add()
✓ 追加する場所が重要
例:リストに追加するとき
✓ append()/prepend()
ヒント:抽象化・カプセル化
(abstraction barrier, abstraction layer)
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 26

3.3 限界値(1)
ショッピングカートに入る商品が
最大10点のケース
CART_TOO_BIG_LIMIT = 10
if cart.num_items() >= CART_TOO_BIG_LIMIT:
Error("カートにある商品数が多すぎます。")
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 27

3.3 限界値(2)
バグあり!
9点までしか入らない
CART_TOO_BIG_LIMIT = 10
if cart.num_items() >= CART_TOO_BIG_LIMIT:
Error("カートにある商品数が多すぎます。")
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 28

3.3 限界値(3)
✓ CART_TOO_BIG_LIMITはあいまい
✓ 未満?以下?→境界値の情報がない
✓ MAX_ITEMS_IN_CARTは明確
✓ この値が最大値(境界値を含む)
✓ 最大値のときはmaxを使おう!
(最小値のときはmin)
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 29

3.3 限界値(4)
# CART_TOO_BIG_LIMIT = 10
# if cart.num_items() >= CART_TOO_BIG_LIMIT:
#
Error("カートにある商品数が多すぎます。")
MAX_ITEMS_IN_CART = 10
if cart.num_items() > MAX_ITEMS_IN_CART:
Error("カートにある商品数が多すぎます。")
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 30

他の例
✓ 範囲を指定するときは
firstとlastを使う
✓ 包含/排他的範囲には
beginとendを使う
✓ …
✓ (詳細は本を買ってください)
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 31

実際の改善にチャレンジ!
/* schooの学生名一覧を返す
引数は返す学生名の最大値 */
function student($num) {
/* 処理の具体的な内容 */
}
✓ 誤解されない名前に改善して投稿
✓ よい投稿に「いいね!」して応援
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 32

まとめ(1)
✓ リーダブルコードとは
✓ 変更できるコード
✓ バグを見つけられるコード
✓ ↑は読む人視点
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 33

まとめ(2)
✓ 「誤解されない名前」を考えた
✓ filterはあいまい
✓ →select/exclude
✓ Clipもあいまい
✓ →Truncate
✓ TOO_BIG_LIMITもあいまい
✓ →MAX_ITEMS_IN_CART
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 34

まとめ(3)
✓ 実際の改善にチャレンジした
✓ 「読む人が理解しやすいか?」を
とことん考えたはず
名前が「他の意味と間違えら
れることはないだろうか?」と
何度も自問自答する
[「3章 誤解されない名前 p. 30」より引用]
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 35

これから(1)
✓ これからも読む人のことを
考えてコードを書こう
✓ 読む人のことを考えるには?
✓ 読む経験をたくさん積む
✓ たくさんコードを読もう
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 36

これから(2)
✓ たくさんコードを読むコツ
✓ コードから学ぶ気持ちで読む
✓ ×悪いこと探し
✓ ○いいこと探し
✓ 本来、コードを読むことは
楽しいことのはず!
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 37

悪いコード
✓ 見つけやすい
✓ 異質
✓ リーダブルじゃない
✓ 過剰に指摘したくなる
✓ 「マサカリを投げてみたい」
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 38

マサカリ投げたい症候群
早めに卒業しましょう
✓ 必要十分な事実伝達以外の
否定的な情報を過剰に含む指摘
必要十分な事実伝達がない場合もある
✓ 必要十分な事実伝達:
○○な理由で××ではなく△△だ
本に書いているから、は理由になっていない
↑は最近の「マサカリを投げる」の捉えられ方
参考:元々のモヒカン・手斧の使われ方:
http://www.otsune.com/diary/2005/06/14/4.html#200506144
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 39

よいコード
✓ 見つけにくい
✓ リーダブルだから
✓ すーっと理解できてひっかからない
✓ これからのチャレンジ
✓ 意識して見つけよう!
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Page: 40

これから(3)
「解説」を読む
http://www.clear-code.com/blog/2012/6/11.html
✓ 本文:個人で
リーダブルコードを書く方法
✓ 解説:チームで
リーダブルコードを書く方法
リーダブルコードを読み解こう - 3章 誤解されない名前
Powered by Rabbit 2.1.4

Other slides

Apache Arrow
2017-06-13
Apache Arrow
2017-05-28
Mroonga!
2015-10-30