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


はじめに

チーム内リーダブルコード輪読会の第2章。
第1章はこちら

第2章 名前に情報を詰め込む

どんな内容?

  • クラス、メソッド、変数の名前をつけるときは、その名前から機能・格納されている情報が分かるような名前にしよう
  • 一時変数や短いスコープ内でしか使われない変数であれば、tmpnといった短くて抽象的な名前でもいいんじゃない?

読んだ感想

コードレビューで自分がよく指摘するのが、この"名付け"の部分。
もっとちゃんと名前つけて欲しいっていつも思ってる。
(自分は自分で、レビュワーから「変数名長すぎ」って突っ込まれたりして直すこともあるけどw)

文中ではsendfindなどのシソーラスが例示されていて「適宜適切な単語を選ぼう」ってなってるけど英語スキルがあまりないチームでは、シソーラス表見てどれが正しいか悩んだ挙句に適切なものを選んでも、他の人にその単語のニュアンスが通じないことがある。
なので、
「こういうときはsendよりもdistributeのが適切」
とかいったことを共通認識として広めていく必要があるなーと。

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

適切な単語を選ぶ

  • どういうメソッド名が、より適切?
1-1
// 名前がtargetNameと一致するユーザを取得する
// *命名についての話なので、このメソッドの妥当性については無視してください
User getUser(List<User> users, String targetName) {
  for(User user : users) {
    if (user.getName().equals(targetName)) {
      return user;
    }   
  }
  return null;
}

List<User> getUsers(List<User> users, String targetName) {
  List<User> matchedUsers = new ArrayList<>;
  for(User user : users) {
    if (user.getName().equals(targetName)) {
      matchedUsers.add(user);
    }   
  }
  return matchedUsers;
}
  • -> getよりfilterのが適切?
  • -> 名前を元に取得するんだったら...fomNameとかつけたほうがいい?
  • -> getXXXUserとかgetYYYUserのように、より具体的な属性をつけたほうがいい?

名前の長さを決める

何をどこまで省略する?

  • 変数名長すぎ?
2-1
void someFunc(AccountInfo accountInfo) {
  String userNameOfAccountInfo = accountInfo.getUser().getName();
}
  • メソッド名冗長すぎ?
2-2
Class SomeConverter {
  public static String convertIntToString(int num) {
    ...
  }
}
  • Converterクラスのconvertメソッドってどうなの?
  • 引数をintで取ってるのに、convertIntってIntを明示する意味はあるのか?