Chapter 03

第三章 定数を使った評価と enum を使った評価

kuramapommel
kuramapommel
2021.04.23に更新

「条件」は全部でいくつあるか?

ifswitch では マジックナンバー を避けることを目的に 定数 を使うことがあるでしょう
例えば下記のコードのような状況です

const LONG_SWORD: string = '太刀'
const DUAL_BLADES: string = '双剣'

function attack(type: string) {
  switch (type) {
    case LONG_SWORD:
      console.log("太刀で攻撃")
      return

    case DUAL_BLADES:
      console.log("双剣で攻撃")
      return
  }
  
  return
}

attack(DUAL_BLADES)

こちらのコードは特に問題ないように見えますが、仮に条件が増えた場合は定数を追加することになります

ここで発生する問題が、 網羅性の担保 が簡単にできないことです

どういうことかというと、例えば上記のコードの場合、条件のために用意されている定数は 2 つですが、他の箇所にも条件のために用意されている定数がないとは言い切れません

例えば下記のコードのような状況です

// const.ts に定義
export const BOW: string = '弓'

// weapon.ts に定義
const LONG_SWORD: string = '太刀'
const DUAL_BLADES: string = '双剣'

「いやいや、そんなこと実際に運用していく上でルール決めて気をつければ良いでしょ」と思うかもしれませんが、残念なことに 我々愚かな人間は「運用でカバー」すると決めたルールを簡単に破ってしまう 生き物です

運用でカバー がどれだけ危険かという話は、 Google 先生に委ねる として、ルールを守るのは人間よりもコンピュータの方が遥かに得意です

さて、「条件はいくつあるか?」をコードからすぐに読み取ることはできますでしょうか

enum によって「条件」をまとめる

そこでこの問題を解決するために、だいたいのプログラミング言語は enum という機能を提供してくれています

enum というのは 「列挙型」 と呼ばれるもので、ざっくりというと いくつかの定数をひとまとまりの意味のあるグループとしてまとめることができるもの です

先のコードを enum を使って表現してみましょう

enum WEAPON_TYPE {
  LONG_SWORD,
  DUAL_BLADES,
  BOW
}

function attack(type: WEAPON_TYPE) {
  switch (type) {
    case WEAPON_TYPE.LONG_SWORD:
      console.log("太刀で攻撃")
      return

    case WEAPON_TYPE.DUAL_BLADES:
      console.log("双剣で攻撃")
      return

    case WEAPON_TYPE.BOW:
      console.log("弓で攻撃")
      return
  }
  
  return
}

attack(WEAPON_TYPE.DUAL_BLADES)

この場合、 switch の条件としては enumWEAPON_TYPE に定義したものしか使うことができないので、 WEAPON_TYPE に定義された要素を見れば何通りの条件があるのか一目瞭然ですね

enum を使ってあげることで、網羅性の担保の問題が(ちょっとだけ)解決しました