SlideShare uma empresa Scribd logo
1 de 29
Baixar para ler offline
ドメイン駆動設計の実践


 リッチなドメインモデル
   名前探しの旅
         Java-ja DDD
       2013年3月22日
    有限会社 システム設計 増田
Domain-Driven Design (DDD)

 ドメイン駆動設計
ドメイン駆動設計への道
               設計の改善                         ドメインの理解
              ・メソッドの構成
オブジェクト指向      ・オブジェクト間の特性移動   設計のスタイル        言葉の力
基礎訓練          ・データの再編成                       モデル駆動
              ・条件記述の単純化          責任駆動設計
エクササイズ        ・メソッド呼び出しの単純化      役割ステレオタイプ
9つのルール
 小さく作る




                                  責任割当の原則
                                  GRASP




                                             For
  実装の原則                                      Thoughtful Developer
 ・クラス                                        Leading Designer
 ・振る舞いとメソッド
 ・状態とコレクション                     契約による設計
ドメイン駆動設計への道
                                シンプルな
                             トランザクションスクリプト
                リッチな
大きな           トランザクション
泥団子             スクリプト       リッチな
                シンプルな      ドメインモデル
               ドメインモデル

アーキテクチャなし
汎用データ型        テーブルと対応した
                           業務の言葉で組み立てる
汎用命名ルール       ドメインオブジェクト
                           小さなオブジェクト
(ドメインの言葉なし)   (データの入れ物)
                           役割を単純に
                           ばらばらに
ドメインモデルの開発
部品探しの旅   イテレーティブで発見的な活動
名前

     モデリング
             プログラミング

     リファクタリング
プログラミング
        は

    名前さがし
名前に手を抜けば、ひどい設計になる。

名前にこだわれば、良い設計になる。
クラス名      名前
 メソッド名      テーブル名    カラム名
                    スキーマ名
パッケージ名
 フィールド変数名          メッセージキュー名

 業務の言葉で
パラメータ名        ドメイン名

  埋め尽くす
 ローカル変数名
             パス名
                   サーバー名
                   ホスト名
   id属性   name属性    class 属性
業務の言葉をオブジェクトで
 日付 (時分秒を持たない)          金額               管理番号,登録番号
 時分(秒を持たない)             単価               取引先コード
 翌営業日, 休前日              数量,数量単位,換算       取引区分
 月末,月初, 四半期, 半期, 年度     消費税,税率,端数処理      契約番号
 期間                     合計,小計,総合計        商品番号
 有効期限                   数量割引             型式コード
 予定日                    キャンペーン価格         製造番号
 期限切れ一週間前のアラート          季節料金             シリアルナンバー
 前日のリマインダ               キャンセルポリシー        …
 …                      …

プログラミング言語の基本データ型 (Date,String, BigDecimal, Long, …)
    業務の基本用語ごとのオブジェクトに、
をラップした

その業務用語に関するデータとロジックをまとめる。

  超重要         ファンダメンタルなオブジェクト
ドメインオブジェクト

              設計パターン
ユースケースの実装
                     シンプルなトランザクションスクリプト


                                                                    Policy
基本の         Event   Repository        Transfer        Reference    (判断)
 部品        (出来事)      (記録)             (通知)            (参照)        (制約)



  日付       予定日      場所           商品種類                   単価
                                             部門
                      地域          形状                      数量      ここが
      期間                                         役割     税率
            翌月      拠点                                            育つほど
                                 型式        担当者                    楽になる
  有効期限                                                      端数
                 キャンペーン

 超重要           ファンダメンタルなオブジェクト
役に立つ
ドメインオブジェクト
 良い名前
 小さく作る
 ばらばらに
良い名前の見つけ方
語彙を増やす
              名前の宝庫(初日に見つける)
              ・その分野のガイドブック
              ・類似サービスのヘルプ画面
              ・類似パッケージソフトのカタログ
  読む/調べる      (英語版ならクラス名の宝庫)


  聴く/尋ねる      頻度、重要度、関心度、…



