はじめに
チーム内リーダブルコード輪読会の第2章。
第1章はこちら
第2章 名前に情報を詰め込む
どんな内容?
- クラス、メソッド、変数の名前をつけるときは、その名前から機能・格納されている情報が分かるような名前にしよう
- 一時変数や短いスコープ内でしか使われない変数であれば、
tmp
やn
といった短くて抽象的な名前でもいいんじゃない?
読んだ感想
コードレビューで自分がよく指摘するのが、この"名付け"の部分。
もっとちゃんと名前つけて欲しいっていつも思ってる。
(自分は自分で、レビュワーから「変数名長すぎ」って突っ込まれたりして直すこともあるけどw)
文中ではsend
やfind
などのシソーラスが例示されていて「適宜適切な単語を選ぼう」ってなってるけど英語スキルがあまりないチームでは、シソーラス表見てどれが正しいか悩んだ挙句に適切なものを選んでも、他の人にその単語のニュアンスが通じないことがある。
なので、
「こういうときは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を明示する意味はあるのか?