yoskhdia’s diary

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

Chrome & Firefox 拡張機能で e-Gov 法令検索を使いやすくする(序)

FOLIO Advent Calendar 2021 - Adventar 19日目のエントリです。

法令解釈を仕様におとして実装するという仕事柄、e-Gov法令検索サイトを参照する機会がそれなりにあります。

elaws.e-gov.go.jp

弊社には優秀なコンプライアンス部門がありますが、なにかサービスをつくりたい場合には協力して仕様を決めていく必要があります。 特に、私の所属する顧客基盤部では、顧客情報管理や口座開設・解約、相続、契約管理などのシステム*1を担当するため、種々の法令*2が絡んできます。

これまでは、法令をPDFにしてiPadでメモをとるなどしていたのですが、あまりにも長大な法令を相手にするには原始的すぎるため、ブラウザの拡張機能(WebExtension)として便利機能をつくればもっと捗るなと常々思っていました。 サッと1日で書けるようなネタが思い浮かばなかったので、 e-Gov 法令検索サイトを使いやすくするべく拡張機能に手を出してみたエントリです。

なお、仕事でフロントエンド技術を触ることはほぼなく、最後の記憶はjQueryというドラゴンボールに例えるとソバくらいのレベルですので、何卒暖かい目でご笑覧ください。

つくったもの

法令では、括弧が多用されます。 これがいくつもネストされていくと非常に読みづらいものです。 そこで、括弧の範囲に色を付けることで読みやすくする機能を実装しました。 明らかに短時間で実装を終わらせたいことがミエミエのお題

f:id:yoskhdia:20211218014619p:plain

「(定義)」まで強調表示されてしまっているあたりに、まだまだ改良余地がうかがえますね…。

それでは、つくり方です。

*1:まだまだシステム化が追いついていないので助けてください!

*2:犯罪収益移転防止法、個人情報保護法マイナンバー法租税特別措置法金融商品取引法民法などなど

続きを読む

「データ」「情報」「知識」の含意からドメイン駆動設計と2種のインピーダンス・ミスマッチを辿る考察

FOLIO Advent Calendar 2020 17日目です。

「データ」「情報」「知識」の含意から、ドメイン駆動設計、そして、ソフトウェア設計の現実に存在するインピーダンスミスマッチまでを考えてみるエントリです。 本エントリは、主に次の論文「データ・情報・知識の含意と相互関係の二重性について」(関口 (2016))を多々援用します*1。 これは、情報経営学分野の知見をソフトウェア設計に持ち込む試みです。

*1:紀要論文ではありますが、著者は情報経営学分野での活躍があり十分参考になるものと思います

続きを読む

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されています。

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

続きを読む