正しく使う(言葉を使って相手の反応をみる)
言葉を組み合わせてみて反応をみる
似た言葉を使い分けて反応をみる
小さく作る
クラス     50行以内
メソッド    3行以内
パッケージ   10ファイル以内

これを超えたら、
分割を考える習慣をつける。
3行メソッド
register( order )
{
    verify( order );
    record( order );
    notifyTo(shippingSection);
}
       こういうのが良い感じ
ドメインオブジェクト

実践の小技
How より What
汎用部品を専用部品に

  if を使わない
 for を使わない

setter を使わない
getter を使わない
How        より   What
expireDate.add(-1);

expireDate.previousDay();

expireDate.dayOfFinalAlert ();
                      業務の言葉の登場
汎用部品     を   専用部品に
String             AreaCode
Long               EntryNumber
BigDecimal ラッピング   Amount
Date               ExpireDate
List<Appoint>      Appointments

  なんでも屋             目的特化
 どこでも使える           業務固有の言葉
if を使わない
強力
     enum タイプごとに異なる振る舞いを、どこにも、If 文なしで記述
     strategy/state パターン
     Missing Object パターン
                    (null object)
     Map,Set
強力
                      If 文なしで必須/範囲/形式のチェック。
     Bean Validator   入力値だけでなくロジック内部でも使える。


              契約による設計 (防御的プログラミングと逆の発想)
     Assert   assert date != null : “有効な日付のみ” ;
              前提条件は表明するだけ。 if 文では書かない。
定石   for を使わない
 ファーストクラスコレクション
     コレクション操作ロジックの置き場所
     new Appoints( List<Appoint> )

 Collection フレームワーク API の復習
     TreeMap, LinkedHashSet, Deque,…

 ひと手間かければ、for/if いらず
     Comparable の実装
     Comparator の実装
     equals()/hashCode() の override
setter を使わない
定石

完全コンストラクタ
     Value Object パターン
     生成時に必要な値をすべてセット
     new Money( amount, currency );


setXXX() で状態を変えない
    ・新しいオブジェクトを作る
     ・ライフサイクルの短いオブジェクトの導入
      (状態を固定できるまで細分化)
getter を使わない
@Deprecated
   フレームワークは使っていいよ
   アプリケーションでは使っちゃだめよ

get したいときは、役割分担がおかしい。
    ロジックの移動  (データにロジックを寄せる)
    フィールドの移動 (ロジックにデータを寄せる)
ドメインオブジェクトは
ばらばらにしておく
 実践の小技
構造の変更に備える習慣
  構造は安易にコードに埋め込まない。
  初期の構造はまちがっていることが多い。
  構造の変更を簡単にする準備をしておく。


委譲メソッド
  面倒でも隣人とだけ話す
  × person.contactInfo().phones().mobile()
  ◎ person.primaryContact()

実装継承                   控え目に。もっと控えめに。
パッケージ階層               フラットに。もっとフラットに。
パッケージスコープを好む
public 宣言
   控え目に。もっと控えめに。
      パッケージスコープにできないか?
      パッケージの依存関係に改善の余地は?


import 文
   少なく。もっと少なく。
      クラスの分割が必要では?(責任の持ちすぎ)
      パッケージの依存関係の改善の余地は?
役に立つ
ドメインオブジェクト
ドメインオブジェクト

              設計パターン
ユースケースの実装
                     シンプルなトランザクションスクリプト


                                                                    Policy
基本の         Event   Repository        Transfer        Reference    (判断)
 部品        (出来事)      (記録)             (通知)            (参照)        (制約)



  日付       予定日      場所           商品種類                   単価
                                             部門
                      地域          形状                      数量      ここが
      期間                                         役割     税率
            翌月      拠点                                            育つほど
                                 型式        担当者                    楽になる
  有効期限                                                      端数
                 キャンペーン

 超重要           ファンダメンタルなオブジェクト
 良い名前
 小さく作る
 ばらばらに
