初心に戻ってリーダブルコードを読んでみました。
自分のための備忘録的な目的がメインですが、皆さんの参考にもなれば幸いです。
この記事では「I. 表面上の改善」についてまとめます。
get
は取ってくる場所に合わせてfetch
やdownload
などにするtmp
なども利用可i
・j
・k
を利用するのは、イテレータであることを表せるので有効
members_i
やusers_i
のように接頭辞をつけるとベターstart_time_ms
, size_mb
unescaped_comment
, plaintext_password
, html_utf8
newNavigationControllerWrappingViewControllerForDataSourceOfClass
string
-> str
ConvertToString()
-> ToString()
select()
exclude()
# textの最後を切り落として、「...」をつける
def Clip(text, length):
...
length
文字を削除する(Remove
)length
文字まで切り詰める(Trancate
)←今回はこっちlength
という引数名もmax_length
にした方が明確
max_chars
だとベター# ショッピングカードには商品が10点までしか入らない
CART_TOO_BIG_LIMIT = 10
if shopping_cart.num_itms() >= CART_TOO_BIG_LIMIT:
Error("カートにある商品数が多すぎます。")
CART_TOO_BIG_LIMIT
MAX_ITEMS_IN_CART
ならその値を含めるべきことが明確print integer_range(start=2, stop=4)
stop
last
を使えば対象であることが明確例)10/16に開催されたイベントを全て出力したい
PrintEventsInRange("OCT 16 12:00am", "OCT 16 11:59:59.999pm")
↓ 包含/排他的範囲を使うと簡潔に書ける
# 第2引数の時刻は「含まない」→ 排他的
PrintEventsInRange("OCT 16 12:00am", "OCT 17 12:00am")
begin
とend
を使うことが多い
end
は曖昧な気もするが、英語に「ちょうど最後の値を超えたところ」を意味する単語がない・・・bool read_password = true
is
・has
・can
・should
などをつけることが多いbool disable_ssl = true
get
で始まるメソッドはメンバの値を返すだけの「軽量アクセッサ」であるという規約に慣れ親しんでいるget
を他の単語に変えた方がいいinherit_from
という名前は何かを継承することはわかるが、実際何を値として与えれば良いか不明瞭inherit_from_experiment_id
とすれば、継承したいexperiment_id
を与えれば良いとわかるCheckFullName("Doug Adams" , "Mr. Douglas Adams" , "");
CheckFullName(" Jake Brown ", "Mr. Jake Brown III", "");
CheckFullName("No Such Guy" , "" , "no match found");
CheckFullName("John" , "" , "more then one result");
<input>
フィールドと同じ並び順にする「監督のコメンタリー」を入れる
// このデータだとハッシュテーブルよりもバイナリツリーの方が40%速かった。
// 左右の比較よりもハッシュの計算コストの方が高いようだ。
// ヒューリスティックだと単語が漏れることがあるが仕方ない。100%は難しい。
// このクラスは汚くなってきている。
// サブクラス'ResourceNode'を作って整理した方がいいかもしれない。
コードの欠陥にコメントをつける
// TODO: あとで手をつけることを記述
// FIXME: 既知の不具合があるコードに記述
// HACK: あまりキレイじゃない解決策に記述
// XXX: 危険!大きな問題がある場合に記述
定数にコメントをつける
質問されそうなことを想像する
ハマりそうな罠を告知する
# 実行時間はO(タグの数*タグの深さの平均)なので、ネストの深さに気を付ける
def FixBrokenHtml(html): ...
「全体像」のコメント
// これはビジネスロジックとデータベースをつなぐグルーコードです。アプリケーションから直接使ってはいけません
要約コメント
// データをキャッシュに入れる。ただし、先にそのサイズをチェックする。
// これまでにクロールしたURLかどうかによって優先度を変える。
// これまでにクロールしていないURLの優先度を高くする。
// このファイルに含まれる行数を返す
int CountLines(string filename) {...}
// このファイルに含まれる改行文字('\n')を数える
int CountLines(string filename) {...}
// listを逆順にイテレートする
// 値段の高い順に表示する
Connect(10, false)
Connect(timeout = 10, use_encryption = False)
Connect(/* timeout = */ 10, /* use_encryption = */ False)
この記事では「I. 表面上の改善」についてまとめました。
表面上の改善は難易度が低いですが、取り入れればすぐに効果を実感できると思います。
境界条件の判定に関するエラー ↩︎