#1. 今回お話しすること
- 「メンテナンスしやすいコード」という軸でまとめたよ
- 前回 前々回の続きだよ
- Javaやjavascriptコードを想定して説明を書くけど、全言語共通で使えるテクニックだよ
- 私個人の考えなので、「いいな」と思うものだけピックアップしてもらえたら何よりです
#2. テクニック集
##2.1. 定数や変数に入れる数値は、根拠があるなら式も書こう
何らかの処理を許可する時間の上限を保持する定数を例に考えます。
public static final long ACCEPT_TIME_LIMIT = 259200000L;
どうですか?
この数字を見ただけで、何を意味しているか分かりますか?
public static final long ACCEPT_TIME_LIMIT = 3 * 24 * 60 * 60 * 1000;
こう書かれているとどうでしょうか。
24 * 60 * 60という箇所で「1日の秒数」というところがわかり、さらに1000倍しているところで「ミリ秒」を、3を掛けているところで「あ~3日分をあらわすミリ秒なのね」と想像がつきます。定数として値を持つときに、何らかの計算を行った最終的な結果の値だけを書いてしまいがちです。これをきちんと分解して書いておくことで、コードレビュー時にレビュワーが仕様との突き合わせもしやすいですし、かつ今後メンテナンス時も見ただけで数字の意味が分かります。
##2.2. 範囲をあらわす比較演算子は、並びを工夫しよう
※ここで紹介するテクニックは、世間一般的な文化とは相反するものです。コメント欄にいろんなご意見を頂いています。世間と異なることをするデメリットもあると思うので、実際に導入する際はご注意ください。
// 100以上500以下の場合のみ処理を行う
if(value >= 100 && value < 500){
// 処理
}
// 100以上500以下の場合のみ処理を行う
if(100 <= value && value < 500){
// 処理
}
人間が数字を認識するときは、左ほど数字が小さく、右に行くほど数字が大きくなる数直線をイメージします。そのため数字の範囲を示すときはその数直線通りの順番になるように入れ替えることで、可読性が上がります。
ただし、「valueは100以上、valueは500未満」という形で主語述語形式で理解したほうがわかりやすい方もいます。各組織に合わせて、わかりやすいほうを使うといいでしょう。
##2.3. ListやMapを返すようなメソッドを作る場合、なるべくnullを返さない
public List<Long> getList(){
if(XXX == 0){
return null;
}
List<Long> list = new ArrayList<>();
for(i = 0; i < XXX; i++){
list.add(YYY);
}
}
public List<Long> getList(){
List<Long> list = new ArrayList<>();
for(i = 0; i < XXX; i++){
list.add(YYY);
}
return list;
}
何かのListを返したり、Mapを返したりというメソッドを使うとき、そのメソッドがnullを返すかどうかで受け手は身構え方が変わります。nullを返すことがないのであれば、わざわざ毎回if(list != null)
なんて書く必要はないですし、listが空かどうかを判別したければlist.size()
で事足ります。nullかどうかが重要になる特別な理由がない限り、利用者にnullを意識させないメソッドは可読性を良くできると考えています。