yoskhdia’s diary

DDDとかプログラミングとかアーキテクチャとか雑多に

EventStorming and Narrative

f:id:yoskhdia:20181225103320j:plain:w400

Okuda on Twitter: "Chatworkさんのトコロでちょっと喋ってきました。口頭メインのためスライドは薄いです🌷 Event Storming and Narrative https://t.co/dI6KJzgX1q"

ということで、スライドがあまりにも薄いため補足を残しておくエントリです。

speakerdeck.com

続きを読む

Scalaを例に「仕様」パターンを実装する

この記事はFOLIO Advent Calendar 2018の6日目です。

FOLIOでも使っている「仕様」パターンをScalaで実装する方法について紹介します。

「仕様」パターンとは

Eric Evans氏とMartin Fowler氏による仕様パターンに関する論文があります。 https://martinfowler.com/apsupp/spec.pdf ※PDFです

また、DDD本では次のように紹介されています。

特殊な目的を持った述語的な値オブジェクトを明示的に作成すること。仕様とは、あるオブジェクトが何らかの基準を満たしているかどうかを判定する述語である。

(中略)

  1. オブジェクトを検証して、何らかの要求を満たしているか、何らかの目的のための用意ができているかを調べる。
  2. コレクションからオブジェクトを選択する(期限が超過した請求書を問い合わせる場合など)。
  3. 何かの要求に適合する新しいオブジェクトの生成を定義する。

検証、選択、要求に応じた構築という、これら3つの用途は、概念レベルでは同じものである。

− エリック・エヴァンスのドメイン駆動設計 p.228-229

今回は1点目のバリデーションに使うケースで考えます。

続きを読む

エンティティの同一性を表現するためにequalsをオーバーライドすべきか否か

このエントリは ドメイン駆動設計 #1 Advent Calendar 2018 の5日目です。
4日目は @s_edward さんの「Microservices と DDD」でした。
6日目は @kawakawa さんの ドメインオブジェクトとユースケースの関係について です。

TL;DR

エンティティの同一性を表現するために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 (イベントストーミング) というモデリング手法があります。

www.eventstorming.com

EventStorming is a flexible workshop format for collaborative exploration of complex business domains.

EventStormingは、複雑なビジネスドメインを協同的に探求するための柔軟なワークショップ形式のひとつです。(意訳)

考案者はAlberto Brandolini氏で2013年にはブログに最初の投稿がされています。 海外での認知度は高く*1、Eric Evans氏のプレゼンテーションの中でも強力な手法であると言及*2されています。

近々、この手法を試せる機会が来そうなので、そのやり方について(私見を交えつつ)まとめてみるエントリです。

続きを読む

「Don't build framework, Build platform」というテーマでエムスリーさんのTech Talkに参加してきました

ScalaMatsuri 2018で @jooohn1234 さんから、エムスリーさんで行われているTech Talkにご招待いただいたので発表してきました。 なんと、今回で第92回(!)

m3dev.github.io

発表資料

docs.google.com

今回もトークスクリプトを付けて発表資料を公開します。

エムスリーさんは定期的に社内技術発表会を開催しており、社外の人でもカジュアルに参加できる運営をしておられます。 興味のある方はコンタクトをとってみてはいかがでしょう?

そのトランザクションは果たして本当にトランザクションなのだろうか?

DDDネタです。 DDD Community-JPのDiscordで「複数の集約(Aggregate)をまたいで整合性をどう担保するのが良いのか?」という話がされていました。 この話を読んでいて、

yoskhdia.hatenablog.com

でもサラッと触れた「トランザクション」をもう少し掘ってみようかなと思い立ったので書いてみるエントリです。

続きを読む

Kamonを使ってログにトレースIDを出力する(+Play Framework)

一般に非同期処理を行うと、その実行をログからトレースすることは難しくなります。 Scalaアプリケーションを運用する際もこれが問題となります。 コツコツとログにIDを埋めて回ることもできますが、横断的な関心事はAOPで解決したくもなります。 ということで、今回はKamonを試してみました。

kamon.io

Kamonは便利なのですがイマイチドキュメントがまとまっておらず、ちょっと苦労したのでここにまとめておくエントリです。

続きを読む