🐈

Tidy First? 第I部をJavaScriptで読む

2025/02/09に公開

今回は Tidy First? の例をJavaScriptに置き換えつつ、意識したい点をピックアップします。
https://www.oreilly.co.jp/books/9784814400911/

全体

リファクタリング(整頓)をいつすべきか?どうすべきか?という内容。
第1章は具体的なコードの書き方ルールについて書かれている。

基本の書き方ルール

  • 書き方を揃える意識を持つ。
  • 読み手が理解しやすい順でコードを書く。
  • 関連しているコード同士はなるべく近くに置く。

ガード節

ifはネストしないでreturnを活用する。
ただし複数のreturnが続くようであれば複雑になるので、メソッドを分割すべし

❌ NG

if (条件) {
    if (条件) {
      ...
    }
}

✅ OK

if(条件) return
if(条件) return

変数の宣言と初期化

変数の宣言(let, const)と初期値の代入は同じタイミングで行う。

❌ NG

function fn() {
    let a;
    ...
    a = 10; // このタイミングで初期値を代入している
    let b;
    ...
    b = a; // このタイミングで初期値を代入している
    ...
}

✅ OK

function fn() {
    let a = 10;
    ...
    let b = a;
    ...
}

分割する/まとめる

  • 大きくなったコードは、変数に分割して理解しやすくする。
  • 1つの処理のまとまりごとに、空行を入れる。
  • 共通処理は1つのメソッドとして切り出し、再利用する。
  • 細かく分割しすぎていることで理解しづらくなっているコードもある。その際は一度1つにまとめる。

定数化

マジックナンバー / 繰り返し現れる文字列は定数化する。

❌ NG

if(response.code === 404){...}

✅ OK

const PAGE_NOT_FOUND = 404;
if(response.code === PAGE_NOT_FOUND){...}

ただし、同じ値でも意味合いが異なる場合は、まとめない。
❌ NG

const ONE = 1;

// この場合の「ONE」は一番目の意味
if(index === ONE){...}

// この場合の「ONE」は計算結果
if(calc === ONE){...}

引数を分割して明示的に

❌ NG

const params = { a: 1, b: 2 };
foo(params);

function foo(params) {
    console.log("a:", params.a);
    console.log("b:", params.b);
}

✅ OK

const params = { a: 1, b: 2 };
function foo(params) {
    fooBody(params.a, params.b);
}

function fooBody(a, b) {
    console.log("a:", a);
    console.log("b:", b);
}

削除

  • 不要なコードは消す。(どうせGit上等に残しているので問題ない)
  • デッドコードか否か判断しづらい場合は、該当箇所でログを出力するようにし、暫くログを監視する。

コメントについて

  • コードからは読み取れないことは、コメントを入れておく。
  • 質問されそうなことは先回りしてコメントとして記載しておく。
  • 実装時の注意点もコメントを入れるべし。
  • コードに書いてあることをそのまま書いてあるコメントは、消す。
  • リファクタリングによって、コメントが不要になることもあるので、再度見直す。

関連記事

https://zenn.dev/koda_momo/articles/45b27e1135043a

Discussion