SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
こんな考え方で、
                 こんなやり方で、
                 取り組んでいます


有限会社 システム設計 増田 亨
ブログ: システム設計日記 (http://masuda220.jugem.jp/)
Twitter : http://twitter.com/masuda220
ドメイン駆動設計とは何か?
 ソフトウェア開発のもっとも重要な仕事は、
 ドメインモデルの設計である。
 ドメイン層以外も必要。
    Web 層( ビューとコントロール)
    データアクセス層
    ...
 重要なのは、ドメイン層
 「実装」は必要。
 重要なのは設計
なぜ、ドメイン駆動設計か?
 うまく設計したドメインモデルを中核にしたシス
テムは、ソフトウェアの変更を、劇的に、簡単
に、安全にするから
 変更(=ソフトウェアを育て続ける)が重要な関心事でな
いなら...
  ドメイン駆動設計は、余計な時間と手間がかかるので、や
   めたほうが良いかも。
  単発の受託開発プロジェクトには向かないかも。
  私たちは、継続的にソフトウェアを育てていくことにこだわっ
  ている。(同じ顧客、同じ問題領域)
ドメイン駆動設計でない開発
 業務とソフトウエアの関係が捻じれ、歪む
 そのソフトウェアは
   業務の知識を、まちがって記述
   業務の関心事と技術の関心事が、分離できていない
 業務(問題領域)の、ごく自然な変更要求
   既存のコードへの不自然・不合理・無理難題になる
   変更すると、おもわぬところに副作用が発生する
 結論
   そのソフトウェアは動いているが、正しくない。
捻じれて歪む構図
                  プレゼン資料
                  エクセル
                  画面イメージ


                                     動くソフトウェア



           ちんぷん
           かんぷん
                           わからないまま
         エクセル              なんかがんばる
参考システム   スクリーンショット            ソースコード
  仕様     DDL
         Java
         XML
         …
                  動いているが正しくないソフトウェアの完成
ねじれの原因
 業務の関心事に、開発者が関心が無いから
 開発チームのメンバーは、依頼元の会社の事業について、興
 味を持っていますか?
  この会社は、どんな顧客に、どんな価値を提供する?
  ライバル企業はどこ?
  競争相手との差別化ポイントは?
  開発中のソフトウェアは、その差別化ポイントを、どう強化する?
 業務の用語を、そのまま、クラス名やメソッド名にするのが良い
 設計だと思っていますか?
 開発者同士で、話す時に、業務の言葉で、議論しています
 か?
DDD を実際にやる
自分たちのやり方
ドメインモデル中心に作る
                    <<use>>
                                             web.jar
                                                               ビューと
                                                               コントロール

                                                    <<use>>



                        <<use>>                                  業務機能
                                                                 (ファサード)
 domain-model.jar                 application-service.jar

   ソフトウエアの核心
                                               <<use>>



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

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



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



                                                                 詳細設計


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

                                                       基盤クラス追加

初期概念モデル                                                       Java
                                        操作追加
          概念モデルの洗練                                          ソースコー
パッケージ構造                                                        ド
中核クラス       関連クラス
            依存クラス       データモデル              DDL/SQL
                                            ソースコー
  クラスとテーブルの設計・実装                               ド
いえいえ、
やる気があれば、
ドメイン駆動設計のネタはいっぱいあります
プレゼンテーションとドメインの分離
 画面(View)からドメインオブ     注文            注文
 ジェクト(Model)を抽出する    入力画面
                     オブジェクト         顧客名
 コントローラから、ドメインロ                    注文金額
 ジックをメソッドに抽出                        合計()
 コントローラからドメインロジッ
 クのメソッドを、ドメインオブ      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 ;               }
}
                                      ドメインリッチなクラスに成長
コレクションのカプセル化
       顧客                                顧客

  購買履歴                              購買履歴

  set購買履歴()                         記録(注文)
  get購買履歴()                         最後の注文()
                                    総購買額()

                                   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>>
ドメイン層の                ゴールド会員認定手続き
 いろんな トランザクション                                    <<transport>>
 ロジック                                               承認依頼
       スクリプト?           ゴールド会員リポジトリ
ドメイン駆動設計(DDD)の実践Part2

Mais conteúdo relacionado

Mais procurados

ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 

Mais procurados (20)

DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くかDDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
 
ドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイントドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイント
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
 
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
 
実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
ドメイン駆動設計 複雑さに立ち向かう
ドメイン駆動設計 複雑さに立ち向かうドメイン駆動設計 複雑さに立ち向かう
ドメイン駆動設計 複雑さに立ち向かう
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
3週連続DDDその3 ドメイン駆動設計 戦略的設計
3週連続DDDその3  ドメイン駆動設計 戦略的設計3週連続DDDその3  ドメイン駆動設計 戦略的設計
3週連続DDDその3 ドメイン駆動設計 戦略的設計
 
私がドメイン駆動設計をやる理由
私がドメイン駆動設計をやる理由私がドメイン駆動設計をやる理由
私がドメイン駆動設計をやる理由
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
 

