構文解析をするときに便利そう。構文木の書き換えも出来るみたい。
CIとかaptと組み合わせると面白い事ができるかもしれない。
例えばプロジェクト独自の静的解析を走行したい場合や独自フレームワークの作法を強制させたいときとか。
ただ実行速度がどのくらいのものか分からないので開発者のコンパイルというよりもCIで実行した方が良いとは思う(つまりaptとの組み合わせはしない方が良いと思う)。
私のBeanValidationの使い方(Java EE Advent Calendar 2013) — 裏紙
BeanValidationの相関バリデーションとそもそもの話 — 裏紙
http://fukuchiharuki.hatenablog.jp/entry/2015/01/10/231412
Bean ValidationのGroup sequenceは単項目チェック、相関チェックの順序指定で使うのは止めた方が良さそう
Spring Bootで入力値の検証(バリデーション)の順番を制御する - かずきのBlog@hatena
BeanValidationメモ_その1 - 怠惰系エンジニアのメモ帳
Bean Validationでクライアント側のロケールに合わせたメッセージを出力する - Java EE 事始め!
BeanValidationのmessage変数を更に翻訳したい - decadence
Hibernate ValidatorでValidationMessages.properties以外のファイルを使う
Hibernate Validator を使ったメソッド引数のチェック - AspectJ による組み込み - なんとなくな Developer のメモ
こんな感じのValidationどうかなぁ?「この方が好き」ってあったら知りたいです! - Mitsuyuki.Shiiba
てことでValidationの実装を書いてみた - Mitsuyuki.Shiiba
BeanValidationではメッセージ出力まで出来る仕組みまで含まれているけれど、その仕組みを使いこなすのはケースによって無理やり感がでてくるように思います。
とくにWebのエラーメッセージ表示と直結させるときに。
とはいってもBeanValidationを使う多くのケースはFormの検証で、その結果のメッセージをそのままクライアントに返却する、ということで そちらの発想に引っ張られているところが多いように思うのです。
BeanValidation自身は別にWebクライアントの表示のためだけにあるわけではありません。
ツールの用途・目的を考えると、私はValueObjectの型宣言のとして使用するのが良いのではないか?と考えています。
その上でBeanValidationの検証結果メッセージをキーワードとして、Presentation層の目的別にメッセージ変換器を別に設けるというのが「混在しない」というイメージです。
とりあえず、この考えに則って実装を検討してみて、ある程度、まとまったら更に追記をしていこうと思います。
[ 技術講座 ] Domain-Driven Designのエッセンス 第1回|オブジェクトの広場
[ 技術講座 ] Domain-Driven Designのエッセンス 第2回|オブジェクトの広場
[ 技術講座 ] Domain-Driven Designのエッセンス 第3回|オブジェクトの広場
IDDD本から理解するドメイン駆動設計連載一覧:CodeZine(コードジン)
DDD超入門(前編) - Domain-Driven Designの概要 - エンタープライズギークス (Enterprise Geeks)
DDD超入門(後編) - Domain-Driven Designの適用Step - エンタープライズギークス (Enterprise Geeks)
ドメイン駆動設計の定義についてEric Evansはなんと言っているのか[DDD] - little hands' lab
境界づけられたコンテキスト 実装編 - ドメイン駆動設計用語解説 [DDD] - little hands' lab
DDDに関する質問にバシバシお答えしました [ドメイン駆動設計] - little hands' lab
ドメイン駆動設計+クリーンアーキテクチャ解説【DDD編】 - Qiita
ドメイン駆動設計+クリーンアーキテクチャ解説【クリーンアーキテクチャ編】 - Qiita
https://www.slideshare.net/MasanobuNaruse/bottomup-ddd-1www.slideshare.net
https://www.slideshare.net/MasanobuNaruse/bottomup-ddd-2www.slideshare.net
www.slideshare.net
自分の頭の中はこうなった。 pic.twitter.com/yIUbzEWS5j
— かとじゅん (@j5ik2o) August 8, 2019
僕の認識と頂いた意見をマージしてみた
— 松岡@DDDブログ書いてます (@little_hand_s) October 25, 2018
ドメイン層:
業務上のルール、制約条件の実現
(判断、計算、加工など)
アプリケーション層:
ドメイン層で許可された操作を組み合わせることによるユースケースの実現(判断、計算、加工以外の処理の指示や進行管理 / モデルの生成と利用、永続化と再構築依頼)
DDDの集約とエンティティが理解できないという質問されたことある。リポジトリはエンティティと一対一につくるんですか?みたいな質問も。僕も最初混同してたのでわかる。リポジトリはエンティティではなく集約と一対一です。エンティティは、集約の中に一つ以上ある場合がありますから
— かとじゅん (@j5ik2o) November 1, 2018
DDDではアプリケーション層にUnit Of Workを定義して解決という話だったかな。個人的には集約がトランザクション境界と一致。複数の集約を跨ぐ場合でもトランザクション境界はまとめないことが多いです。 https://t.co/rd2H6leJMH
— かとじゅん (@j5ik2o) November 1, 2018
契約プログラミングを真面目に勉強すると、クライアントのコードが、サービスの実装ではなく、サービスが実装する契約に依存できるようになりますね。難しい表現だけど。こうすることで、お互いに契約を維持できれば、サービスの実装はいかようにも変更できます。
— かとじゅん (@j5ik2o) November 8, 2018
ドメインオブジェクトを中心としたClean Architecture のためのレイヤー構成 - Qiita
ユースケースをロバストネス分析してアクターとバウンダリとエンティティとコントロールに整理するのは確かにわかりやすいかもなー。
— がくぞ (@gakuzzzz) November 10, 2018
ただコントロールをエンティティの振る舞いとするよりアクターの振る舞いとしがちなのでアクターをドメインモデルにしないという縛りが重要なのかな? #scala_ks #s1
分析の過程で得られるのがドメインモデル(問題や課題を解決する考え方を表す何か)で、それを実装に反映したのがドメインオブジェクトだと解釈している。DDDは単一モデルではあるけど、実装の細部は表現が異なることもあるので、この言葉使いが役に立つこともある。
— かとじゅん (@j5ik2o) December 18, 2017
最近はこんな感じです
— 松岡@DDDブログ書いてます (@little_hand_s) April 18, 2019
1.企画、デザイナーが画面デザイン作る
2.エンジニアがモデリング(ユースケース図、ドメインモデル図書く)
3.ここで不明な点を企画と確認して固め、ドメインモデル図などに反映
4.実装開始。DB設計と実装は分担したり一人でやったり#ドメイン駆動設計 https://t.co/Wm9GPxPvAf
第3回 -ドメイン駆動設計のための オブジェクト指向プログラミング ハンズオン"に参加してきた! - desi-gneer(designer_engineer)
ドメインモデルには順序依存性がないように作る。順序依存性が必要なものはアプリケーション層(サービス)に書く
— 石◯王 もちだ (@mike_neck) March 28, 2017
昨日、共有カーネルにするか否かという議論をした。安直に選択すると利害関係者間で合意を取るコストが跳ね上がるって話した。あと、増田さんの記事
— かとじゅん (@j5ik2o) June 15, 2019
「Shared Kernel パターン は、たぶん アンチパターン」を読むと参考になるかもしれません。https://t.co/putgpy7FJh
純粋に計算する型は、IO型に依存してはいけない。
— 増田 亨. (@masuda220) December 3, 2018
IO型は計算用の型に依存してよい。
三層+ドメインモデルのアーキテクチャは、計算用の型のライブラリであるドメイン(の計算)モデルとIO型で組み立てる他の層を強い意志を持ってに分離するための枠組み。
結果整合性がどうしてもコストが大きくて、同一トランザクションでやりたい場合、という前提で考えてみました。
— 松岡@DDDブログ書いてます (@little_hand_s) December 2, 2018
5. パターン3の拡張で、ユーザー数の制約を管理する別の集約を作る
企業の中に他集約の数に応じたカウントを持つのはやはり違和感があるので、その部分だけ切り出してしまう。(続)
確かに、これは良いかも。
— Yamashita (@_vermeer_) 2021年2月4日
私見としてアプリケーション層はユースケース記述に近い表現にするとよいという整理をしていて、かつアプリ層は再利用が少ないので部品となる機会も少ない。
全角文字によるIDEの入力補完をする機会も少ない。
イメージはテストユニットに近い感じの扱い。 https://t.co/eTdO72Ma5N
ドメインモデルの根拠とドメインモデル貧血症の対策について - Chatwork Creator's Note
UMLを描こう – Vol.6 ロバストネス図からシーケンス図を描く | アシアルブログ
https://t.co/gtPAwTCNfw
— Yamashita (@_vermeer_) 2017年12月16日
質問者がアメリカの方であるとして、英語圏の人にとって日本人のいう「条件」と「状態」の違いは質問に値する違いってことと想定。
ユースケースを呼び出すユースケースって、ありなのかぁ。
— Yamashita (@_vermeer_) 2017年12月16日
ダメだと思い込んでた。
個人的には大きなショック。
ユースケース記述の実装をServiceとすれば設計と実装の乖離がなくなるのかなぁ。
でもそれはトランザクションスクリプト的な感じで悪手なのかなぁ。
www.slideshare.net
#jjug_ccc 僕がDDDを勉強したりDomain Event使ってみたいと思ったりKafkaでCQRSの素振りをしている背景と現状 - Mitsuyuki.Shiiba
www.slideshare.net
CQRSとイベントソーシングの使用法、または「CRUDに何か問題でも?」 | POSTD
本来一つの集約としてモデル化されるべき複数のエンティティが集約として勘違い実装。リポジトリも別々。でもアプリケーション層で同一トランザクション。これ一つの集約では?
— かとじゅん (@j5ik2o) November 15, 2018
オブジェクトをバラバラに砕くと有益な不変条件がなくなる→振る舞いもアプリケーション層に流失する
ドメインイベントを設計する - yoskhdia’s diary
主にメール送信とかで役に立ってるかな。疎結合だからテスト書きやすいし、spring-dataにはこの仕組みが用意されてるので導入しやすい https://t.co/PVFWwzLOU5
— Yuki YOSHIDA (@sis_yoshida) December 12, 2017
www.slideshare.net
持続可能な開発を目指す ~ ドメイン・ユースケース駆動(クリーンアーキテクチャ) + 単方向に制限した処理 + FRP - Qiita
いまさらきけない「ドメインモデル」と「トランザクションスクリプト」 - higayasuo’s blog
むむっ、私の思考はトランザクションスクリプトの可能性大かもしれない。
DDD の Java EE 実装サンプル - Cargo Tracker を読み解く - Qiita
ドメイン駆動設計: IDDDに登場するサンプルコードのModule構成をまとめてみた - Qiita
ドメインモデルをコードへ落とす 〜あなたのクラスは、どこから?〜 - Qiita
実装サンプルの中で個人的に一番しっくりくるのはTERASOLUNA
。
プロジェクト分割については好みの思考。
ValueObjectは、どの層からでも呼び出して良いフラットでパブリックなものだと思っていて、そのパッケージ構成って みんなどうしているのかな?と悩んで調べてみると、以前、DDDの勉強に参考にさせていただいた かとじゅん(@j5ik2o)さんのブログが参考になりそう。
Scalaコードでわかった気になるDDD | エンジニアブログ | GREE Engineering
net.gree.xxx.domain.hunter Hunter, HunterName, HunterRank net.gree.xxx.domain.monster Monster net.gree.xxx.domain.item Item, ItemService
実装サンプルのフォルダ構成よりも、こちらの方がしっくりする。Repository
やEntity
との兼ね合いに悩みが生まれそうだけど、それは今後、自分で実装する中で考え直そうということで保留。
インピーダンス・ミスマッチを解決する、O/Rマッピングの設計
逆に考えてたけど、確かに こちらの方が良いかも。
— Yamashita (@_vermeer_) 2020年4月13日
今度(いつ?)試してみよう https://t.co/hziCFJUBml
Railsアプリケーションでフォームをオブジェクトにして育てる - クックパッド開発者ブログ
decorator, presenter, exhibit という3つの実装パターンについて - pospomeのプログラミング日記
同じようなPOJOだけど色々分類がされていて、その違いを考えるのに参考になる。
【JavaBeans】BeanとDTOとEntityとVOとFormの違いって何? - プログラマのはしくれダイアリー
http://blog.amateur-factory.jp/?eid=1444289
www.slideshare.net
モデリング:9つの誤解 by S. Ambler
— 増田 亨. (@masuda220) 2018年3月22日
1. モデル=ドキュメント
2. 最初からすべてが見通せる
3. モデリングは重いプロセス
4. 要求は凍結できる
5. 設計は不変
6. モデリングとはツールを使うこと
7. モデリングは時間のムダ
8. データモデリングが開発の中心
9. モデリングスキルなしに開発できる
私なりに、読み替えてみました。
モデルはドキュメントではない
ドキュメントのためのドキュメントではなく実現する手段であるってこと、かな?
最初からすべては見通せない
徐々に組み立てていくもの
モデリングは軽快なプロセスであるべき
要求は変化する
要求には柔軟に対応する
設計も変化する
設計も柔軟に変化する
ツールを使うことがモデリングではない。
手段は目的ではない。
例えば、UMLで記述すればモデリングしたことになわけではない。
モデリングは重要不可欠
ドメインモデルを開発の中心に。
開発にはモデリングスキルが必要
www.slideshare.net
コンポーネント単位(呼出元となるxhtml
単位)。
またはユースケース単位(呼出元となるxhtml
が複数にまたがるケース)
少し調べて見ると「ManagedBean
は画面単位で作成します」という表現を見かけることがある。
多くの場合、画面におけるメインコンテンツが1つ(1面?)となる場合はコンポーネント=画面になるので画面単位という整理で基本的に問題ないとは思っているが、その整理だとテンプレートやコンポーネントを組み合わせて構築するJSF
のコンポーネント指向
という仕組みとピタッと一致した感じが無いように思う。
ユースケース単位というのは「一画面で実現出来うるオペレーションだけれども、ユーザビリティを考えると複数画面に分割した方が良いケース」を意図している。
ウィザード操作のように一連の操作が単純で会話型で進められるようなものは、xhtml
単位でManagedBean
を作成すると資産が増えすぎてしまう。増える事自体が悪いというつもりはないけれど操作の順序性など必要以上に発散させるのも良くないと考える。この場合は「一連の操作」の目的単位でManagedBean
を作成することで操作の見通しが良くなると考える。
@ConversationScoped
画面遷移時の情報共有というか受け渡しにはFlash
*1という仕組みもあるけれど、それは使わない。
同一フロー(もしくは会話)内の情報の生存期間を管理する仕組みを統一しておきたい。ちょっとした受け渡しだからFlash
で、といった場合の「ちょっとした」が、本当に「ちょっとした」で終わる保証がどこにも無いから。改修があった場合、多くのケースでは既存の仕組みを残して対応をしたくなる。例えば、始めは画面1から画面2への単純な遷移、かもしれないけれど、もし画面2から画面1に戻ったり(加えて画面2の状態を画面1に反映させたり)という要件が発生した場合、結構しんどくなることが想定される。いやいや、そんな、、と思うところはあるけれどSIerの現場だと聖域を犯すべからずという感じで起こりやすい。ちゃんと仕組みも含めて会話が出来ることを永劫に保証できるというのであれば問題ないと思う。
複数画面を跨る情報は会話スコープのBeanに格納して読み出すという整理であれば、上述のケースが発生しても問題なく対応できる。
なおFlash
はダメという話ではない。基底となるFWは極力「何でも出来る」が望ましいと思っている。その上で利用局面を考えて、それぞれの利用者として制約を設けて品質を担保するのが良いという話。
JSFにおけるPostback、そしてライフサイクル - 理系学生日記
*1: FacesContext.getCurrentInstance().getExternalContext().getFlash()
アイディアメモ(随時更新)
has
するためのクラス。型桁などの基本ドメイン情報はドメインクラスで実装する。input
要素は基本的に文字列(String
)。ドメインのプリミティブ型とは一致しないので、その仲介を行う。*1@Label
はメッセージ出力時の対象項目名として使用するResource
で管理するapt
でコンパイル時にResource
が存在しない場合は警告を標準出力する(エラーにはしない)Resource
が存在しない場合は表示ラベルとしては、フィールド名をそのまま出力するResource
を使用しないので警告出力はしない。JavaEE7をはじめよう(13) - インジェクション候補が複数ある場合の対処方法 - エンタープライズギークス (Enterprise Geeks)
CDI(Contexts and Dependency Injection)まとめ - A Memorandum
なるほど!ザ・Weld | Exploring CDI extensions
パーフェクトJavaEEのCDIパートの著者でもあります。実際に何度か勉強会で話は聞かせていただいたこともあります。とにかく分かりやすいし聞きやすいです。
www.slideshare.net
www.slideshare.net
Java EE環境におけるCDIのデフォルト化 - 見習いプログラミング日記
CDIとiBATIS2.3を組み合わせる - 見習いプログラミング日記
CDIでアプリケーション設定をインジェクション - 見習いプログラミング日記
DIコンテナのインジェクション方法の使い分けについて - 日々常々
パーフェクトJavaEE:P47
パーフェクトJavaEE:P49
依存の注入ポイントとなる型(Interface)を明言した方が良さそう。Interfaceと実装が1対1であれば必ず限定できるけど、それだと何のためにDI
使っているのか、という話になってしまう。また同じく複数の型(Interfaceや抽象クラス)から具象化されるクラスが意図せず1つという状態になるのも良くない。少なくともScope
を限定している具象クラスにおいては論理的に1対1しておいた方が良い。
なおテストを考えても@Typed
を使った方が良い。
Java EE 7 CDIを使う際の注意点──『Java EE 7徹底入門』番外編 第2回 - page2 - builder by ZDNet Japan
CDIビーンを動的に取得する - ksino's diary
CDIビーンを動的に取得するコードの単体テスト - ksino's diary
BeanManagerでCDIコンテナにアクセスする | なるほど!ザ・Weld
Java Examples for javax.enterprise.inject.spi.CDI
Java EEのCDIで定義しておくと便利なプロデューサーとインターセプタ - きしだのはてな
Java EEアプリケーションで起動時になにかしらの処理をする方法 — 裏紙
依存ライブラリが極力少ない方が良いと思うけど、CDI
は使った方が良いと思う。JavaEEだけじゃなくてJavaSEでも。
Java EE 8がそろそろ固まってきたのでJPA 2.2のJavaDocを日本語に翻訳し始めた(2/3完了) - 水まんじゅう2
JavaEE使い方メモ(JPA その1 - 基本) - Qiita
Red Hat JBoss Web Server 1.0 Hibernate Entity Manager リファレンスガイド - Red Hat Customer Portal *1
JavaEE Code探索 その3 〜 トランザクション属性 〜 - A Memorandum
JPA2.1でエンティティからインデックスを自動生成する - 水まんじゅう2
spring-data-jpa アンチパターン - Qiita
はじめてのJPAでちょっと怖い勘違い - ビールとプリンとプログラミング。
JavaEE7をはじめよう(9) - JPA TIPS - エンタープライズギークス (Enterprise Geeks)
JavaEE7をはじめよう(14) - Producerの効果的な利用方法 - エンタープライズギークス (Enterprise Geeks)
複数のEntityManagerを切り替える(on CDI) - edgegram
JAX-RS(Jersey)とJPAのサンプルにCDIを使ってTomcatで動かす - Qiita
JPAとJTAをJavaSE環境で使えるようにする: すふぃあの記憶
@RequestScoped
にする。
Jerseyでリソースメソッドをトランザクション境界にする — 裏紙
JPAで少しずつデータを処理する方法を考える - 見習いプログラミング日記
メモリを逼迫させずにJPAで大量データを取得する方法 - エンタープライズギークス (Enterprise Geeks)
JavaEE7をはじめよう(5) - JPAクエリ(その2) Native Query - エンタープライズギークス (Enterprise Geeks)
[Spring] 宣言的トランザクションがネストした時はどうする!? REQUIRES_NEWを使ってみた | DevelopersIO
null
(in()
にならないようにする)*2orm.xml
があるけど使わない(リンクはメモ)。