いまさらリーダブルコードまとめ (第3章)


はじめに

チーム内リーダブルコード輪読会の第3章。
前回はこちら
次回、「第4章 美しさ」はこちら

第3章 誤解されない名前

どんな内容?

  • 変数やメソッドには誤解されない名前をつけよう → 最善の名前とは誤解されない名前
  • 範囲や境界を表したい場合には適切な単語を利用しよう
  • 複数の名前を検討しよう → 名前を決める前に誤解されない名前かどうか想像してみよう

読んだ感想

実際に自分でコード書いたものでもレビューなどで指摘されることが出てきてしまう「誤解されやすい名前」
getXXなのに値を取得して→処理して→セットまでしていたり、
StringXXという名前で日付型や数値まで処理してしまっていたり、
1個の小さな誤解が大きな間違いやトラブルのもとになってしまうこともあり得るので、
処理や利用場面ごとに「どんな名前にするべきか?」を気をつけないといけないなとあらためて認識。。

例を挙げて議論してみよう

「XXをしない」、「XXではない」を表現したい時

  • 「メール送信しない」というフラグをどう表すべきか?
1-1
boolean noSendMail;

booolean isNoSendMail() {
    return noSendMail;
}

if(isNoSendMail()) {
   メール送信させない場合の処理
   return;
}

noXXという変数がtrueなので「メール送信しない」というのを表現できている?
 → trueの時にメールを「送るのかor送ってはいけないのか」パッと見でわかりづらい・・?

1-2
boolean sendMail;

booolean isSendMail() {
    return sendMail;
}

if(!isSendMail()) {
    メール送信させない場合の処理
    return;
}

sendMail!(否定)されているのでこの方が「メール送信しない」ということが分かりやすい?

DAOにありがちなgetテーブル名selectテーブル名ってどうなんだろ?

ちょっとテーマとずれるかもですが、メソッドの命名で気になったところを1点
例えばこんなテーブルで・・

HOTEL_MASTER_DATA
HOTEL_ID     NUMBER
HOTEL_NAME    VARCHAR2
HOTEL_AREA    VARCHAR2
HOTEL_ADDRESS   VARCHAR2
HOTEL_MESSAGE   VARCHAR2
HOTEL_OPEN_FLG  NUMBER
DEL_FLG     NUMBER
INSERT_DATE    DATE
UPDATE_DATE   DATE
DELETE_DATE   DATE

全カラムを取得する場合はgetHotelDataMasterselectHotelMasterDataなどでOK?
HOTEL_AREAHOTEL_ADDRESSだけやHOTEL_IDHOTEL_NAMEだけなどの一部のみを取得する場合に
getHotelDataMasterselectHotelMasterDataは適切だろうか?

小さい組織で閉じている場合や組織横断で汎用的に利用されているようなテーブルであれば、
テーブル名から内容をつかみやすい??
例えばHOTEL_AREAHOTEL_ADDRESSだけの場合はgetHotelSpotInfoなどより具体的な名前にすべき??

Appendix:議論で出てきたコメントなど

  • 「XXをしない」、「XXではない」を表現したい時
    例のようにメールを送信しない、させない場合にはescapeXXskipXXなどはどうか?
    デフォルトの状態を変数とするのが良さそう → 例の場合は1-2、そうしない場合は同じような変数がたくさん出てきた時に混乱しそう・・
    フラグをまとめて設定するクラスなどがあっても良いかも。。

  • DAOにありがちなgetテーブル名selectテーブル名ってどうなんだろ?
    ディレクトリを「テーブル名」で切りその下により具体性を持たせた名前のsqlファイルを作ると良いのでは?
    DTOの名前が適切であればそこでカバーできそう
    特定のパラメータをWHERE句に持ってくる場合はXXByHotelIdといった感じや複数レコード返す場合はgetXXListなどでより理解しやすい名前を付けるのも検討するべきだと思う