ステータスの管理
どんなシステムを作っていても、ステータスの管理は出てきます。
例えば顧客の状態とか。
SELECT * FROM customer;
+----+-----------------------+------------+
| id | name | status_id |
+----+-----------------------+------------+
| 1 | おおがき | 1 |
| 2 | さとう | 3 |
| 3 | すずき | 2 |
| 4 | いとう | 3 |
+----+-----------------------+------------+
SELECT * FROM m_status;
+----+-----------------------+
| id | name |
+----+-----------------------+
| 1 | 未発注 |
| 2 | 見積済 |
| 3 | 注文済 |
| 4 | 支払済 |
| 5 | 発送済 |
+----+-----------------------+
そしてプログラムとかで、ステータス情報を変更したりしますよね。
// 見積終了時
customer.setStatus(2);
マジックナンバーで書いてはいけない
ここで、2というステータスIDを直接書きました。
このようにプログラムに入っていて何を表しているかわからない数字をマジックナンバーと言います。
可読性が低いうえに、マスタデータが更新されてidがズレてしまったりしたら、一つ一つ手作業で直す必要があります。
バグの温床ですね。
できれば数字ではなく、定数で書いておきたい。
そうすればidがずれても修正が一か所済みますし、定数名なら検索や置換も簡単です。
こんな感じ。
// 見積終了時
customer.setStatus(STATUS.estimated);
しかし、こんなふうにconfigファイルに定数で書いておくというのもスマートじゃない気がします。
const STATUS = {
contacted : 1,
estimated : 2,
ordered : 3,
paid : 4,
sent : 5
}
マスタデータはデータベースに入っているわけですから、マスタデータを直した上にconfigを直すのも二度手間ですよね。
そこで今回は、データベースのマスタデータからステータス情報を取得してきてマジックナンバーを回避する方法についてご紹介します。
ステータス情報をデータベースからとってくる
データベースにカラムを追加
まずは、データベースのマスタデータにプロパティ名用のカラムを追加しましょう。
+----+-----------------------+--------------------+
| id | name | property_name |
+----+-----------------------+--------------------+
| 1 | 未発注 | contacted |
| 2 | 見積済 | estimated |
| 3 | 注文済 | ordered |
| 4 | 支払済 | paid |
| 5 | 発送済 | sent |
+----+-----------------------+--------------------+
マスタデータから辞書を作成するモジュールを作成
次に、STATUS.estimated
みたいにするとidの2を返してくれるモジュールを作っておき、必要に応じて呼び出します。
export default{
generateIdDict(objList, column){
const status = {};
objList.forEach((v) => {
status[v[column]] = v.id;
});
return status;
};
};
import customerModule from 'module';
// customerStatusにデータベースからデータを入れておく
// マスタデータからIDの辞書を作る
const STATUS = customerModule.generateIdDict(customerStatus, 'property_name');
// 使うときはこんな感じ
customer.setStatus(STATUS.estimated);
以上です。
ただ、後からの読みやすさはありますけど、書くときにはプロパティ名をある程度覚えておかないといけません。
今回はダミーデータで作りましたけど、ステータスを表すプロパティ名の命名ってどうすればわかりやすいか悩みますね。
そもそも日本語でも「〇〇中」とか「〇〇済」とか、全体の中のどの段階かわかりやすいかというと微妙ですし。
良いアイデアがあったら教えていただきたいです。