0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

特定の条件でしか使わない変数を無造作に定義したくない

Last updated at Posted at 2024-01-01

誰が読んでも分かるシンプルなコードがあるとする。

function なんかの処理(array = []) {
    let hoge = null;
    for (let i = 0; i < array.length; i++) {
        hoge = 処理1(hoge, i);
    }
    hoge = 処理2(hoge);
    return hoge;
}

ここから仕様が増えてきて、外部のパラメータがAのときはこうする。Bのときはこうする。みたいな処理が組み込まれていくとする。

function なんかの処理(array = [], isA = false, isB = false) {
    let hoge = null;
    let aCount = 0;
    let aText = "";
    let bCount = 0;
    let bText = "";
    for (let i = 0; i < array.length; i++) {
        hoge = 処理1(hoge, i);
        if (isA && 処理A1(hoge)) {
            aCount++;
            aText += hoge.toString();
        }
        if (isB && 処理B1(hoge)) {
            bCount++;
            bText += hoge.toString();
        }
    }
    hoge = 処理2(hoge);
    if (isA && aCount < 10) {
        hoge = 処理A2(hoge, aText);
    }
    if (isB && bCount < 20) {
        hoge = 処理B2(hoge, bText);
    }
    return hoge;
}

さて、このコードのaCount, aText, bCount, bTextという変数はisA, isBがfalseのときには利用されない。
が、これはなんか嫌だ。
特定の条件でしか使わない変数を定義すると無駄に「なにこの変数?」と思われてしまう。
頭をなるべく使わないコードにしたい。

(一応、断っておきますが、別のこのコードがすごく悪いとは思わないです。
私が個人的に変数減らしたいなー。って思ってるだけです。)

ではどうするか

こーする。

function なんかの処理(array = [], isA = false, isB = false) {
    let hoge = null;
    const Aの処理 = isA ? Aの処理生成() : null;
    const Bの処理 = isB ? Bの処理生成() : null;
    for (let i = 0; i < array.length; i++) {
        hoge = 処理1(hoge, i);
        Aの処理?.処理1(hoge);
        Bの処理?.処理1(hoge);
    }
    hoge = 処理2(hoge);
    if (isA) hoge = Aの処理.処理2(hoge);
    if (isB) hoge = Bの処理.処理2(hoge);
    return hoge;
}

const Aの処理生成 = () => ({
    aCount: 0,
    aText: "",
    処理1(hoge) {
        if (処理A1(hoge)) {
            this.aCount++;
            this.aText += hoge.toString();
        }
    },
    処理2(hoge) {
        if (this.aCount < 10) {
            return 処理A2(hoge, this.aText);
        }
    },
});

const Bの処理生成 = () => ({
    bCount: 0,
    bText: "",
    処理1(hoge) {
        if (処理B1(hoge)) {
            this.bCount++;
            this.bText += hoge.toString();
        }
    },
    処理2(hoge) {
        if (this.bCount < 20) {
            return 処理B2(hoge, this.bText);
        }
    },
});

多少は見やすくなったか…?

もちろん、クラスを使ったってかまわない。

0
1
0

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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?