はじめに
プログラマにとって必読と言っても過言ではない「リーダブルコード」を読んだことがなかったので、実際に自分が書いたコードと照らし合わせて、出来ているところ/出来ていないところを書きだしました。
主にリーダブルコードの前半部分(命名規則やループ、コメントなど)について簡潔に書いていきます。
昔に比べればまともなコードになったと思っていたけど、全然まだまだ命名規則とかは未熟でした......(Goodな部分もあったけど)。
(この本は会社の勉強し放題制度を使って買いました。気軽に技術書籍が買えるのめっちゃ最高!)
命名規則について
名前にGet付けすぎ
const GetData = async() => {
const response = await axios.get("/");
return response.data;
};
これはAPIを叩いてデータを取得してくるコードです。基本的にAPIを使うコードは一か所にクラスなどにまとめて置くので、直接このコードを見に来ない限り内部で何をしているのかが分からない状況でした。
GetDataだと既に取得済みのデータから取ってくるのか、localstorageから取ってくるのか、API叩いてくるのか分かりませんでした。
const FetchData = async() => {
const response = await axios.get("/");
return response.data;
};
ループイテレータの名前がバラバラ
for(let i=0;i<data.length;i++){
for(let j=0;j<data[i].length;j++){
//...
}
}
users.map((user,user_i) => {
return (
<p>{user.name}<p/>
)
})
ループ処理におけるループイテレータの命名で今まで2種類を使っていました。2つ目の命名はGoodでしたが、1つ目の命名はi,jといった汎用的な名前になってしまっています。1重ループであれば間違えにくいですが、2,3重と増えていくにつれて、ミスが発生しやすくなります(現に今までもそういったバグをよく引き起こしてきました)。
for(let users_i=0;users_i<users.length;users_i++){
//...
}
単位付き変数
const time = (new Date()).getTime();
時刻を表す変数がある。getTimeの仕様を知らない人からすれば単位がmsなのかsなのか分からない。
const time_ms = (new Date()).getTime();
名前に属性をつけよう
const password = "*******************";
const shaObj = new jssha("SHA-256", "TEXT", { encoding: "UTF8" });
shaObj.update(password);
const hash = shaObj.getHash("HEX");
1つしか暗号化しない場合はどんなデータが暗号化されたのかが比較的分かりやすいが、暗号化するデータが複数の場合、どれがどれなのか分からなくなってしまう。
const password = "*******************";
const shaObj = new jssha("SHA-256", "TEXT", { encoding: "UTF8" });
shaObj.update(password);
const hashedPassword = shaObj.getHash("HEX");
限界値を表す変数名が限界すぎる()
const usersLimit = 10;
なんとなくで意味は分かるが、あいまいな意味なのでもう少し明確にしたい。maxやminなどを使うことで明確になる。
const maxUsers = 10;
bool変数の命名
const isDisabled = false;
bool変数ではtrueがどういう意味を持つのかがとても大事になってくる。実際に書いたコードではしっかりとis~~~分かりやすい命名ができていた。ここは継続していきたい。
コメントには何を書くべき?
自分のコードでは最近コメントを書く機会がとても減った。それはコメントの内容に意味がないと感じたためである。リーダブルコードでも「コードからすぐ分かることをコメントに書かない」とある。では何を書けばいいのか。
「自分の考えを記録する」とリーダブルコードに書いてあった。確かにその通りである。
例:・愚直に実装したので、実行速度がとても遅い
・ここ不具合ありそう
コードをパッと読んだだけでは分からない情報を伝えることが重要である。よくコメントの記法としてTODO,FIXME,HACK,XXXがあるらしい。TODOは今までも使っていたが、他はよく知らなかったのでこれからは積極的に使っていこうと思う。
ネストはなるべく深くしない
for(let users_i=0;users_i<users.length;users_i++){
if(!users[users_i])continue;
//...
}
当たり前だがネストは浅いに越したことはない。よくNULL回避などのために上記のようなコードを書くことが多い。上記の書き方はGoodな書き方である。では逆にネストが深くなる書き方はどうなるのか。
for(let users_i=0;users_i<users.length;users_i++){
if(users[users_i]){
//...
}
}
早い段階でネストをぬけないと、積み重ね積み重ねでネストが増えていってしまう。早い段階でネストを抜けることで見やすいコードが出来上がる。
最後に/感想
リーダブルコードの中でも主に前半部分で大事そうだなと思ったことを書きました。良いコードを書いていた部分も少しはあったけれど、分かりにくい書き方をしている部分をたくさん見つけることができました。
読んだだけでは完全に自分のものにすることはできないと思うので、たくさんコード書いて、レビューしてもらって、きれいなコードを目指そうと思います。
参考文献