36
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

リーダブルコードを読んで実際のコードを見直してみた

Last updated at Posted at 2023-07-07

はじめに

プログラマにとって必読と言っても過言ではない「リーダブルコード」を読んだことがなかったので、実際に自分が書いたコードと照らし合わせて、出来ているところ/出来ていないところを書きだしました。

主にリーダブルコードの前半部分(命名規則やループ、コメントなど)について簡潔に書いていきます。

昔に比べればまともなコードになったと思っていたけど、全然まだまだ命名規則とかは未熟でした......(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な書き方である。では逆にネストが深くなる書き方はどうなるのか。

ネスト深いver
for(let users_i=0;users_i<users.length;users_i++){
    if(users[users_i]){
        //...
    }
}

早い段階でネストをぬけないと、積み重ね積み重ねでネストが増えていってしまう。早い段階でネストを抜けることで見やすいコードが出来上がる。

最後に/感想

リーダブルコードの中でも主に前半部分で大事そうだなと思ったことを書きました。良いコードを書いていた部分も少しはあったけれど、分かりにくい書き方をしている部分をたくさん見つけることができました。
読んだだけでは完全に自分のものにすることはできないと思うので、たくさんコード書いて、レビューしてもらって、きれいなコードを目指そうと思います。

参考文献

36
21
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?