リーダブルコードをn読み解こう¶ ↑
: subtitle
3章 誤解されない名前
: author
須藤功平
: institution
株式会社クリアコード
: content-source
schoo
: date
2014/12/9
: allotted-time
40m
: theme
clear-code
質問(1)¶ ↑
((‘tag:center’)) プログラミングについて
* A:未経験
* B:学習中(('note:(schooや学校、独学など)'))
* C:趣味・仕事でたまに書く\n
(('note:(趣味でWebサイトを作っている、職業がデザイナーなど)'))
* D:趣味・仕事でバリバリ書く\n
(('note:(趣味でOSSを開発している、職業がエンジニアなど)'))
質問(2)¶ ↑
((‘tag:center’)) リーダブルコード(本)を…
* A:読んだ * B:読んでいる * C:まだ読んでいない
内容¶ ↑
* 自己紹介 * リーダブルコードとは * 実例で考えよう * 実際の改善にチャレンジ! * まとめ * 質疑応答
自己紹介(1)¶ ↑
* リーダブルコードの\n
「解説」の著者\n
(('note:http://www.clear-code.com/blog/2012/6/11.html'))
自己紹介(2)¶ ↑
* クリアコードの代表取締役
* 「クリア」な(意図が明確な)\n
「コード」を大事にする\n
ソフトウェア開発会社
自己紹介(3)¶ ↑
# image # src = images/github-kou-with-annotation.svg # relative_height = 100
スライドプロパティー¶ ↑
: enable-title-on-image
false
リーダブルコードとは(1)¶ ↑
# blockquote # title = はじめに p. x 本書の目的は、君のコードをよくすることだ
リーダブルコードとは(2)¶ ↑
# blockquote # title = はじめに p. x その中心となるのは、コードは理解しやすくなければいけないという考えだ
リーダブルコードとは(3)¶ ↑
# blockquote # title = 1.2 読みやすさの基本定理 p. 3 「コードを理解する」というのは、変更を加えたりバグを見つけたりできるという意味
リーダブルコード¶ ↑
* 変更できるコード * バグを見つけられるコード
((‘tag:center’))((‘tag:x-large’)) ↓n 読む人視点!
何をしているコード?¶ ↑
# coderay cpp
Node* node = list->head;
if (node == NULL) return;
while (node->next != NULL) {
Print(node->data);
node = node->next;
}
if (node != NULL) Print(node->data);
((‘tag:center’))((‘note:「優れた」コードって何? p. 2より’))
何をしているコード?¶ ↑
# coderay cpp
for (Node* node = list->head;
node != NULL;
node = node->next)
Print(node->data);
((‘tag:center’))((‘note:「優れた」コードって何? p. 2より’))
どちらがリーダブル?¶ ↑
# coderay cpp
// どちらがリーダブルコード?どうして?
// リーダブルコード:変更できる・バグを見つけられるコード
// 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);
((‘tag:center’))((‘note:「優れた」コードって何? p. 2より’))
実例で考えよう¶ ↑
((‘tag:center’))((‘tag:large’)) 3章「誤解されない名前」n より
((‘ ’))
3.1 例:filter()(1)¶ ↑
# coderay python results = Database.all_objects.filter("year <= 2011")
(({results}))はなに?
* 2011年以前のレコード? * 2012年以降のレコード?
3.1 例:filter()(2)¶ ↑
* filterはあいまいな言葉
* 選択する→(({select()}))
* 除外する→(({exclude()}))
select("year <= 2011")
exclude("year <= 2011")
番外1:sort()(1)¶ ↑
* どっちの名前がよい? * sort() * quick_sort()/merge_sort()
番外1:sort()(2)¶ ↑
* ((*ソートすること*))が重要 * sort() * ソート((*方法*))が重要 * quick_sort()/merge_sort()
ヒント:抽象化・カプセル化n ((‘note:(abstraction barrier, abstraction layer)’))
3.2 例:Clip()(1)¶ ↑
# coderay python
# textの最後を切り落として、
# 「...」をつける
def Clip(text, length):
* 最後から(({length}))文字を削除する?
* 最大(({length}))文字まで切り詰める?
3.2 例:Clip()(2)¶ ↑
切り詰めるなら:(({Clip}))→(({Truncate}))
# coderay python def Clip(text, length): # ↓ def Truncate(text, length):
3.2 例:Clip()(3)¶ ↑
((*最大*))(({length}))文字なら:(({max}))をつける
# coderay python def Truncate(text, length): # ↓ def Truncate(text, max_length):
3.2 例:Clip()(4)¶ ↑
最大(({length}))((*文字*))なら:n (({length}))→(({chars}))
# coderay python def Truncate(text, max_length): # ↓ def Truncate(text, max_chars):
番外2:add()(1)¶ ↑
* どの名前がよい? * add() * append()/prepend()
番外2:add()(2)¶ ↑
* ((*追加すること*))が重要\n
(('note:例:集合に追加するとき'))
* add()
* 追加する((*場所*))が重要\n
(('note:例:リストに追加するとき'))
* append()/prepend()
ヒント:抽象化・カプセル化n ((‘note:(abstraction barrier, abstraction layer)’))
3.3 限界値(1)¶ ↑
ショッピングカートに入る商品がn 最大10点のケース
# coderay python
CART_TOO_BIG_LIMIT = 10
if cart.num_items() >= CART_TOO_BIG_LIMIT:
Error("カートにある商品数が多すぎます。")
3.3 限界値(2)¶ ↑
((‘tag:center’)) バグあり!n 9点までしか入らない
# coderay python
CART_TOO_BIG_LIMIT = 10
if cart.num_items() >= CART_TOO_BIG_LIMIT:
Error("カートにある商品数が多すぎます。")
3.3 限界値(3)¶ ↑
* (({CART_TOO_BIG_LIMIT}))はあいまい
* 未満?以下?→境界値の情報がない
* (({MAX_ITEMS_IN_CART}))は明確
* この値が最大値(境界値を含む)
* 最大値のときは(({max}))を使おう!\n
(('note:(最小値のときは(({min})))'))
3.3 限界値(4)¶ ↑
# coderay python
# 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("カートにある商品数が多すぎます。")
他の例¶ ↑
* 範囲を指定するときは\n
(({first}))と(({last}))を使う
* 包含/排他的範囲には\n
(({begin}))と(({end}))を使う
* …
* (詳細は本を買ってください)
実際の改善にチャレンジ!¶ ↑
# coderay php
/* schooの学生名一覧を返す
引数は返す学生名の最大値 */
function student($num) {
/* 処理の具体的な内容 */
}
* 誤解されない名前に改善して投稿
* よい投稿に「いいね!」して応援
まとめ(1)¶ ↑
* リーダブルコードとは * 変更できるコード * バグを見つけられるコード * ↑は((*読む人視点*))
まとめ(2)¶ ↑
* 「誤解されない名前」を考えた
* (({filter}))はあいまい
* →(({select}))/(({exclude}))
* (({Clip}))もあいまい
* →(({Truncate}))
* (({TOO_BIG_LIMIT}))もあいまい
* →(({MAX_ITEMS_IN_CART}))
まとめ(3)¶ ↑
* 実際の改善にチャレンジした
* 「((*読む人*))が理解しやすいか?」を\n
とことん考えたはず
# blockquote
# title = 3章 誤解されない名前 p. 30
名前が「他の意味と間違えられることはないだろうか?」と何度も自問自答する
これから(1)¶ ↑
* これからも((*読む人*))のことを\n 考えてコードを書こう * ((*読む人*))のことを考えるには? * 読む経験をたくさん積む * たくさんコードを読もう
これから(2)¶ ↑
* たくさんコードを読むコツ
* コードから学ぶ気持ちで読む
* ×悪いこと探し
* ○いいこと探し
* 本来、コードを読むことは\n
楽しいことのはず!
悪いコード¶ ↑
* 見つけやすい * 異質 * リーダブルじゃない * 過剰に指摘したくなる * 「マサカリを投げてみたい」
マサカリ投げたい症候群¶ ↑
((‘tag:center’))((‘tag:margin-bottom * 2’)) 早めに卒業しましょう
* 必要十分な事実伝達以外の\n
否定的な情報を過剰に含む指摘\n
(('note:必要十分な事実伝達がない場合もある'))
* 必要十分な事実伝達:\n
○○な理由で××ではなく△△だ\n
(('note:本に書いているから、は理由になっていない'))
((‘note:↑は最近の「マサカリを投げる」の捉えられ方’))n ((‘note:参考:元々のモヒカン・手斧の使われ方:’))n ((‘note:www.otsune.com/diary/2005/06/14/4.html#200506144’))
よいコード¶ ↑
* 見つけにくい * リーダブルだから * すーっと理解できてひっかからない * これからのチャレンジ * 意識して見つけよう!
これから(3)¶ ↑
((‘tag:center’))((‘tag:large’)) 「解説」を読むn ((‘note:www.clear-code.com/blog/2012/6/11.html’))
* 本文:((*個人*))で\n リーダブルコードを書く方法 * 解説:((*チーム*))で\n リーダブルコードを書く方法