Destaque

Destaque (7)

ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
 
「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう
 
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)
 
越境する情シス:進化可能なアーキテクチャを手に入れる
越境する情シス:進化可能なアーキテクチャを手に入れる越境する情シス:進化可能なアーキテクチャを手に入れる
越境する情シス:進化可能なアーキテクチャを手に入れる
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
 

Semelhante a ドメイン駆動設計(DDD)の実践Part2

クラウド・アプリケーション・モデリングへのアプローチ
クラウド・アプリケーション・モデリングへのアプローチクラウド・アプリケーション・モデリングへのアプローチ
クラウド・アプリケーション・モデリングへのアプローチ
Tomoharu ASAMI
 
Software Development with Symfony
Software Development with SymfonySoftware Development with Symfony
Software Development with Symfony
Atsuhiro Kubo
 
サービス開発における フロントエンド・ドメイン駆動設計の実践
サービス開発における フロントエンド・ドメイン駆動設計の実践サービス開発における フロントエンド・ドメイン駆動設計の実践
サービス開発における フロントエンド・ドメイン駆動設計の実践
TakefumiYoshii
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
Sho A
 
DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発
Tomoharu ASAMI
 
Symfony2でより良いソフトウェアを作るために
Symfony2でより良いソフトウェアを作るためにSymfony2でより良いソフトウェアを作るために
Symfony2でより良いソフトウェアを作るために
Atsuhiro Kubo
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
Naoyuki Yamada
 

Semelhante a ドメイン駆動設計(DDD)の実践Part2 (20)

DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
 
クラウド・アプリケーション・モデリングへのアプローチ
クラウド・アプリケーション・モデリングへのアプローチクラウド・アプリケーション・モデリングへのアプローチ
クラウド・アプリケーション・モデリングへのアプローチ
 
BPStudy20121221
BPStudy20121221BPStudy20121221
BPStudy20121221
 
Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用
 
Software Development with Symfony
Software Development with SymfonySoftware Development with Symfony
Software Development with Symfony
 
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要 第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
 
サービス開発における フロントエンド・ドメイン駆動設計の実践
サービス開発における フロントエンド・ドメイン駆動設計の実践サービス開発における フロントエンド・ドメイン駆動設計の実践
サービス開発における フロントエンド・ドメイン駆動設計の実践
 
