FOLIO Advent Calendar 2020 17日目です。
「データ」「情報」「知識」の含意から、ドメイン駆動設計、そして、ソフトウェア設計の現実に存在するインピーダンスミスマッチまでを考えてみるエントリです。 本エントリは、主に次の論文「データ・情報・知識の含意と相互関係の二重性について」(関口 (2016))を多々援用します*1。 これは、情報経営学分野の知見をソフトウェア設計に持ち込む試みです。
続きを読むこの記事はFOLIO Advent Calendar 2018の6日目です。
FOLIOでも使っている「仕様」パターンをScalaで実装する方法について紹介します。
Eric Evans氏とMartin Fowler氏による仕様パターンに関する論文があります。 https://martinfowler.com/apsupp/spec.pdf ※PDFです
また、DDD本では次のように紹介されています。
特殊な目的を持った述語的な値オブジェクトを明示的に作成すること。仕様とは、あるオブジェクトが何らかの基準を満たしているかどうかを判定する述語である。
(中略)
- オブジェクトを検証して、何らかの要求を満たしているか、何らかの目的のための用意ができているかを調べる。
- コレクションからオブジェクトを選択する(期限が超過した請求書を問い合わせる場合など)。
- 何かの要求に適合する新しいオブジェクトの生成を定義する。
検証、選択、要求に応じた構築という、これら3つの用途は、概念レベルでは同じものである。
今回は1点目のバリデーションに使うケースで考えます。
続きを読むこのエントリは ドメイン駆動設計 #1 Advent Calendar 2018 の5日目です。
4日目は @s_edward さんの「Microservices と DDD」でした。
6日目は @kawakawa さんの ドメインオブジェクトとユースケースの関係について です。
エンティティの同一性を表現するためにequalsをオーバーライドすべき ではない と考えています。
次のような実装を目にすることがあります。以降のコードは Scala 2.12.7 で動作確認しています。
※私が書きやすいのでScalaを用いていますが、他言語においても同様のことは言えるかと思います。
trait Identifier trait Entity[ID <: Identifier] { def identifier: ID def canEqual(that: Any): Boolean = this.getClass == that.getClass override final def equals(that: Any): Boolean = { that match { case that: Entity[_] => canEqual(that) && identifier == that.identifier case _ => false } } override final def hashCode(): Int = identifier.hashCode() }
equals
をオーバーライドすることで、エンティティが同じであるかをIdentifierを使って判定できるようになっています。
しかし、この実装は果たして良いのかどうかを考えてみるエントリです。
EventStorming (イベントストーミング) というモデリング手法があります。
EventStorming is a flexible workshop format for collaborative exploration of complex business domains.
EventStormingは、複雑なビジネスドメインを協同的に探求するための柔軟なワークショップ形式のひとつです。(意訳)
考案者はAlberto Brandolini氏で2013年にはブログに最初の投稿がされています。 海外での認知度は高く*1、Eric Evans氏のプレゼンテーションの中でも強力な手法であると言及*2されています。
近々、この手法を試せる機会が来そうなので、そのやり方について(私見を交えつつ)まとめてみるエントリです。
*1:Wikipediaのページがあったり Event storming - Wikipedia
*2:Explore DDD 2018基調講演 Eric Evans - Keynote: DDD Isn't Done: A Skeptical, Optimistic, Pragmatic Look - YouTube