SlideShare a Scribd company logo
1 of 23
Download to read offline
業務の言葉で開発を駆動していく


有限会社 システム設計 増田 亨
ブログ: システム設計日記 (http://masuda220.jugem.jp/)
Twitter : http://twitter.com/masuda220
ドメイン駆動設計とは何か?
 「エリック・エヴァンスのドメイン駆動設計」
    Eric Evans “Domain-Driven Design” (DDD)
 できるソフトウェア開発者たちは、30年以上
も前から、問題領域の理解が、ソフトウェア
開発の「肝」 であることを知っていた。
 そのノウハウや考え方を集めて、「ドメイン駆
動設計(DDD)」という名前を付けてみた。
ドメイン駆動設計でない開発
 業務モデルとソフトウエアの実装が捻じれて
 歪んでいる
 ソフトウェアの実装が
   業務の知識を まちがって記述
   業務の関心事より、技術の関心事を記述
 その結果、業務の ごく自然な変更要求 が
   既存のコードへの 不自然・不合理・無理難題 になる
   変更すると、おもわぬところに副作用 が発生する
 そのソフトウェアは動いているが、正しくない。
捻じれて歪む構図
                  プレゼン資料
                  エクセル
                  画面イメージ


                                     動くソフトウェア



           ちんぷん
           かんぷん
                           わからないまま
         エクセル              なんかがんばる
参考システム   スクリーンショット            ソースコード
  仕様     DDL
         Java
         XML
         …
                  動いているが正しくないソフトウェアの完成
処方箋:ドメイン駆動設計
 業務の知識だけを記述したクラス群を、まず設計・実装する
 それをソフトウェアの基盤に配置する
  ドメインモデルパターン
    PoEAA : Pattern Of Enterprise Application Architecture

  業務の用語が、そのまま、クラス名とメソッド名になる
  業務の単位が、そのままパッケージ名になる
 業務モデリングとドメインモデルの設計を常に一致させる
   分析開始=ドメインモデル設計開始
   分析モデル=ドメインモデル (粒度、構造、命名)
 関係者は、業務の言葉でコミュニケーションする
   分析に開発者も最初から参加(ドメインモデルの設計開始)
   ドメインモデルのレビューに業務エキスパートが参加
   コミュニケーションの語彙は「業務の用語」
   記法は、UML(形式的かつ視覚的な言語)
ドメイン駆動設計の効果
 うまく設計したドメインモデルを中核にしたシステ
 ムは、ソフトウェアの変更を、劇的に、簡単に、安
 全にする
  業務の知識を正しく反映した記述、構造
  変更箇所の特定が楽で、副作用の心配が少ない
 変更(=ソフトウェアを育て続ける)が重要な関心事でないな
 ら...
  ドメイン駆動設計は、余計な時間と手間がかかるので、やめたほ
   うが良いかも。
  単発の受託開発プロジェクトには向かないかも。
  私たちは、ビジネスの発展とともに、継続的にソフトウェアを育て
   ていくことにこだわっている。(同じ顧客、同じ問題領域)
DDD を現場で実践するために
やってみせ、言って聞かせて、さ
せてみせ、ほめてやる
 業務のモデリングがそのままソフトウエアのコードになって
  いく過程をやってみせる
 技術的な味付けで「業務モデル」の大切さを説く
  Domain-Driven Design
    アメリカの著名な技術者たちが絶賛している

  Spring などメジャーなフレームワークが、DDD を指向して
  いるので、それらを積極導入
 エクセルやワードではなく、UML でドメイン層を設計させ
 てみる
  コード以外の論理表現の手段に目覚めてもらう
 コードのレビューで、業務の用語の理解度をチェック
ドメインモデル中心に作る
                   <<use>>
                                            web.jar
                                                                ビューと
                                                                コントロール

                                                    <<use>>

  業務の知識
  ソフトウエアの核心
                       <<use>>                                    業務機能
                                 application-service.jar          (ファサード)
domain-model.jar
                                                  <<use>>


                   <<use>>
                                 repository.jar             データベースアクセス




ソフトウェア全体が、業務のモデルを反映した構造になる。
イベント・ソーシング
 「記録」と「通知」が業務の二大関心事
    業務イベントが発生したら、データベースに記録
    業務イベントが発生したら、しかるべきところに通知
 技術方式も、これを反映する
    データベース
      業務イベントをデータベースに Insert オンリーで記録
      「状態」は、上記のイベント記録時に更新 (トリガー)
      「入庫・出庫」記録が「正」。「在庫数」は「派生データ」
   非同期メッセージング
     業務イベントが発生したら、非同期でメッセージ送信
       データベースのトリガー+ Mule ESB のデータベースポーリング
       RESTスタイル API
       バッチ処理の激減

 「予定/約束」と「リマインド/アラート」
    一定期日までに、起こすべき業務イベント(予定/約束)を記録
    直前にリマインドイベントを生成して、通知
    期限切れは、アラートイベントを生成して、通知
コードではなく、モデルで議論
 ドメインモデル設計の関心事(業務の言葉が登場する場所)
    パッケージ名
    パッケージ間の依存関係
    クラス名
    クラス間の関連
    メソッド名
    オブジェクトの特定方法 (業務での識別方法/体系)
 クラス図(パッケージ図)がわかりやすい
    コードはノイズが多い
    依存関係や関連は、コードから読めない
    コードでは全体を俯瞰できない
 ドメインモデルのクラス図とコードは、常に一致させる
    モデルを変更したらコードを変更する
    コードを変更したらモデルを変更する
ドメインモデル設計の情報源
 ドメインエキスパートとの対話
    とってもたいへん
    こっちがあまりにも、業務を知らなすぎる
    エキスパートの頭の中を見ることはできない
 基本用語は、仕込んでおく (ドメインクラス候補)
    企業のホームページ
    問題領域の解説本(初心者向け)
    問題領域の解説本(英語→命名の元ネタ)
    既存システムの画面、実データ
 問題領域の基本構造
    解説本の章立て   → パッケージ構造
  ドメインモデルの設計パターン    Google 検索
ドメインモデリング中心に進める
    要件分析・要件定義         RDRA(リレーションシップ駆動要件定義)
                                               ユースケースごとに開発
 システム価値                       システム境界        システム
              システム外部環境                                (ICONIX)
                            ユースケース 画面・帳表
                   業務フロー図                      ロバストネス図
コンテキスト図 要求図                                                  予備設計



                             イベント   プロトコル
                利用シーン記述



                                                                 詳細設計


                       ドメインモデル   属性追加        シーケンス図

                                                       基盤クラス追加

初期概念モデル                                                       Java
                                        操作追加
          概念モデルの洗練                                          ソースコー
パッケージ構造                                                        ド
中核クラス       関連クラス
            依存クラス       データモデル              DDL/SQL
                                            ソースコー
  クラスとテーブルの設計・実装                               ド
業務の知識をコードに反映する
「業務の関心事」の分離
 業務知識がUIのコードに埋       注文            注文
  もれている             入力画面
                    オブジェクト         顧客名
 画面定義(View)から業務の                  注文金額
  関心事を抽出する                         合計()
 コントローラから、業務ロジッ
 クをメソッドに抽出          submit() { }
                                   注文明細
                    金額計算()
 業務ロジックを、ドメインオブ                   商品
 ジェクトに移動                           数量
                                   単価
                                   金額
 業務の関心事だけ取り出して、別クラスにする             金額()
手続型の設計(手続+データ)を
ドメインモデルのオブジェクトへ
  Order                注文
              注文
Calculator
                      顧客名
             顧客名
                      注文金額
 合計()        注文金額
 税額算出()               合計()
                      税額()
             注文明細
             商品       注文明細
             数量
             単価       商品
             金額       数量
                      単価
                      金額
業務のロジックを、情報の近くに移動する
                      金額()
業務データと業務ルールをまとめておく    税額()
条件記述から業務ロジックを抽出
                                                            宿泊予約
     宿泊予約
                                                           料金()
     料金()                                                  is夏季()
                                                           夏料金()
                                                           冬料金()

If ( date.before( SUMMER_START )                  If ( isSummer( date ) )
      || date.after( SUMMER_END ) )               {
{                                                    charge = summerCharge() ;
   charge = quantity * winterRate + winterFee ;   }
}                                                 else
else                                              {
{                                                    charge = winterCharge()
   charge = quantity * summerRate ;               }
}
                                      クラス内に業務の知識の記述が増えた
コレクションのカプセル化
技術的な関心 → 業務の関心
       顧客                                   顧客

  List<注文>                            購買履歴

  setList()                           履歴に追加(注文)
  getList()                           最後の注文()
                                      平均購買額()

                                      List<Order> orderHistory =
List<Order> orderHistory ;              new ArrayList<Order>();

void setHistory( List<Order>)         void record( Order )
                                      Order getLastOrder()
List<Order> getHistory()              Amount totalPurchase()

                                業務でやりたいことがクラスに登場
単なる値を
ドメインのオブジェクトに置き換える
    注文                注文                       顧客

String 顧客                                氏名
                                         連絡先

                      class Order
 class Order          {
 {                       Customer customer ;
   String customer;   }
 }
                      class Customer
                      {
                         String name ;
                      }
       業務の重要な関心事(顧客)を記述する入れ物ができた
業務モデルの粒度・構造と、クラスの設計を一致させる
ゴールド会員の登録
 一般会員が一定の条件をクリア
   購買実績
   支払事故なし
 承認手続きが必要
<<façade>>
                                   ゴールド会員登録サービス
ゴールド会員登録 Service
                       <<entity>>      購入履歴
すべて情報                     会員
                                                   会員リポジトリ
                      会員番号
 すべての操作               氏名               支払記録


http 依存の
                                              関心事の分離
                        <<service>>
view定義と    購買額が多く    ゴールド会員認定ポリシー          変更が簡単で安全になる
control    支払事故がない                         ソフトウェアを育てやすい
を抽出                                   <<value>>
                      <<entity>>
                                      与信限度額         ゴールド会員
                     ゴールド会員
  DB                                                 ファクトリ
  アクセス               会員番号             <<value>>
  を抽出                氏名               有効期限

             承認が必要       <<service>>
ドメイン層の                ゴールド会員認定手続き
 いろんな トランザクション                                    <<transfer>>
 ロジック                                              承認依頼
       スクリプト?           ゴールド会員リポジトリ
実装は必要。重要なのは、設計。
ドメイン層以外も必要。重要なのは、ドメイン層。

More Related Content

What's hot

世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計増田 亨
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと増田 亨
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計Tadayoshi Sato
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門増田 亨
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門増田 亨
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する増田 亨
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方増田 亨
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころJunya Hayashi
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかKoichiro Matsuoka
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意Yoshitaka Kawashima
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)A AOKI
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)Mikiya Okuno
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
ドメイン駆動設計 実践ガイド
ドメイン駆動設計 実践ガイドドメイン駆動設計 実践ガイド
ドメイン駆動設計 実践ガイド増田 亨
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門Takuya Kitamura
 

