[リファクタリングTips]if-map変換
分岐処理とマップデータはお互いに変換が可能で、可能な限り分岐処理はデータに置き換えた方いいという話を説明します。
ちょっと抽象的なので何を言っているか分からないと思うので、ユーザーの住所の都道府県コードを例に説明します。
ユーザーの都道府県コードが1ならば北海道、2なら青森県、3なら岩手県という文字列をプロフィールに表示したいとします。この対応づけを表現するために、if文とMapの二つで表現してみます。
if形式
function getPrefecture(code) {
if(code === 1) {
return "北海道"
} else if (code === 2) {
return "青森県"
} else if (code === 3) {
return "岩手県"
}
}
Map形式
const map = {
1: "北海道",
2: "青森県",
3: "岩手県"
}
function getPrefecture(code) {
return map[code];
}
if形式とMap形式を比べると、コードのネストの深さ、記述量などMap形式の方がすっきりするかと思います。一旦Map形式の方が改善しているという前提で話を進めていきます。
一般化してみる
この改善は実は一般化することができます。if形式、Map形式ともに行なっていることは、「都道府県コード」に「都道府県名」を対応させる。という処理です。
このような、AにBを対応させるという処理は数学的に函数といい、ifとMapの2形式は同じく函数であると見ることができます。
差異
数学的な視点でいると函数という同じものと見ることができますが、プログラム的な視点で言うとこの両者は異なったものです。if形式の対応形式は実行時に決まる処理で表現され、Map形式はコンパイル時に決まる定数データとみることができます。
数学には時系列がないのですが、プログラムにはコンパイル・実行という時系列があるため、プログラム上では実行前・実行時という区別が生じています。
数学的に同じである函数を、実行前の実行時という時系列で区別したのが処理とマップデータの区別であると見れるのではないでしょうか。
宣言的
プログラミングにおいて、一般的に宣言的な記述の方がバグが少なく良いと考えられています。宣言的というのは、具体的な処理よりも意図を表現するものです。
if形式からMap形式への変換は、分岐処理からコードと都道府県名の対応させるという意図表現に変換している、と言えると思います。
まとめ
分岐処理はマップデータに置き換えることで、より宣言的になり可読性が上がりバグの余地が減り、これは一般化して利用できる手法なので意図的に活用していきましょう。
この手法をif-map変換とでも名付けておきます。
補足
*Mapは有限で少数のデータに適している。
*函数は無限の組み合わせに対して処理を記述できるメリットがある。
*厳密にに実行前と実行時という区別ではなく、ぱっと見で宣言的な記述かどうかという認知面が大事と思っている
Discussion