Giter Club home page Giter Club logo

isolating-the-domain's Introduction

本リポジトリは2020年時点から更新されていません。近々アップデートを予定していますが、それまでは以下から差分を抽出してください。

また、技術要素としてはJava11&SpringBoot2.xとなっています。SpringBoot3.x対応の例は system-sekkei/library を参照してください。 libraryはCCSR(isolating-the-domainにRDRA)のサンプルとなっています。

ドメインを独立させる Isolating the Domain

  • Spring Boot
  • Spring MVC (direct field access)
  • Thymeleaf
  • MyBatis SQL Mapper

起動方法

./gradlew bootRun

http://localhost:8080 でダッシュボード画面を表示

実行可能Jarのビルドと実行

./gradlew clean build
java -jar webapp/build/libs/webapp.jar

JIG 設計ドキュメントの自動生成

./gradlew jig

webapp/build/jig 以下にソースコードから自動生成したクラス一覧やクラスの関連図を出力

JIG 設計ドキュメント

設計ガイド

ドメインを独立させる

ドメイン駆動設計本格入門

型指向のプログラミング:設計ガイドライン

書籍:現場で役立つシステム設計の原則

アーキテクチャ

アーキテクチャ

参考資料

isolating-the-domain's People

Contributors

6u6ka avatar e-yamane avatar ecormaksin avatar haljik avatar i-takehiro avatar irof avatar kazuhito-m avatar kbtaniguchi avatar masuda220 avatar numamino avatar sammy7th avatar stgctkm avatar yamakii avatar yukieen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

isolating-the-domain's Issues

デザインのガイドラインページ作成

なぜ重要か?

人間の関心事の表現方法のひとつ(ドメインモデリングと一体)

どう実装するか?

整列
対比
隣接
反復

表現手段

位置、フォント、色、...

実装技術

Bootstrap

build.gradleの整理

  • spring boot version
  • repositoriesの確認
  • sourceSetsの追加
  • 各dependencyの整理とコメントの追加

PostgreSQL でスキーマが削除できない

これも 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

計算項目のサンプル追加

入力、表示だけではなく計算項目のサンプルもあると良い

簡単なところでは生年月日から年齢など

修正時のサンプル

起こった事実を insert オンリーで追加し、
最新の事実を、状態テーブルに導出して管理する仕組みのサンプルを追加

リポジトリ名

DDD-base というのは、モデルの内容からすると、ちょっと言いすぎかなあ。
このモデル自体は、ドメイン駆動設計の文脈だと "Isolating the Domain" (第4章のタイトル)の参考実装かと思います。

というわけで、 リポジトリ名を ddd-base から isolating-the-domain に変えようと思うですが、どうでしょうか?

PhoneNumberのValidation追加

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;
    }
}

生年月日のValidationを追加

利用者の新規登録画面で以下のエラーが発生したので、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]

オプショナルな項目の追加

オプショナルな情報の扱い方のサンプル

*基本アイデア
内部的には null で表現。 
アプリケーションプログラマには、null で保持していることを見せない。

Spring MVC bind & validation
MyBatis SQL Mapper

の仕組みとコンフリクトしないこと。

数値
日付
文字列

期間で、開始日または終了日のみを持つパターンの扱い
( テーブル設計の Not Null 原則と可能な限り整合させること)

UserServiceSpecテストが失敗する

testプロファイルで、指定しているschema.sqlの場所が違うのと、
テスト内で使っているSQLがUSERスキーマを指してしまっている

メールアドレスのドメインオブジェクト化

メールアドレスは変更される可能性が高いので、サーバーで発行するGUIDとかに変更したい。
(認証とか辛いので、今回はメールアドレスをドメインオブジェクト化する方向にで。)

BirthDate クラスで、LocalDate を使う

LocalDate を使うように変更しましょう。
日付の扱い方のサンプルとして、そのほうが有用でしょう。

myBatis のタイプハンドラーも追加しておく

Rejected Valueの表示メカニズムの提供

バリデーションの失敗時に、拒否された入力値をフォームに表示する仕組みを、ドメイン層のクラスから取り除きたい

概要:

ドメインオブジェクトに、不正な入力値を保持したくない
(ドメインオブジェクトにバリデーション時の不正値を扱うコードを書きたくない)

背景:

th:field でバインディングした場合、不正値を再表示するためには、ドメインオブジェクトが入力された文字列を持ち、バリデーション結果を持ち、toString()で、表示内容を変える仕組みを記述している。

このためのコードは、本来、ビューで解決すべき内容であり、ドメインオブジェクトを不適切に汚染している。

解決案:

th:field ではなく、

th:id, th:name, th:value を明示的に使う
th:value で FieldError#getRejectedValue()を表示する

効果/目標:

ドメインオブジェクトからバリデーションの不正入力値を扱うコードを取り除く
Thymeleafのテンプレートの記述を「できるだけ」簡潔にする

  • th:field方式に比べ、id,name,value の記述の煩雑さを緩和する工夫
  • FieldError#getRejectedValue() を参照する記述の簡略化の工夫

代替案1:

Thymeleafではなく、JavaScriptで実現する

仕組みが複雑になり、可読性、保守性に問題が多い

留意事項

・Thymeleaf の用意している拡張の仕組みの利用を検討
http://www.thymeleaf.org/doc/tutorials/2.1/extendingthymeleaf.html

・BindingResultから、FieldErrorsあるいは、RejectedValuesを、テンプレートに渡す方法

・公開されたレポジトリでの提供(依存性解決)

マルチモジュール化?

シングルリポジトリ・マルチモジュールの構成

  • ddd-base
    • ui コントローラやテンプレート
    • core モデル/サービス/データソース
    • database DDLなど

TODO(あとで分解する)

H2データベースとデータのセットアップスクリプト、 利用者テーブル、トップに利用者一覧を表示するための、model/service/datasource もお願いします。 あと、サービスクラスのテスト((顧客一覧)の取得メソッド)

依存性解決手段の提供

・安全で簡潔なコレクションフレームワーク
・Rejectedバリューの表示の仕組み

これらを、パッケージとして作成し、gradleで依存性解決をしたい

公開Repositoryへの登録をしたいが、どうすれば良い?

validation パッケージ

モデルのパッケージ名として改善の余地がありますね。
(技術視点のパッケージ名の臭いがする)

少し考えてみます。

安全で使いやすいコレクションフレームワークの開発

テーマ:安全で使いやすいコレクションフレームワークを用意したい

概要:

ドメイン層でのコレクションの操作の記述が、ドメインの関心事の表現として煩雑。
もっと、ドメインの関心事/やりたいことを直接的に表現する手段を提供したい。

(コレクションの操作手順の詳細は隠蔽したい)

背景:

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だけであれば、比較的安定した仕様にできそう)
・公開されたリポジトリからダウンロード可能にする (依存性解決の提供)

性別の追加

enum で性別を追加しましょう。
モデルの要素のサンプルとして。

男性
女性
不明

の三つ。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.