What's hot (20)

世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
ドメイン駆動設計 実践ガイド
ドメイン駆動設計 実践ガイドドメイン駆動設計 実践ガイド
ドメイン駆動設計 実践ガイド
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
 

Similar to ドメイン駆動設計 の 実践 Part3 DDD

ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀増田 亨
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November増田 亨
 
Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用stomita
 
クラウド・アプリケーション・モデリングへのアプローチ
クラウド・アプリケーション・モデリングへのアプローチクラウド・アプリケーション・モデリングへのアプローチ
クラウド・アプリケーション・モデリングへのアプローチTomoharu ASAMI
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し増田 亨
 
DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発Tomoharu ASAMI
 
サービス開発における フロントエンド・ドメイン駆動設計の実践
サービス開発における フロントエンド・ドメイン駆動設計の実践サービス開発における フロントエンド・ドメイン駆動設計の実践
サービス開発における フロントエンド・ドメイン駆動設計の実践TakefumiYoshii
 
HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)
HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)
HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)Hadoop / Spark Conference Japan
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Tomoharu ASAMI
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる増田 亨
 
[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake
[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake
[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lakede:code 2017
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門Yohei Sasaki
 
VSUG Day 2010 Summer - Using ADO.NET Entity Framework
VSUG Day 2010 Summer - Using ADO.NET Entity FrameworkVSUG Day 2010 Summer - Using ADO.NET Entity Framework
VSUG Day 2010 Summer - Using ADO.NET Entity FrameworkAtsushi Fukui
 
ビジネスモデリングによる問題解決型アプローチ
ビジネスモデリングによる問題解決型アプローチ ビジネスモデリングによる問題解決型アプローチ
ビジネスモデリングによる問題解決型アプローチ Kent Ishizawa
 
Windows ストア アプリの上手な作り方
Windows ストア アプリの上手な作り方Windows ストア アプリの上手な作り方
Windows ストア アプリの上手な作り方一希 大田
 
[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~
[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~
[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~Naoki (Neo) SATO
 
Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編Microsoft Azure Japan
 
20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architectureIssei Hiraoka
 

Similar to ドメイン駆動設計 の 実践 Part3 DDD (20)

ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
 
Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用
 
BPStudy20121221
BPStudy20121221BPStudy20121221
BPStudy20121221
 
クラウド・アプリケーション・モデリングへのアプローチ
クラウド・アプリケーション・モデリングへのアプローチクラウド・アプリケーション・モデリングへのアプローチ
クラウド・アプリケーション・モデリングへのアプローチ
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発
 
サービス開発における フロントエンド・ドメイン駆動設計の実践
サービス開発における フロントエンド・ドメイン駆動設計の実践サービス開発における フロントエンド・ドメイン駆動設計の実践
サービス開発における フロントエンド・ドメイン駆動設計の実践
 
HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)
HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)
HadoopとRDBMSをシームレスに連携させるSmart SQL Processing (Hadoop Conference Japan 2014)
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
 
[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake
[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake
[DI07] あらゆるデータに価値がある! アンチ断捨離ストのための Azure Data Lake
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 
VSUG Day 2010 Summer - Using ADO.NET Entity Framework
VSUG Day 2010 Summer - Using ADO.NET Entity FrameworkVSUG Day 2010 Summer - Using ADO.NET Entity Framework
VSUG Day 2010 Summer - Using ADO.NET Entity Framework
 
ビジネスモデリングによる問題解決型アプローチ
ビジネスモデリングによる問題解決型アプローチ ビジネスモデリングによる問題解決型アプローチ
ビジネスモデリングによる問題解決型アプローチ
 
Windows ストア アプリの上手な作り方
Windows ストア アプリの上手な作り方Windows ストア アプリの上手な作り方
Windows ストア アプリの上手な作り方
 
[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~
[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~
[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~
 
Ajn24
Ajn24Ajn24
Ajn24
 
Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編
 
20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture
 

More from 増田 亨

正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース増田 亨
 
ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善増田 亨
 
事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述増田 亨
 
ドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドラインドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドライン増田 亨
 
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来増田 亨
 
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみようドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう増田 亨
 
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primerオブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer増田 亨
 
ドメイン駆動設計という設計スタイル
ドメイン駆動設計という設計スタイルドメイン駆動設計という設計スタイル
ドメイン駆動設計という設計スタイル増田 亨
 
プロダクトづくりのためのソフトウェア設計スタイル
プロダクトづくりのためのソフトウェア設計スタイルプロダクトづくりのためのソフトウェア設計スタイル
プロダクトづくりのためのソフトウェア設計スタイル増田 亨
 
ソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考えるソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考える増田 亨
 
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチレガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ増田 亨
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
 
ビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かうビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう増田 亨
 
ソフトウェアの核心にある複雑さに立ち向かう
ソフトウェアの核心にある複雑さに立ち向かうソフトウェアの核心にある複雑さに立ち向かう
ソフトウェアの核心にある複雑さに立ち向かう増田 亨
 
DDD sample code explained in Java
DDD sample code explained in JavaDDD sample code explained in Java
DDD sample code explained in Java増田 亨
 
アジャイルなソフトウェア設計を目指して
アジャイルなソフトウェア設計を目指してアジャイルなソフトウェア設計を目指して
アジャイルなソフトウェア設計を目指して増田 亨
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす増田 亨
 
SoR 2.0 summary
SoR 2.0 summarySoR 2.0 summary
SoR 2.0 summary増田 亨
 
毎日が越境だ!
毎日が越境だ!毎日が越境だ!
毎日が越境だ!増田 亨
 
SoR 2.0 基幹システムの再定義と再構築
SoR 2.0 基幹システムの再定義と再構築SoR 2.0 基幹システムの再定義と再構築
SoR 2.0 基幹システムの再定義と再構築増田 亨
 

More from 増田 亨 (20)

正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース
 
ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善
 
事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述
 
ドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドラインドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドライン
 
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
 
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみようドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう
 
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primerオブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
 
ドメイン駆動設計という設計スタイル
ドメイン駆動設計という設計スタイルドメイン駆動設計という設計スタイル
ドメイン駆動設計という設計スタイル
 
プロダクトづくりのためのソフトウェア設計スタイル
プロダクトづくりのためのソフトウェア設計スタイルプロダクトづくりのためのソフトウェア設計スタイル
プロダクトづくりのためのソフトウェア設計スタイル
 
ソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考えるソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考える
 
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチレガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
ビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かうビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう
 
ソフトウェアの核心にある複雑さに立ち向かう
ソフトウェアの核心にある複雑さに立ち向かうソフトウェアの核心にある複雑さに立ち向かう
ソフトウェアの核心にある複雑さに立ち向かう
 
DDD sample code explained in Java
DDD sample code explained in JavaDDD sample code explained in Java
DDD sample code explained in Java
 
アジャイルなソフトウェア設計を目指して
アジャイルなソフトウェア設計を目指してアジャイルなソフトウェア設計を目指して
アジャイルなソフトウェア設計を目指して
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
 
SoR 2.0 summary
SoR 2.0 summarySoR 2.0 summary
SoR 2.0 summary
 
毎日が越境だ!
毎日が越境だ!毎日が越境だ!
毎日が越境だ!
 
SoR 2.0 基幹システムの再定義と再構築
SoR 2.0 基幹システムの再定義と再構築SoR 2.0 基幹システムの再定義と再構築
SoR 2.0 基幹システムの再定義と再構築
 

Recently uploaded

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Recently uploaded (12)

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

ドメイン駆動設計 の 実践 Part3 DDD

  • 1. 業務の言葉で開発を駆動していく 有限会社 システム設計 増田 亨 ブログ: システム設計日記 (http://masuda220.jugem.jp/) Twitter : http://twitter.com/masuda220
  • 2. ドメイン駆動設計とは何か?  「エリック・エヴァンスのドメイン駆動設計」  Eric Evans “Domain-Driven Design” (DDD)  できるソフトウェア開発者たちは、30年以上 も前から、問題領域の理解が、ソフトウェア 開発の「肝」 であることを知っていた。  そのノウハウや考え方を集めて、「ドメイン駆 動設計(DDD)」という名前を付けてみた。
  • 3. ドメイン駆動設計でない開発  業務モデルとソフトウエアの実装が捻じれて 歪んでいる  ソフトウェアの実装が  業務の知識を まちがって記述  業務の関心事より、技術の関心事を記述  その結果、業務の ごく自然な変更要求 が  既存のコードへの 不自然・不合理・無理難題 になる  変更すると、おもわぬところに副作用 が発生する  そのソフトウェアは動いているが、正しくない。
  • 4. 捻じれて歪む構図 プレゼン資料 エクセル 画面イメージ 動くソフトウェア ちんぷん かんぷん わからないまま エクセル なんかがんばる 参考システム スクリーンショット ソースコード 仕様 DDL Java XML … 動いているが正しくないソフトウェアの完成
  • 5. 処方箋:ドメイン駆動設計  業務の知識だけを記述したクラス群を、まず設計・実装する それをソフトウェアの基盤に配置する  ドメインモデルパターン  PoEAA : Pattern Of Enterprise Application Architecture  業務の用語が、そのまま、クラス名とメソッド名になる  業務の単位が、そのままパッケージ名になる  業務モデリングとドメインモデルの設計を常に一致させる  分析開始=ドメインモデル設計開始  分析モデル=ドメインモデル (粒度、構造、命名)  関係者は、業務の言葉でコミュニケーションする  分析に開発者も最初から参加(ドメインモデルの設計開始)  ドメインモデルのレビューに業務エキスパートが参加  コミュニケーションの語彙は「業務の用語」  記法は、UML(形式的かつ視覚的な言語)
  • 6. ドメイン駆動設計の効果  うまく設計したドメインモデルを中核にしたシステ ムは、ソフトウェアの変更を、劇的に、簡単に、安 全にする  業務の知識を正しく反映した記述、構造  変更箇所の特定が楽で、副作用の心配が少ない  変更(=ソフトウェアを育て続ける)が重要な関心事でないな ら...  ドメイン駆動設計は、余計な時間と手間がかかるので、やめたほ うが良いかも。  単発の受託開発プロジェクトには向かないかも。  私たちは、ビジネスの発展とともに、継続的にソフトウェアを育て ていくことにこだわっている。(同じ顧客、同じ問題領域)
  • 8. やってみせ、言って聞かせて、さ せてみせ、ほめてやる  業務のモデリングがそのままソフトウエアのコードになって いく過程をやってみせる  技術的な味付けで「業務モデル」の大切さを説く  Domain-Driven Design  アメリカの著名な技術者たちが絶賛している  Spring などメジャーなフレームワークが、DDD を指向して いるので、それらを積極導入  エクセルやワードではなく、UML でドメイン層を設計させ てみる  コード以外の論理表現の手段に目覚めてもらう  コードのレビューで、業務の用語の理解度をチェック
  • 9. ドメインモデル中心に作る <<use>> web.jar ビューと コントロール <<use>> 業務の知識 ソフトウエアの核心 <<use>> 業務機能 application-service.jar (ファサード) domain-model.jar <<use>> <<use>> repository.jar データベースアクセス ソフトウェア全体が、業務のモデルを反映した構造になる。
  • 10. イベント・ソーシング  「記録」と「通知」が業務の二大関心事  業務イベントが発生したら、データベースに記録  業務イベントが発生したら、しかるべきところに通知  技術方式も、これを反映する  データベース  業務イベントをデータベースに Insert オンリーで記録  「状態」は、上記のイベント記録時に更新 (トリガー)  「入庫・出庫」記録が「正」。「在庫数」は「派生データ」  非同期メッセージング  業務イベントが発生したら、非同期でメッセージ送信  データベースのトリガー+ Mule ESB のデータベースポーリング  RESTスタイル API  バッチ処理の激減  「予定/約束」と「リマインド/アラート」  一定期日までに、起こすべき業務イベント(予定/約束)を記録  直前にリマインドイベントを生成して、通知  期限切れは、アラートイベントを生成して、通知
  • 11. コードではなく、モデルで議論  ドメインモデル設計の関心事(業務の言葉が登場する場所)  パッケージ名  パッケージ間の依存関係  クラス名  クラス間の関連  メソッド名  オブジェクトの特定方法 (業務での識別方法/体系)  クラス図(パッケージ図)がわかりやすい  コードはノイズが多い  依存関係や関連は、コードから読めない  コードでは全体を俯瞰できない  ドメインモデルのクラス図とコードは、常に一致させる  モデルを変更したらコードを変更する  コードを変更したらモデルを変更する
  • 12. ドメインモデル設計の情報源  ドメインエキスパートとの対話  とってもたいへん  こっちがあまりにも、業務を知らなすぎる  エキスパートの頭の中を見ることはできない  基本用語は、仕込んでおく (ドメインクラス候補)  企業のホームページ  問題領域の解説本(初心者向け)  問題領域の解説本(英語→命名の元ネタ)  既存システムの画面、実データ  問題領域の基本構造  解説本の章立て → パッケージ構造 ドメインモデルの設計パターン Google 検索
  • 13. ドメインモデリング中心に進める 要件分析・要件定義 RDRA(リレーションシップ駆動要件定義) ユースケースごとに開発 システム価値 システム境界 システム システム外部環境 (ICONIX) ユースケース 画面・帳表 業務フロー図 ロバストネス図 コンテキスト図 要求図 予備設計 イベント プロトコル 利用シーン記述 詳細設計 ドメインモデル 属性追加 シーケンス図 基盤クラス追加 初期概念モデル Java 操作追加 概念モデルの洗練 ソースコー パッケージ構造 ド 中核クラス 関連クラス 依存クラス データモデル DDL/SQL ソースコー クラスとテーブルの設計・実装 ド
  • 15. 「業務の関心事」の分離  業務知識がUIのコードに埋 注文 注文 もれている 入力画面 オブジェクト 顧客名  画面定義(View)から業務の 注文金額 関心事を抽出する 合計()  コントローラから、業務ロジッ クをメソッドに抽出 submit() { } 注文明細 金額計算()  業務ロジックを、ドメインオブ 商品 ジェクトに移動 数量 単価 金額 業務の関心事だけ取り出して、別クラスにする 金額()
  • 16. 手続型の設計(手続+データ)を ドメインモデルのオブジェクトへ Order 注文 注文 Calculator 顧客名 顧客名 注文金額 合計() 注文金額 税額算出() 合計() 税額() 注文明細 商品 注文明細 数量 単価 商品 金額 数量 単価 金額 業務のロジックを、情報の近くに移動する 金額() 業務データと業務ルールをまとめておく 税額()
  • 17. 条件記述から業務ロジックを抽出 宿泊予約 宿泊予約 料金() 料金() is夏季() 夏料金() 冬料金() If ( date.before( SUMMER_START ) If ( isSummer( date ) ) || date.after( SUMMER_END ) ) { { charge = summerCharge() ; charge = quantity * winterRate + winterFee ; } } else else { { charge = winterCharge() charge = quantity * summerRate ; } } クラス内に業務の知識の記述が増えた
  • 18. コレクションのカプセル化 技術的な関心 → 業務の関心 顧客 顧客 List<注文> 購買履歴 setList() 履歴に追加(注文) getList() 最後の注文() 平均購買額() List<Order> orderHistory = List<Order> orderHistory ; new ArrayList<Order>(); void setHistory( List<Order>) void record( Order ) Order getLastOrder() List<Order> getHistory() Amount totalPurchase() 業務でやりたいことがクラスに登場
  • 19. 単なる値を ドメインのオブジェクトに置き換える 注文 注文 顧客 String 顧客 氏名 連絡先 class Order class Order { { Customer customer ; String customer; } } class Customer { String name ; } 業務の重要な関心事(顧客)を記述する入れ物ができた
  • 21. ゴールド会員の登録  一般会員が一定の条件をクリア  購買実績  支払事故なし  承認手続きが必要
  • 22. <<façade>> ゴールド会員登録サービス ゴールド会員登録 Service <<entity>> 購入履歴 すべて情報 会員 会員リポジトリ 会員番号 すべての操作 氏名 支払記録 http 依存の 関心事の分離 <<service>> view定義と 購買額が多く ゴールド会員認定ポリシー 変更が簡単で安全になる control 支払事故がない ソフトウェアを育てやすい を抽出 <<value>> <<entity>> 与信限度額 ゴールド会員 ゴールド会員 DB ファクトリ アクセス 会員番号 <<value>> を抽出 氏名 有効期限 承認が必要 <<service>> ドメイン層の ゴールド会員認定手続き いろんな トランザクション <<transfer>> ロジック 承認依頼 スクリプト? ゴールド会員リポジトリ