ドメインモデリングにおける抽象の役割、tagless-finalによるDSL構築、そして型安全な最適化
ドメインモデルの崩壊
これにより、誤った意味をそもそも記述できないようにすることが可能
DSL = 意味を埋め込める、型安全なインタフェースと捉えられる
DSL を用いてドメインの言葉で直接問題を記述すると、ビジネスの本質をそのままコードに落とし込むことで、偶有的複雑性を排除できる モデルを言語として定式化することで、どの操作が許され、どの解釈が正当かを型 + 構文レベルで制約できる
偶有的複雑性
それぞれの性質に合わせた向き合い方が必要
https://gyazo.com/63985d717e8ea5b8b82cf3efc3e54d04
抽象の本質
https://gyazo.com/e9bb9f46f77ab9ea39edc8c368bd7a0e
ドメインモデルに適用すると、ドメインの意図を崩さず に本質を抽出し、その 意図を実装可能な形で表現 すること
つまり、課題の解像度を高め、予測可能性 を高めること 抽象 = 安定
より安定してるものに依存させる
抽象の特性
本質を抽出する(意味のコアを形成する)
ドメイン知識 から本質概念を抽出し、DSL の語彙として定義する 特に重要
ノイズ = 抽象のコアとなる 関心事 に対応付けられないもの https://gyazo.com/d1db39f3f6bcca47b5be7a30571edca9
DSL に含める演算や型、操作を厳選し、誤用を減らす
構造に作用する
合成可能性 DSL に対する操作が安全に合成可能であること 直交性: 他の構成要素と独立して機能し、干渉し合わない 変更や検証のしやすさ
型安全な埋め込み言語を構築する手法
DSL の型付けがホストとなる言語のそれに帰着する
対象言語とメタ(ホスト)言語
対象言語: Int、メタ言語: Repr[Int]
対象言語 = 表現したい言語
これらを分離することが大事
意味の曖昧さは偶有的複雑性の起点となる
言語を構成するもの: 構文、型付け規則、意味論
warning.icon メタ言語から対照言語の世界への流入経路は慎重に設計する
多層の値を受け取ると、意図しない値が世界に紛れ込む
tagless-final のメリット
扱いたいビジネスドメインを表現できるか早期に検証可能
偶有性複雑性を排除しながらコーディングが可能
単なるデータではなく、意味を持ったドメインの計算対照をクエリしたい
特に参照系が多い場合、クエリ自体がドメイン資産になる
が、SQL だとインフラ層に押し込められて再利用性が低い...
とはいえ、クエリにはパフォーマンス問題はつきもの
クエリ DSL を最適化するのが、Layered Final
多層のインタプリタを与え、最適化を施せるようにしたアプローチ
代数的正規化を行う
層を追加しても削除しても、DSL 自体やユーザプログラムに影響はない
ユーザプログラムや DSL 自体を早期に検証できる旨みは健在
似て非なるユースケース差分をどうするか
汎用エンジンに寄せる: 重厚長大化
個別・個社開発寄せる: 保守難易度高
これらの中間として DSL が使えるのでは?
AI + SPL + DSL で型安全で開発の出力を最大化できるかも?