増田さん/@irofさんのDDDサンプル徹底解説についての雑感

jsug.doorkeeper.jp

 

本当に面白かった。DB周りの質疑も楽しかった。

内容は他の方のブログ参照。

これとか

takeda-san.hatenablog.com

 

以下雑感

 

DDDと増田さん流のOOPを使ったアプリケーション開発

個人的にDDDというのは、アプリケーションの目的であるユーザー世界の関心毎を中心に置こう、というだけでコンセプト自体はそんなに特殊なものではなく、ソフトウェアエンジニアリングというか、プログラマー界隈では多くのグルたちが同じようなことを目指していたと思う。要するに関心毎の分離。

いくつかの重要なアイデアが発明されたけど。RepositoryとかAggregateとか、境界づけられたコンテキストとか。

 

いくつかの点で増田さんのやり方はエバンズが本で書いたものとはずれてたり、ポイントが違っていたりするから、DDDということではなく増田さんというプログラマーの先輩によるOOPを使ったアプリケーション開発の解説、ということと捉えている。

 

ドメイン層の解説と質疑聞きながら思ったこと

  • ドメイン層は条件分岐と計算ロジック、という整理はかなりしっくりくる。改善の指針にもなる。入出力の関心毎はドメイン層ではない所に追い出すこととなる。
  • フィールドのゲッターをフィールド名()というメソッドにしている。役割はゲッターだけど、getはいらない、可読性優先、ということという。確かに見やすい。C#とか、Kotlinとかプロパティが機能としてあるけど、目的は同じと思う。
  • パッケージ構造/関連の重視。一貫して、コードをドキュメントとして扱えることを目指していると思うが、このパッケージ構造の重視も面白い。変な循環参照なんかはコードの不吉な匂い、ということ。
  • Java標準の型ではなく、汎用的なDateとかの型を定義している。それはいいんだけど、PayRollというすごく抽象度の高い、というかコアなクラスのメソッドで汎用型が顔を出すのは、自分としては納得がいかない。後でコード見て考えてみたい。
  • 試行錯誤の過程を見せてもらえたってのはすごく大きい。可読性、パッケージの関連、見た目の感覚、ドットの数,一覧。こういうものを手がかりに改善していく、ということ。
  • 動くものを作ってから改善していった、ということらしい。多分、経験豊かな人なら最初からやれるんだろうけど、多くの人がこれをやる指針になると思う。

アプリケーション層とインフラ層の解説と質疑聞きながら思ったこと

  • Repositoryはアプリケーション層。これはすごく面白い。これまで、入出力はIoCを使って隠蔽し、インタフェースのみをドメイン層としてきた考えだったけど、現実として、インタフェースにも入出力の考慮が出てきてしまう。Repositoryそのものをドメイン層から追い出したことで、アプリケーションの処理方式に基づいた様々な考慮がアプリケーション層で記述する、という形にすることができる、と感じた。
  • 履歴の追加と最新状態の書き換えは別トランザクションにしている、とのこと。ここは理想としてはそうしたいものだと理解している。現実的に一つのアプリだと、1トランザクションにしてしまった方が楽とは思う。ただ、どちらにしてもそれらはアプリケーション層の関心毎。履歴の追加と最新状態の書き換えは別の仕事ということかと
  • トリガーを利用して最新の書き換えをDB側でやっていて、うまくいっている、という方がいた。個人的にトリガーでやりたいな、でも怖いなあ、と思ったことはなんどもあるので、それで行けるんだなあ、と思った。こういうの挑戦するのはすごいな。考慮すべきは、ソースからその処理の情報が消えることかな、とは思う。ソースを読んでもアプリの全体像が分からなくなる。ドキュメンテーションとしての機能が奪われる気がする。ここら辺は方針の問題。
  • DB例外(多分ユニーク制約違反とか)とかは基本的には起こらないようにする。起こるのはシステムエラーなので例外なげて終わらせる。これ、そうだよね、という気がする。
  • JSONとかは、ドメインオブジェクトをそのまま出したい。階層深くなるけど、ということ。ここ、個人的にかなり悩んでた。結局階層が不自然だから、詰め替え発生するよなあ、と。ここら辺を綺麗に、ということならプレゼンテーターを導入してもいいんだろうなとは思う。
  • 画面、API共に詰め替えをする時もある、とのこと。個人的にどこを綺麗にしていくか、ということかと。

 

JIGも素晴らしかった。