Domain-Driven Design (DDD)

 ドメイン駆動設計

Mais conteúdo relacionado

Mais procurados

正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース増田 亨
 
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)Takuya Kawabe
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する増田 亨
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことBIGLOBE Inc.
 
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]Koichiro Matsuoka
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターンSoudai Sone
 
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則現場で役立つシステム設計の原則
現場で役立つシステム設計の原則増田 亨
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計Tadayoshi Sato
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門増田 亨
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる増田 亨
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門増田 亨
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD増田 亨
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する増田 亨
 

Mais procurados (20)

正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース
 
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
 
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則現場で役立つシステム設計の原則
現場で役立つシステム設計の原則
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
 

Semelhante a リッチなドメインモデル 名前探し

ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀増田 亨
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November増田 亨
 
ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2増田 亨
 
ドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計するドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計する増田 亨
 
Big data解析ビジネス
Big data解析ビジネスBig data解析ビジネス
Big data解析ビジネスMie Mori
 
ビッグデータ&データマネジメント展
ビッグデータ&データマネジメント展ビッグデータ&データマネジメント展
ビッグデータ&データマネジメント展Recruit Technologies
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門増田 亨
 
中・大規模サイト作成業務フロー
中・大規模サイト作成業務フロー中・大規模サイト作成業務フロー
中・大規模サイト作成業務フローsenakamura
 
サービス開発における工程
サービス開発における工程サービス開発における工程
サービス開発における工程Hidetoshi Mori
 
プログラムの大海に溺れないために
プログラムの大海に溺れないためにプログラムの大海に溺れないために
プログラムの大海に溺れないためにZenji Kanzaki
 
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】Tomoharu ASAMI
 
Software Development with Symfony
Software Development with SymfonySoftware Development with Symfony
Software Development with SymfonyAtsuhiro Kubo
 
クラウドがもたらすパラダイムシフト
クラウドがもたらすパラダイムシフトクラウドがもたらすパラダイムシフト
クラウドがもたらすパラダイムシフトkurikiyo
 
ドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドラインドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドライン増田 亨
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Tomoharu ASAMI
 
ビッグデータ活用支援フォーラム
ビッグデータ活用支援フォーラムビッグデータ活用支援フォーラム
ビッグデータ活用支援フォーラムRecruit Technologies
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】Tomoharu ASAMI
 
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】Tomoharu ASAMI
 
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 FallAmazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 FallShinpei Ohtani
 

Semelhante a リッチなドメインモデル 名前探し (20)

ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
 
ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2
 
ドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計するドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計する
 
Big data解析ビジネス
Big data解析ビジネスBig data解析ビジネス
Big data解析ビジネス
 
ビッグデータ&データマネジメント展
ビッグデータ&データマネジメント展ビッグデータ&データマネジメント展
ビッグデータ&データマネジメント展
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
 
中・大規模サイト作成業務フロー
中・大規模サイト作成業務フロー中・大規模サイト作成業務フロー
中・大規模サイト作成業務フロー
 
サービス開発における工程
サービス開発における工程サービス開発における工程
サービス開発における工程
 
プログラムの大海に溺れないために
プログラムの大海に溺れないためにプログラムの大海に溺れないために
プログラムの大海に溺れないために
 
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
 
Software Development with Symfony
Software Development with SymfonySoftware Development with Symfony
Software Development with Symfony
 
クラウドがもたらすパラダイムシフト
クラウドがもたらすパラダイムシフトクラウドがもたらすパラダイムシフト
クラウドがもたらすパラダイムシフト
 
Hadoopカンファレンス2013
Hadoopカンファレンス2013Hadoopカンファレンス2013
Hadoopカンファレンス2013
 
ドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドラインドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドライン
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
ビッグデータ活用支援フォーラム
ビッグデータ活用支援フォーラムビッグデータ活用支援フォーラム
ビッグデータ活用支援フォーラム
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
 
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
 
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 FallAmazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
 

Mais de 増田 亨

ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善増田 亨
 
事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述増田 亨
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと増田 亨
 
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来増田 亨
 
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみようドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう増田 亨
 
オブジェクト指向プログラミング入門 -- 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 基幹システムの再定義と再構築増田 亨
 

Mais de 増田 亨 (20)

ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善
 
事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
 
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみようドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう
 
オブジェクト指向プログラミング入門 -- 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 基幹システムの再定義と再構築
 

リッチなドメインモデル 名前探し

  • 1. ドメイン駆動設計の実践 リッチなドメインモデル 名前探しの旅 Java-ja DDD 2013年3月22日 有限会社 システム設計 増田
  • 2. Domain-Driven Design (DDD) ドメイン駆動設計
  • 3. ドメイン駆動設計への道 設計の改善 ドメインの理解 ・メソッドの構成 オブジェクト指向 ・オブジェクト間の特性移動 設計のスタイル 言葉の力 基礎訓練 ・データの再編成 モデル駆動 ・条件記述の単純化 責任駆動設計 エクササイズ ・メソッド呼び出しの単純化 役割ステレオタイプ 9つのルール 小さく作る 責任割当の原則 GRASP For 実装の原則 Thoughtful Developer ・クラス Leading Designer ・振る舞いとメソッド ・状態とコレクション 契約による設計
  • 4. ドメイン駆動設計への道 シンプルな トランザクションスクリプト リッチな 大きな トランザクション 泥団子 スクリプト リッチな シンプルな ドメインモデル ドメインモデル アーキテクチャなし 汎用データ型 テーブルと対応した 業務の言葉で組み立てる 汎用命名ルール ドメインオブジェクト 小さなオブジェクト (ドメインの言葉なし) (データの入れ物) 役割を単純に ばらばらに
  • 5. ドメインモデルの開発 部品探しの旅 イテレーティブで発見的な活動 名前 モデリング プログラミング リファクタリング
  • 6. プログラミング は 名前さがし 名前に手を抜けば、ひどい設計になる。 名前にこだわれば、良い設計になる。
  • 7. クラス名 名前 メソッド名 テーブル名 カラム名 スキーマ名 パッケージ名 フィールド変数名 メッセージキュー名 業務の言葉で パラメータ名 ドメイン名 埋め尽くす ローカル変数名 パス名 サーバー名 ホスト名 id属性 name属性 class 属性
  • 8. 業務の言葉をオブジェクトで 日付 (時分秒を持たない) 金額 管理番号,登録番号 時分(秒を持たない) 単価 取引先コード 翌営業日, 休前日 数量,数量単位,換算 取引区分 月末,月初, 四半期, 半期, 年度 消費税,税率,端数処理 契約番号 期間 合計,小計,総合計 商品番号 有効期限 数量割引 型式コード 予定日 キャンペーン価格 製造番号 期限切れ一週間前のアラート 季節料金 シリアルナンバー 前日のリマインダ キャンセルポリシー … … … プログラミング言語の基本データ型 (Date,String, BigDecimal, Long, …) 業務の基本用語ごとのオブジェクトに、 をラップした その業務用語に関するデータとロジックをまとめる。 超重要 ファンダメンタルなオブジェクト
  • 9. ドメインオブジェクト 設計パターン ユースケースの実装 シンプルなトランザクションスクリプト Policy 基本の Event Repository Transfer Reference (判断) 部品 (出来事) (記録) (通知) (参照) (制約) 日付 予定日 場所 商品種類 単価 部門 地域 形状 数量 ここが 期間 役割 税率 翌月 拠点 育つほど 型式 担当者 楽になる 有効期限 端数 キャンペーン 超重要 ファンダメンタルなオブジェクト
  • 12. 良い名前の見つけ方 語彙を増やす 名前の宝庫(初日に見つける) ・その分野のガイドブック ・類似サービスのヘルプ画面 ・類似パッケージソフトのカタログ 読む/調べる (英語版ならクラス名の宝庫) 聴く/尋ねる 頻度、重要度、関心度、… 正しく使う(言葉を使って相手の反応をみる) 言葉を組み合わせてみて反応をみる 似た言葉を使い分けて反応をみる
  • 13. 小さく作る クラス 50行以内 メソッド 3行以内 パッケージ 10ファイル以内 これを超えたら、 分割を考える習慣をつける。
  • 14. 3行メソッド register( order ) { verify( order ); record( order ); notifyTo(shippingSection); } こういうのが良い感じ
  • 16. How より What 汎用部品を専用部品に if を使わない for を使わない setter を使わない getter を使わない
  • 17. How より What expireDate.add(-1); expireDate.previousDay(); expireDate.dayOfFinalAlert (); 業務の言葉の登場
  • 18. 汎用部品 を 専用部品に String AreaCode Long EntryNumber BigDecimal ラッピング Amount Date ExpireDate List<Appoint> Appointments なんでも屋 目的特化 どこでも使える 業務固有の言葉
  • 19. if を使わない 強力 enum タイプごとに異なる振る舞いを、どこにも、If 文なしで記述 strategy/state パターン Missing Object パターン (null object) Map,Set 強力 If 文なしで必須/範囲/形式のチェック。 Bean Validator 入力値だけでなくロジック内部でも使える。 契約による設計 (防御的プログラミングと逆の発想) Assert assert date != null : “有効な日付のみ” ; 前提条件は表明するだけ。 if 文では書かない。
  • 20. 定石 for を使わない ファーストクラスコレクション コレクション操作ロジックの置き場所 new Appoints( List<Appoint> ) Collection フレームワーク API の復習 TreeMap, LinkedHashSet, Deque,… ひと手間かければ、for/if いらず Comparable の実装 Comparator の実装 equals()/hashCode() の override
  • 21. setter を使わない 定石 完全コンストラクタ Value Object パターン 生成時に必要な値をすべてセット new Money( amount, currency ); setXXX() で状態を変えない ・新しいオブジェクトを作る ・ライフサイクルの短いオブジェクトの導入 (状態を固定できるまで細分化)
  • 22. getter を使わない @Deprecated フレームワークは使っていいよ アプリケーションでは使っちゃだめよ get したいときは、役割分担がおかしい。 ロジックの移動 (データにロジックを寄せる) フィールドの移動 (ロジックにデータを寄せる)
  • 24. 構造の変更に備える習慣 構造は安易にコードに埋め込まない。 初期の構造はまちがっていることが多い。 構造の変更を簡単にする準備をしておく。 委譲メソッド 面倒でも隣人とだけ話す × person.contactInfo().phones().mobile() ◎ person.primaryContact() 実装継承 控え目に。もっと控えめに。 パッケージ階層 フラットに。もっとフラットに。
  • 25. パッケージスコープを好む public 宣言 控え目に。もっと控えめに。 パッケージスコープにできないか? パッケージの依存関係に改善の余地は? import 文 少なく。もっと少なく。 クラスの分割が必要では?(責任の持ちすぎ) パッケージの依存関係の改善の余地は?
  • 27. ドメインオブジェクト 設計パターン ユースケースの実装 シンプルなトランザクションスクリプト Policy 基本の Event Repository Transfer Reference (判断) 部品 (出来事) (記録) (通知) (参照) (制約) 日付 予定日 場所 商品種類 単価 部門 地域 形状 数量 ここが 期間 役割 税率 翌月 拠点 育つほど 型式 担当者 楽になる 有効期限 端数 キャンペーン 超重要 ファンダメンタルなオブジェクト
  • 29. Domain-Driven Design (DDD) ドメイン駆動設計