😢

変数の再代入は何故好まれないのか?

2023/02/03に公開

再代入とは

既に値が入っているものに、再度別の値を代入すること

//例
var hoge = 100; 
hoge = 200

好まれない理由

例を見てみましょう。 間の部分は意図的に隠しています。
salaryという変数に、1000が入っていますね。
さて、この変数は何を返すでしょう。

function getSalary() {
   int salary = 1000;
   ...
   ...
   ...
   ...
   ...
   ...
   return salary
}
getSalary()
// => 800
}

え...!?
1000じゃないんかい!?ってなりますね。

一体何が起きたのでしょう。途中で何が起きていたか見てみましょう。

function getSalary() {
   int salary = 1000;
   ...
   ...
   int tax = 200
   salary = salary - tax
   ...
   ...
   ...
   return salary
}

salaryに再代入が行われていましたね。
このように途中で値が変わると、自分が予想しない値になってしまう事があります。
そしてそれが、可読性の低下に繋がってしまいます。

予想される反論

「いやいや、コードしっかり読めば気づくでしょ」って思う方もいるかもしれません。
もちろん仰る通りです。

しかし、我々人間には限界があると思っています。
というのも小さい関数やクラスなら再代入にも気づけると思います。一方で数百行ある関数の途中でしれっと再代入なんてされたらたまったものではありません。気付けないでしょう。

再代入とどう向き合えばいいのか

1. 再代入が避けられない場合極力近くで行う

改善前

一度salaryを代入してから、再代入までの間に数百行あります。

function getSalary() {
   int salary = 1000;
   ...
   ... // ここが数百行とかあると、再代入に気づきにくい
   ...
   int tax = 200
   salary = salary - tax
   ...
   ...

   return salary
}

改善後

一度salaryを代入してから、すぐ次の行で再代入が行われています。
これなら気付けますね。

function getSalary() {
   int salary = 1000;
   int tax = 200
   salary = salary - tax
   ...
   ...

   return salary
}

2. 適切な変数名をつける

改善前

function getSalary() {
   int salary = 1000;
   ...
   ...
   int tax = 200
   salary = salary - tax

   return salary
}

改善後

salaryCalculatedTaxという変数名にすれば、税金の計算した後のsalaryというのがわかります。
同時に再代入も防げましたね。
(あえて直感的にわかりやすい変数名をつけました。多分もっといい変数名は沢山あります...

function getSalary() {
   int salary = 1000;
   ...
   ...
   int tax = 200
   salaryCalculatedTax = salary - tax

   return salaryCalculatedTax
}

まとめ

再代入を避けられるなら避けましょう。そうすることで可読性の向上が期待できます。
避けられない場合は、なるべく近くで再代入を行いましょう。

Discussion