IF仕様書にない値を受け取ったときに耐えるデザインパターン

外部とシステム連携する場合、必ずIF仕様書を作成します
そこでよくあるのがenum
例えばアンパンマンに登場するパンだったらIF仕様書には

パン: アンパン | 食パン | カレーパン

と必ず書いてある
ただ先方から急にIF仕様書に無い値が連携されてくることがあります
たとえばメロンパンとか

聞いてないし!!

この場合、通常は受け取ったタイミングでバリデーションエラーにしますが、いろいろな事情により一旦これを受け取った方が良いこともあります
今日はそうゆうときに私がやってるデザインパタンを紹介します

def-undefパターン

パターン名は今決めましたw
もっといい名前があったら教えてください
先ほどのパンのデータをdefinedとundefinedというクラスに分けて管理します
definedの方はIF仕様書通りのenumで、undefinedの方はStringを保持するバリューオブジェクトです
kotlinで書くとこんな感じ

enum class PanDefined {
    あんぱん, 食パン, カレーパン
}

data class PanUndefined(val value: String)

data class Pan(private val obj: Either<PanUndefined, PanDefined>) {
    val value: String
        get() =  obj.fold({ it.value }, { it.name })
}

使う側はPanのみを使います
保持しているdefinedやundefinedのクラスは意識しません

何が良いのか

IF仕様外のデータを全てエラーにしてしまうと、処理がエラーになった際に、状況確認のために参照画面で表示したら参照画面もエラーになってしまいます
(この時は結局サーバに入って生データを直接見るはめに... )
つまりここでの要件は「処理上は落ちるべきだが、参照の時はそのまま出してほしい」なのです
そうゆう時に上記のようなデザインにしておくとエラーにするかどうかをAPI単位で変更できるので、柔軟に対応できます

まとめ

def-undefパターンを使うとenumに知らない値が来ても柔軟に対応できる
IF仕様書が信用ならない相手と連携する場合は有効ですw