1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

マジックナンバーをやめてデータベースの情報からステータスの切替をする方法

Posted at

ステータスの管理

どんなシステムを作っていても、ステータスの管理は出てきます。
例えば顧客の状態とか。

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 | 発送済                 |
+----+-----------------------+

そしてプログラムとかで、ステータス情報を変更したりしますよね。

index.js
// 見積終了時
customer.setStatus(2);

マジックナンバーで書いてはいけない

ここで、2というステータスIDを直接書きました。
このようにプログラムに入っていて何を表しているかわからない数字をマジックナンバーと言います。
可読性が低いうえに、マスタデータが更新されてidがズレてしまったりしたら、一つ一つ手作業で直す必要があります。
バグの温床ですね。

できれば数字ではなく、定数で書いておきたい。
そうすればidがずれても修正が一か所済みますし、定数名なら検索や置換も簡単です。
こんな感じ。

index.js
// 見積終了時
customer.setStatus(STATUS.estimated);

しかし、こんなふうにconfigファイルに定数で書いておくというのもスマートじゃない気がします。

config.js
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を返してくれるモジュールを作っておき、必要に応じて呼び出します。

module.js
export default{
   generateIdDict(objList, column){
      const status = {};
      objList.forEach((v) => {
         status[v[column]] = v.id;
      });
      return status;
   };
};
index.js
import customerModule from 'module';

// customerStatusにデータベースからデータを入れておく

// マスタデータからIDの辞書を作る
const STATUS = customerModule.generateIdDict(customerStatus, 'property_name');

// 使うときはこんな感じ
customer.setStatus(STATUS.estimated);

以上です。
ただ、後からの読みやすさはありますけど、書くときにはプロパティ名をある程度覚えておかないといけません。
今回はダミーデータで作りましたけど、ステータスを表すプロパティ名の命名ってどうすればわかりやすいか悩みますね。
そもそも日本語でも「〇〇中」とか「〇〇済」とか、全体の中のどの段階かわかりやすいかというと微妙ですし。
良いアイデアがあったら教えていただきたいです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?