この記事では、より良いコードを書くためのテクニックについて解説する。
結論
変数は上書きしない。
変数を使う際は、不変な状態(上書き不可能な状態)で使う。
なぜ不変にすることが望ましいのか?
これに対する答えとしては
「値が変わってる=意味が変わってる=変数名も変えるべき」
だからだ。
例:商品の価格を出力するプログラム
以下のプログラムを例に解説する。
let price = 100;
console.log(price); // 「100」が出力される
このプログラムに対して、8%の税込み価格に変更するような仕様変更があったとする。
「変数を上書きしない」というルールを守らない場合、以下のようなコードになる。
悪いコード
// 元の価格
let price = 100;
// 税込み価格を加算して、変数を書き換える
price = addTax(price);
console.log(price); // 「108」と出力される
// 税額を加算して、税込価格を返却する関数
function addTax(price) {
return price * 1.08;
}
このコードは、3つの問題を抱えている。
let price = 100
を書いてからconsole.log(price)
までの間にたくさんのコードや関数が書いてあった場合、どこでどのように書き換えられているか分からず、読み手の認知負荷が高いprice
という変数名が、税込価格なのか税抜価格なのか分かりづらい- 後で税抜価格を使いたい場合、すぐに使いづらい
この3つの問題を解消する方法が、変数を書き換えないことだ。
改善したコード
// 元の価格(constで定義)
const basePrice = 100;
// 税込み価格を加算する(税込価格についてもconstで定義)
const priceWithTax = addTax(basePrice);
console.log(priceWithTax); // 「108」と出力される
// 税額を加算して、税込価格を返却する関数
function addTax(price) {
return price * 1.08;
}
変数を不変(const
)にすることで、先程の問題点を一気に解消することができる。
- 仮に
console.log(priceWithTax)
の前にたくさんのコードや関数があっても「console.log()
は税込価格を出力している」とすぐに理解できる priceWithTax
という変数名から、明らかに税込価格であることが理解できる- 後で税抜価格を利用したい場合でも、
console.log(basePrice)
をすれば良い
特に気をつけてほしい点として、
変数を上書きしたいようなケースは、そのデータの持つ意味が変わってしまっていることが多い。
今回の場合では、「税抜価格→税込価格」に変更している。
日本語で「価格」と言われても
「それって税込み?税抜き?」と分からなくなるのだから、プログラムにおいても具体的な変数名で定義しておいたほうが良いわけである。
補足
- このような不変な変数の状態を「イミュータブルである」という
- 変数名に困ったらChatGPTに聞くと良い
まとめ
- 後から上書き可能な変数は使ってはいけない
- 基本的に脳死で
const
など不変を意味する修飾子を付与しておけばOK - 上書きしたいような場合はデータの意味が変わっているので、より具体的な変数名で定義すべき