[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~
[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~
[ウェビナー] Build 2018 アップデート ~ データ プラットフォーム/IoT編 ~
 
Sc2009autumn s2robot
Sc2009autumn s2robotSc2009autumn s2robot
Sc2009autumn s2robot
 
Ajn24
Ajn24Ajn24
Ajn24
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
 
DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発
 
Symfony2でより良いソフトウェアを作るために
Symfony2でより良いソフトウェアを作るためにSymfony2でより良いソフトウェアを作るために
Symfony2でより良いソフトウェアを作るために
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010
 
Ajax basic
Ajax basicAjax basic
Ajax basic
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 

Mais de 増田 亨

Mais de 増田 亨 (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 基幹システムの再定義と再構築
 
ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計とは何か 【入門編】ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計とは何か 【入門編】
 

Último

Último (11)

論文紹介: 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
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
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
 
論文紹介: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...
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

ドメイン駆動設計(DDD)の実践Part2

  • 1. こんな考え方で、 こんなやり方で、 取り組んでいます 有限会社 システム設計 増田 亨 ブログ: システム設計日記 (http://masuda220.jugem.jp/) Twitter : http://twitter.com/masuda220
  • 2. ドメイン駆動設計とは何か?  ソフトウェア開発のもっとも重要な仕事は、 ドメインモデルの設計である。  ドメイン層以外も必要。  Web 層( ビューとコントロール)  データアクセス層  ...  重要なのは、ドメイン層  「実装」は必要。  重要なのは設計
  • 3. なぜ、ドメイン駆動設計か?  うまく設計したドメインモデルを中核にしたシス テムは、ソフトウェアの変更を、劇的に、簡単 に、安全にするから  変更(=ソフトウェアを育て続ける)が重要な関心事でな いなら...  ドメイン駆動設計は、余計な時間と手間がかかるので、や めたほうが良いかも。  単発の受託開発プロジェクトには向かないかも。  私たちは、継続的にソフトウェアを育てていくことにこだわっ ている。(同じ顧客、同じ問題領域)
  • 4. ドメイン駆動設計でない開発  業務とソフトウエアの関係が捻じれ、歪む  そのソフトウェアは  業務の知識を、まちがって記述  業務の関心事と技術の関心事が、分離できていない  業務(問題領域)の、ごく自然な変更要求  既存のコードへの不自然・不合理・無理難題になる  変更すると、おもわぬところに副作用が発生する  結論  そのソフトウェアは動いているが、正しくない。
  • 5. 捻じれて歪む構図 プレゼン資料 エクセル 画面イメージ 動くソフトウェア ちんぷん かんぷん わからないまま エクセル なんかがんばる 参考システム スクリーンショット ソースコード 仕様 DDL Java XML … 動いているが正しくないソフトウェアの完成
  • 6. ねじれの原因  業務の関心事に、開発者が関心が無いから  開発チームのメンバーは、依頼元の会社の事業について、興 味を持っていますか?  この会社は、どんな顧客に、どんな価値を提供する?  ライバル企業はどこ?  競争相手との差別化ポイントは?  開発中のソフトウェアは、その差別化ポイントを、どう強化する?  業務の用語を、そのまま、クラス名やメソッド名にするのが良い 設計だと思っていますか?  開発者同士で、話す時に、業務の言葉で、議論しています か?
  • 8. ドメインモデル中心に作る <<use>> web.jar ビューと コントロール <<use>> <<use>> 業務機能 (ファサード) domain-model.jar application-service.jar ソフトウエアの核心 <<use>> <<use>> repository.jar データベースアクセス ドメイン層の設計・実装がいつも先
  • 9. コードではなく、モデルで議論する  ドメインモデル設計の関心事(業務の言葉が登場する場所)  パッケージ名  パッケージ間の依存関係  クラス名  クラス間の関連  クラスの識別方法  メソッド名  クラス図がわかりやすい  コードはノイズが多い  依存関係や関連は、コードから読めない  コードでは全体を俯瞰できない  ドメインモデルのクラス図とコードは、常に一致させる  モデルを変更したらコードを変更する  コードを変更したらモデルを変更する
  • 10. ドメインモデル設計の情報源  ドメインエキスパートとの対話  とってもたいへん  こっちがあまりにも、業務を知らなすぎる  エキスパートの頭の中を見ることはできない  基本用語は、仕込んでおく  企業のホームページ  問題領域の解説本(初心者向け)  問題領域の解説本(英語→命名の元ネタ)  既存システムの画面、実データ  問題領域の基本構造  解説本の章立て ドメインモデルの設計パターン Google 検索
  • 11. ドメインモデリング中心に進める 要件分析・要件定義 ユースケースごとに開発 システム価値 システム境界 システム システム外部環境 (ICONIX) ユースケース 画面・帳表 業務フロー図 ロバストネス図 コンテキスト図 要求図 予備設計 イベント プロトコル 利用シーン記述 詳細設計 ドメインモデル 属性追加 シーケンス図 基盤クラス追加 初期概念モデル Java 操作追加 概念モデルの洗練 ソースコー パッケージ構造 ド 中核クラス 関連クラス 依存クラス データモデル DDL/SQL ソースコー クラスとテーブルの設計・実装 ド
  • 13. プレゼンテーションとドメインの分離  画面(View)からドメインオブ 注文 注文 ジェクト(Model)を抽出する 入力画面 オブジェクト 顧客名  コントローラから、ドメインロ 注文金額 ジックをメソッドに抽出 合計()  コントローラからドメインロジッ クのメソッドを、ドメインオブ submit() { } 注文明細 ジェクトに移動 金額計算() 商品 数量 単価 金額 ドメインの関心事だけ取り出して、別クラスにする 金額()
  • 14. 手続き的な設計からオブジェクトへ Order 注文 注文 Calculator 顧客名 顧客名 注文金額 合計() 注文金額 税額算出() 合計() 税額() 注文明細 商品 注文明細 数量 単価 商品 金額 数量 単価 金額 金額() 操作を、関連する情報の近くに移動する 税額()
  • 15. 条件記述からメソッドを抽出 宿泊予約 宿泊予約 料金() 料金() 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 ; } } ドメインリッチなクラスに成長
  • 16. コレクションのカプセル化 顧客 顧客 購買履歴 購買履歴 set購買履歴() 記録(注文) get購買履歴() 最後の注文() 総購買額() List<Order> orderHistory = List<Order> orderHistory ; new ArrayList<Order>(); void setHistory( List<Order>) void record( Order ) Order getLastOrder() List<Order> getHistory() Amount totalPurchase() ドメインリッチなクラスに成長
  • 17. 値をオブジェクトに置き換える 注文 注文 顧客 String 顧客 氏名 class Order class Order { { Customer customer ; String customer; } } class Customer { String name ; } ドメイン知識の入れ物の準備
  • 18.
  • 19. <<façade>> ゴールド会員登録サービス ゴールド会員登録 Service <<entity>> 購入履歴 すべて情報 会員 会員リポジトリ 会員番号 すべての操作 氏名 支払記録 http 依存の 関心事の分離 <<service>> view定義と 購買額が多く ゴールド会員認定ポリシー 変更が簡単で安全になる control 支払事故がない ソフトウェアを育てやすい を抽出 <<value>> <<entity>> 与信限度額 ゴールド会員 ゴールド会員 DB ファクトリ アクセス 会員番号 <<value>> を抽出 氏名 有効期限 承認が必要 <<service>> ドメイン層の ゴールド会員認定手続き いろんな トランザクション <<transport>> ロジック 承認依頼 スクリプト? ゴールド会員リポジトリ