名前付け大全を読んだ
間違った名前のパターン
- (1) 名前と実装が一致していない
- 実装はdestroyしているのに名前はcreateしている
- (2) 名前の意味が狭すぎる
- 1のパターンが包括していますが
- saveという名前なのに、実装ではキャッシュの削除をしている、など
- (3) 名前の意味が広すぎる
saveRecordAndClearCache
という名前なのにキャッシュを削除していない- getPageというWEB上のファイルを取得する処理があるとします。getPageだとローカルファイルからなのか、データストアからなのかわかりません。HTTPが確定しているならdownloadPageにしましょう。
命名に関するヒント
- メソッド名は動詞にするべきか
- メソッドには「何らかの値を返すことが主目的のもの」「何らかの処理を行い副作用を起こすことが主目的のもの」に分けられるので、メソッドは動詞である必要はない
必要
を表現する時- 対象が動詞の時はshould
- 対象が名詞の時はneed
セルフレビュー項目
- 名前と実装はあっているか?
- 名前で挙動をカバーできているか?
- 曖昧な単語を選んでいないか?
- info
- 曖昧なデータ構造を指す時に多いので適切な名前をつけるべし
- check
- 実行後に何が起きるのかを予測できない。raiseするならraiseを、boolを返すならboolを名前で表現するべし
- check_paidだったら、boolを返すならpaid?, 支払いが済んでいなくてエラー情報を追加するなら add_error_if_not_paid, 支払いが済んでいない時にエラーを投げるなら raise_if_not_paid
- chekは言葉が不明瞭であることが問題の根本。結果が曖昧な言葉は避けよう
- 実行後に何が起きるのかを予測できない。raiseするならraiseを、boolを返すならboolを名前で表現するべし
- info
- 重要かつ汎用的な単語を使っていないか?
- group, system...
- 使うならネームスペースをつけるべし
- 改修によって現行の名前の意味が変わっていないか?
- 一言で表現できないか?
- previuos_value => predecessor
- 情報量のない言葉を足していないか?
- サービスクラスに所属するServiceサフィックスは本来不要
- 無駄な言い換えをしていないか?
- text = Article.find(params[:id]).body ではなく、bodyでいいじゃん
- 対になった言葉を選んでいるか?
- get, set
- deep, shallow
- head, tail
- スペルミスをしていないか?
- 過剰な省略をしていないか?
- 単数形と複数形は間違っていないか?