この記事は
ドメイン駆動設計 advent calendar 11日目
の記事です。
#日本語版だとわかりずらい「不変(不変条件)」
エヴァンスのドメイン本では、頻繁に「不変(不変条件)」という言葉が出てきます。Kindleで検索してみたところ、83件でした。
分類してみると、主に2箇所でよく使われています。
1つは「ValueObject(値オブジェクト)」の項。もう一つは「Aggregate(集約)」の項です。
Factoryでも多く使われていますが、こちらはAggregateの不変条件に関連する内容ですね。
さて、実は「ValueObject」と「Aggregate」で使われている「不変(不変条件)」の意味って全然違う意味なんです。
弊社でドメイン駆動設計の読書会をしているなかで、話題になり目から鱗が出てしまったので紹介しますね。
「ValueObject」と「Aggregate」の項をそれぞれよく読むと、「ValueObject」では**「不変」、「Aggregate」では「不変条件」**という言葉で表現されています。
そこで、エヴァンズ本の索引を見てみます。
#索引を読もう
索引を読むと、「不変」と「不変条件」の項目は別れて解説されています。
- 不変(immutable) 生成された後、目に見える状態が変化しないという性質
- 不変条件(invariant) 何らかの設計要素についての表明で、常に真でなければならないもの。ただし、メソッドの実行中やまだコミットされていないデータベーストランザクション中といった特殊な過渡的状況を除く
なんと!!!元の英語の用語からして違う言葉!!!「不変」は「immutable」、「不変条件」は「invariant」という用語でした。
#原本を見てみよう
ということで原本を見てみましょう。
-
ValueObject・・・When you care only about the attributes of an element of the model, classify it as a VALUE OBJECT. Make it express the meaning of the attributes it conveys and give it related functionally. Treat the VALUE OBJCET as immutable.
-
Aggregate・・・The root ENTITY has grobal identity and is ultimately responsible for checking invariants.
それぞれの要素の説明の一部を抜粋しましたが、やはり使い分けられてますね。
#英和辞典(英辞郎より)を見てみよう
さらに英和辞典で両方の用語を調べてみました。
- immutable
【形】
〔法則・規則・決定事項・運命などが〕変わらない、変化しない、不変の、不易の、変えることのできない、変更不可能な
- invariant
【名】
《数学》不変式、不変量
《コ》不変条件
【形】
不変の、変わらない
うーん、いまいち。。。invariantの方は数学的な意味合いがある感じでしょうか?
#WikiDiffなるもので調べてみた
WikiDiffなるサイトがあり、ここでimmutableとinvariantのDiffを取ってみました。
https://wikidiff.com/immutable/invariant
- immutable
- Unable to be changed without exception.
The government has enacted an immutable law. - (programming, of a variable) Not able to be altered in the memory after its value is set initially, such as a constant.
なんとなく、変更不可という意味合い。一度決まったら例外なく変更してはいけないという意味合いでしょうか。
- invariant
- not varying; constant
- (mathematics) Unaffected by a specified operation (especially by a transformation)
- (computing, programming) Neither covariant nor contravariant.
なんとなく、変更不可といった意味ではなく、変化しない、他から影響されては変化しない。といった意味合いに思えます。
もう一度、Aggregateの不変条件とは
もう一度、Aggregateの不変条件について考えてみます。実は不変条件とは何かということについては、書籍内で明確に説明されています。
不変条件(原書ではInvariant)とは、データが変更される時は常に維持されなければならない一貫性のルールで、集約のメンバ間の関係も含んでいる。複数の集約にまたがるルールはどれも、常に最新の状態にあるということが期待できない。イベント処理やバッチ処理、その他の更新の仕組みを通じて、他の依存関係は一定の時間内に解消できる。しかし、1つの集約内で適用される不変条件は、各トランザクションの完了によって強制される。
要するに・・・
invariantについては、書籍内でその意味が再定義されているということですね。
なので、immutableとは明確に意味が違うので、用語も分けているというわけでした。
これが何の役に立つかと言われると微妙なところですが、「不変」という用語を複数の意味で使われていると思っていた方にとっては少しは意味が明確になるのではないかと思い記事にしてみました。。。