誰が読んでも分かるシンプルなコードがあるとする。
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);
}
},
});
多少は見やすくなったか…?
もちろん、クラスを使ったってかまわない。