はじめに
先日ラクスさんが運営するオンライン勉強会「リーダブルコード LT会」が開催され、そこで多くの素晴らしい登壇者の方が良いコードの書き方をご教授してくださりました。
自身の学習メモとしてや、LT会に参加できなかった人へ共有できればと思いQiitaにて記事を書こうと思いました。
※ もし登壇者の方で載せて欲しくない!などの苦情ございましたらご連絡ください。すぐ削除対応致します。
命名規則
接頭辞を使う
- isXXX
- hasXXX
- canXXX
明確な単語を選ぶ
**size()は大きさ?長さ?個数?などいろいろ想像できるため、この場合height()やweight()**など明確な単語を設定する。
汎用的な名前は避ける
- **change()やtap()**といった汎用的なワードは、変わった・押したという情報しか伝わってこないため、明確にどんなアクションが行われるかを明記する。
- 特にtmp,retval,result,hogeなども汎用的すぎるため使わないほうがいい(らしい)。
誤解されやすい名前は避ける
例えば値の有無確認に**valueRead()**はややこしい。
なぜならreadとはこれから読むのか既に読み取ったのかわからない、**isValue()**などの方がわかりやすい。
ループ変数の名前など、狭いスコープでの名前の省略をしない
- 変数に型のプレフィックスを避ける(str, i , obj)
- work,hoge,とかijkxyzはつかわない
for(let i = 0; i < 5; i++) {
console.log(str[i].length);
}
チームメンバーによって狭いスコープの定義が違う場合があったり、後から改修した場合にスコープを広げると他の名前にも影響してくるので初めから省略しすぎないほうがいい(らしい)。
一般的な英単語を使う
changeAcquisitionQualificationDate()などの難しい単語を利用した名前をつけない。
誰もが読みやすく認識している英単語を使うべき。
適切な命名
オブジェクトや変数は形容詞 + 名詞か、名詞 + 名詞で。
メソッドは動詞・目的語で書く
変数に単位や属性をつける
- size → size_MB
- speed → speed_bps
- password → plaintext_password
- html → html_utf8
状況に応じた具体的な名前を設定する
- **Get()よりも状況によってはDownload()**などのほうが伝わりやすい
コメントの付け方
短いコードにコメントをつけない
当たり前だが、読めばわかるコードには基本的にコメントは付けない
最初からコードを追わせない
全体像理解してなくても途中からでもコードをかけるようにする為のコメントを書く
複雑な処理をしているコードにはコメントをつける
特に試行錯誤してやっとできたコードほど、読みにくくないかを確認する
できたーで放置しがちなので注意。
リファクタリング
読みにくいコード
- あちこちにロジックが散らばっているコード
- 大量の「if」のネストがあるコード
- 早期リターンせず、最後まで読まないと処理が確定しないコード
- 変数や関数名の命名が悪く、ソースを読むだけでは処理が理解できないアンリーダブるなコード
- 引数や戻り値に型を宣言せず、I/O(入出力)が理解しづらいコード
- テストがしづらいコード
- 適切なコメントがないコード
- viewファイルにロジックが記載されてある
- 複数のviewファイルや、違うControllerに同じ処理が記載されてある
- ロジックに変更があった時に修正が大変&バグの可能性が高まる
読みにくいコードを対策する
ifの中にfor文、そしてその中にif文...など読みにくいコードの場合、対策としてできるのは
- 関数として切り分ける
- 複数の処理を関数内で持たせるのは避ける
- 早めにreturnする
- 複雑にせざるを得ない場合はコメントを残す
- 引数や戻り値に型を指定しておく
- ロジックを細かく分ける
学んだLT会
以上がLT会にて学ばさせていただいた内容でした。
もし興味のある方はまた開催される時にご覧になると大変勉強になると思います。
読んでくださりありがとうございました。
リーダブルコード LT会【登壇初心者の方大歓迎】
https://rakus.connpass.com/event/199845/