【読書感想文】リーダブルコード メモその1
年末年始に「リーダブルコード」を読んでました。
せっかく読んだので、例のごとく気になった点をメモがてらまとめておきます。
たぶん2~3記事になります。
明確な単語を選ぶ(2.1)
例えば"get"はあまり明確な単語ではないから、
DBから取ってくるのか or キャッシュから取ってくるのか or インタネットから取ってくるのか
などによって別の単語を使った方が良いとのこと。
あと、"get"もさることながら、個人的には"set"の曖昧さが酷いです。
基本的にプログラミングは、「変数に値を代入する」ものなので、
油断するとあらゆるメソッドが"set~"と名付けられることになってしまう。
(そのメソッドがやってることとして「嘘ではない」し)
"set"から始まるメソッド名は単純なセッター以外には禁止した方が良いんじゃないかと思いますね。
イテレータの名前(2.2)
2重ループなどになっている場合は、変数名を(i,j,k)とするのではなく、
(club_i,members_i,users_i)など、
どのループのイテレ-タなのかが一発で分かるような名前にするべきとのこと。
確かにjとかkって、iの次なだけで別に"index"とか"iterator"の頭文字でもないので、
全部iにして、「何のiteratorなのか」を名前にする方が良いですね。
"get"は軽量アクセサ(3.7)
1個目にもでてきた"get"という単語ですが、
この単語は基本的には値を返すだけの「軽量アクセサ」であると認識される可能性があるので、
重い処理を行った結果を返すようなメソッドはgetと名付けるべきではないとのこと。
DBからデータ取ってくる処理とかに普通に"get~"って付けるのはマズイってことですね。
やっぱり"get"と"set"はゲッターとセッター以外には使わないようにルール付けた方が良いのかもなー。
似ているコードは似ているように見せる(4.2)
同じようなことをやっているコードは基本的には共通化するべきですが、
どうしてもできない場合や、テスト用のコードなど、
似たようなコードを何度も書くことは少なからずあると思います。
そんな時は、コードの「シルエット」を似せて、
パッと見で似たようなことをやってると認識できるようにするべきだという話。
さらに言えば、「似たようなことをやってるけど、こことここが違う」というところまでパッと見で分かると、
可読性としてはかなり良いのではないでしょうか?
コードを読むよりもコメント読むほうが早いという場合のみ、コメントOK(5.1)
コメント論争。
本書ではすごく単純で、
コードを読むよりもコメントを読む方が理解が早くなるようなコメントをすべき。
とのことです。
まぁそれはその通りなんですが、それよりも心に来たのは、
コメントはひどい名前の埋め合わせに使うものではない。
との一文。
当たり前のことですが、優先度としては、
1.コメントが不要なくらい理解しやすいコードを書く
2.どうしても理解しやすく書けない場合のみコメントを書く
なので、特に名前なんかについては、"tmp //ユーザー名称の一時保管"とかせずに、
最初からコメント不要な名前を付けるべきですね。
定数にコメントを付ける(5.2)
定数の値を決めた時に、「何を考えて定数をその値にしたか」をコメントに書いておくと良い。
とのこと。
正直この考え方はなかったですが、確かにかなり良さそうです。
例えば区分値をマジックナンバーにしないように定数化する時だと、
public static int DIV_USERNAME = 1; public static int DIV_PASSWORD = 2; public static int DIV_COMMENT = 11; public static int DIV_DATETIME = 21;
とか書いてあっても、何で3~10番や12~20番を飛ばしているのかとか、
そういう意図がわからない。
これが、
//ユーザー情報は1~10 public static int DIV_USERNAME = 1; public static int DIV_PASSWORD = 2; //画面の入力情報は11~20 public static int DIV_COMMENT = 11; //システムログ情報は21~30 public static int DIV_DATETIME = 21;
などとコメントしてあったら意図が分かりやすいし、後から定数を追加する時にも何番に足せばよいか判断しやすい。
自分がコーディングした時の意図をコメントに残しておくというのは、結構有用そうですね。
インラインコメントで名前付き引数みたいにする(6.7)
メソッドを呼び出す際、引数が固定値である場合に、
selectHogeData(10,true);
とか書かれても、10とかtrueが何を表すのかがよく分かりません。
僕はこれまでこういう場合には、
final int SELECT_CNT = 10; final boolean CHECK_LOCK = true; selectHogeData(SELECT_CNT, CHECK_LOCK);
みたいに書いて引数の意味を明示していたんですが、
selectHogeData(/* selectCnt = */ 10, /* checkLock = */ true);
と書くと、分かりやすい上に短くてとても良い。
使っていこうと思います。
第1部おわり
今回はひとまず第1部の「表面上の改善」の部分をまとメモしました。
2部以降はロジックの話になってきますが、こちらも近いうちにまとめておきたいと思います。
おわり。