🦈

値オブジェクトについて

2022/08/18に公開

※文章は現場で役立つシステム設計

例えば電話番号

電話番号には次のようなルールがあります。

  • 使える文字種は数字だけ
  • 市外局番は"0"で始まる
  • 合計の桁数は10桁
  • 形式は"市外局番-市内局番-加入者番号"
  • 加入者番号は4桁固定
  • 先頭の"0"を除いた市外局番市外局番は1桁から4桁

この電話番号を扱う変数を、String型型で宣言しただけでは以下の意味になる。

  • 文字の種類は数字だけでなく漢字でも記号でも何でも良い
  • 長さは無制限
  • 形式は自由
    電話番号をstringで扱うと不正な値が入ってしまい、思わぬバグの原因になる。

解決策→値を扱うための専用のクラスを作る

電話番号はstring型でなく、独自にTelephone型としてクラス宣言する。
電話番号として妥当な長さや文字種のルールを、Telephone型としてクラス宣言する。
電話番号を扱うときは、必ずTelephone型のオブジェクトとして扱えば、正しいデータであることが保証できる。

Telephone型のように目的に特化した「型」として宣言し、利用することで、ソースコードは見違えるように意図的に明確になり、動作も安定する。
「電話番号」は単なるStringではない。
このように、
値を扱うための専用のクラスを作るやり方を値オブジェクト(valueObject) と呼ぶ。

参考になるコード(サイト

https://tech.isid.co.jp/entry/2021/12/17/goでValueObject(値オブジェクト)_を実装する

https://zenn.dev/msksgm/articles/20220304-go-itddd-02-valueobject

Discussion