system-sekkei / isolating-the-domain Goto Github PK
View Code? Open in Web Editor NEWarchitecture sample using : Spring Boot gradle, Spring MVC, Thymeleaf, and MyBatis
architecture sample using : Spring Boot gradle, Spring MVC, Thymeleaf, and MyBatis
・安全で簡潔なコレクションフレームワーク
・Rejectedバリューの表示の仕組み
これらを、パッケージとして作成し、gradleで依存性解決をしたい
公開Repositoryへの登録をしたいが、どうすれば良い?
PostgreSQL で動かすと、 USER スキーマが予約語のUSERと同じになっているため、スキーマが作成できませんでした。H2 では動作します。別のスキーマ名にすることで回避できます。
https://github.com/system-sekkei/ddd-base/blob/master/database/src/main/resources/schema.sql#L1
boolean ではなく、enum でやるパターンはどうだろうか?
シングルプロジェクトにともない、ui: は、不要では?
ui にも、 MyBatis の LocalDateHandler がありますが、これ、必要な理由はなんでしょうか?
LocalDate を使うように変更しましょう。
日付の扱い方のサンプルとして、そのほうが有用でしょう。
myBatis のタイプハンドラーも追加しておく
identity, value object, service
repository, factory
aggregate
root
バリデーションの失敗時に、拒否された入力値をフォームに表示する仕組みを、ドメイン層のクラスから取り除きたい
概要:
ドメインオブジェクトに、不正な入力値を保持したくない
(ドメインオブジェクトにバリデーション時の不正値を扱うコードを書きたくない)
背景:
th:field でバインディングした場合、不正値を再表示するためには、ドメインオブジェクトが入力された文字列を持ち、バリデーション結果を持ち、toString()で、表示内容を変える仕組みを記述している。
このためのコードは、本来、ビューで解決すべき内容であり、ドメインオブジェクトを不適切に汚染している。
解決案:
th:field ではなく、
th:id, th:name, th:value を明示的に使う
th:value で FieldError#getRejectedValue()を表示する
効果/目標:
ドメインオブジェクトからバリデーションの不正入力値を扱うコードを取り除く
Thymeleafのテンプレートの記述を「できるだけ」簡潔にする
代替案1:
Thymeleafではなく、JavaScriptで実現する
仕組みが複雑になり、可読性、保守性に問題が多い
留意事項
・Thymeleaf の用意している拡張の仕組みの利用を検討
http://www.thymeleaf.org/doc/tutorials/2.1/extendingthymeleaf.html
・BindingResultから、FieldErrorsあるいは、RejectedValuesを、テンプレートに渡す方法
・公開されたレポジトリでの提供(依存性解決)
14桁のデータを入力するとDBエラーで落ちるのでvalidationを追加する
public class PhoneNumber {
@NotBlank(message = "電話番号を入力してください")
@Pattern(regexp = "([0-9]{2,4}-[0-9]{2,4}-[0-9]{2,4})?", message = "xx-xxxx-xxxxの形式で入力してください")
@Size(min = 8, max = 13, message = "桁数は8桁以上13桁以下で入力してください")
String value = "";
@Override
public String toString() {
return value;
}
}
ドメインオブジェクトでは、不正な値を扱う記述はしない。
MVCにまかせる。
参考 #47
起こった事実を insert オンリーで追加し、
最新の事実を、状態テーブルに導出して管理する仕組みのサンプルを追加
enum で性別を追加しましょう。
モデルの要素のサンプルとして。
男性
女性
不明
の三つ。
なぜ重要か?
人間の関心事の表現方法のひとつ(ドメインモデリングと一体)
どう実装するか?
整列
対比
隣接
反復
表現手段
位置、フォント、色、...
実装技術
Bootstrap
コンテンツとコントローラ
メールアドレスは変更される可能性が高いので、サーバーで発行するGUIDとかに変更したい。
(認証とか辛いので、今回はメールアドレスをドメインオブジェクト化する方向にで。)
H2データベースとデータのセットアップスクリプト、 利用者テーブル、トップに利用者一覧を表示するための、model/service/datasource もお願いします。 あと、サービスクラスのテスト((顧客一覧)の取得メソッド)
DDD-base というのは、モデルの内容からすると、ちょっと言いすぎかなあ。
このモデル自体は、ドメイン駆動設計の文脈だと "Isolating the Domain" (第4章のタイトル)の参考実装かと思います。
というわけで、 リポジトリ名を ddd-base から isolating-the-domain に変えようと思うですが、どうでしょうか?
41文字以上を入力するとDBエラーで落ちるのでvalidationを追加する
基本線は、特別な値を持つ
特別な値を持ったときの画面表示と 永続化に注意。
これも H2 ではOKでしたが、PostgreSQL ではテーブルが含まれているとスキーマが削除できません。
テーブルが含まれている場合は DROP SCHEMA IF EXISTS USER CASCADE;
とすることで PostgreSQL では削除できました。
しかしながら、このSQLは H2 ではエラーとなってしまうので、プロファイルで H2 の場合と PostgreSQL と分ける必要がありそうです。
https://github.com/system-sekkei/ddd-base/blob/master/database/src/main/resources/schema.sql#L1
入力、表示だけではなく計算項目のサンプルもあると良い
簡単なところでは生年月日から年齢など
なぜ重要か?
どう実装するか?
grid システムのサンプル?
シングルリポジトリ・マルチモジュールの構成
このリポジトリの内容を元にして、別のリポジトリを作る、簡単な方法は?
公開用サンプルとしてシンプルなものを。
実プロジェクト用は別途作成
利用者の新規登録画面で以下のエラーが発生したので、Validationパターンを追加する。
Failed to convert property value of type java.lang.String to required type java.time.LocalDate for property dateOfBirth.value; nested exception is
org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull
@org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value aaa; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [aaa]
テーマ:安全で使いやすいコレクションフレームワークを用意したい
概要:
ドメイン層でのコレクションの操作の記述が、ドメインの関心事の表現として煩雑。
もっと、ドメインの関心事/やりたいことを直接的に表現する手段を提供したい。
(コレクションの操作手順の詳細は隠蔽したい)
背景:
java.utilのコレクションは以下の点、使いにくい
・mutable ( addAllなど、閉じた操作になっていない)
・本来、クラスが持つ振る舞いが、Collectionsなどに分かれている
Java 8 からコレクションの操作として、 Stream APIが使えるようになった。
しかし、以下の点で、使いにくい
・Streamへの明示的な変換が必要(本来、コレクションの振る舞いとして持っているべきもの)
・集合演算など、基本的な操作が不足している
解決案:
安全で使いやすいコレクションフレームワークを開発する。
Groovy GDKの Set/List API が、イメージが近い。
GDK の Set/List API にジェネリクスと Predicate/Function を持ち込んだAPIが基本イメージ
効果/目標:
以下のコレクション操作を直観的、かつ、簡潔に記述できる。
・集合演算 union/intersect/minus
・フィルタリング filter(Predicate)、FindFirst(Predicate)
・変換 map( Function)
・失敗可能性 getOrElse( default)
代替案と評価:
Eclipse Collections
too much
pros:機能は豊富、不変な操作が可能
cons:ドメイン層の記述を直観的、簡潔にしたいという目標には適さない(APIが大きいため)
留意事項:
・できるだけ小さな基本APIに限定する(ドメイン層の良くある関心事に集中する)
・基本APIを組み合わせた振る舞いは、原則提供しない(使う側が組み合わせる)
(基本APIだけであれば、比較的安定した仕様にできそう)
・公開されたリポジトリからダウンロード可能にする (依存性解決の提供)
src/main/test -> src/test へ
testプロファイルで、指定しているschema.sqlの場所が違うのと、
テスト内で使っているSQLがUSERスキーマを指してしまっている
モデルのパッケージ名として改善の余地がありますね。
(技術視点のパッケージ名の臭いがする)
少し考えてみます。
まずは以下から
mail アドレスの変更に対応するため
mail アドレスの変更は、履歴+最新方式で実現
関連 issue #68
パッケージ図、説明文、コントローラ。
トップのユーザ一覧に新規登録ボタンを配置し、新規登録ボタンから
ユーザの新規登録ができるように。
オプショナルな情報の扱い方のサンプル
*基本アイデア
内部的には null で表現。
アプリケーションプログラマには、null で保持していることを見せない。
Spring MVC bind & validation
MyBatis SQL Mapper
の仕組みとコンフリクトしないこと。
数値
日付
文字列
期間で、開始日または終了日のみを持つパターンの扱い
( テーブル設計の Not Null 原則と可能な限り整合させること)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.