Movatterモバイル変換


[0]ホーム

URL:


増田 亨, profile picture
Uploaded by増田 亨
PDF, PPTX46,548 views

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

ドメイン駆動設計の考え方、ドメイン駆動設計を理解する三つのキーワード、エヴァンス本のススメ、レガシーに立ち向かう、マイクロサービスとドメイン駆動設計

Download as PDF, PPTX
ドメイン駆動設計本格入門有限会社 システム設計 増田 亨PREMIUM #3 2019.3.22
はじめる前に• ブログを書くかもしれないという方へ2019/3/22 ©有限会社 システム設計 2
全体の流れ2019/3/22 ©有限会社 システム設計 3ドメイン駆動設計の考え方ドメイン駆動設計を理解する三つのキーワードエヴァンス本のススメレガシーに立ち向かうマイクロサービスとドメイン駆動設計
ドメイン駆動設計の考え方©有限会社 システム設計 42019/3/22
2019/3/22 ©有限会社 システム設計 5ドメイン駆動設計でなぜつくるのか「ソフトウエアの核心にある複雑さに立ち向かう」とはどういうことか?
ドメイン駆動設計でなぜつくるのか©有限会社 システム設計 62019/3/22
ソフトウェアの変更を楽で安全にするため➢ 何年ものあいだ、成長と進化を続けるソフトウエア➢ 新たな要求に対し柔軟性と拡張性をもってこたえるソフトウェア➢ しなやかに設計された変更が容易なコードベース➢ 豊富な機能を持った大きなシステムの段階的な成長出典:まえがき 対照的な3つのプロジェクトエピローグ 5つのプロジェクトのその後2019/3/22 ©有限会社 システム設計 7
すべてにプラスに作用する2019/3/22 ©有限会社 システム設計 8変更が楽で安全ビジネスの要求開発スピード開発コスト 運用コスト性能改善セキュリティ向上使いやすさ
すべてにマイナスに作用する2019/3/22 ©有限会社 システム設計 9変更がやっかいで危険ビジネスの要求開発スピード開発コスト 運用コスト性能改善セキュリティ向上使いやすさ
ドメイン駆動設計のやり方©有限会社 システム設計 102019/3/22
変更を楽で安全にするための2019/3/22 ©有限会社 システム設計 11関心の分離の工夫モジュール構造の工夫
ソフトウェアの核心にある複雑さに立ち向かう©有限会社 システム設計 122019/3/22
ドメイン駆動設計を理解する三つのキーワード©有限会社 システム設計 132019/3/22
2019/3/22 ©有限会社 システム設計 14ドメインロジック 複雑さの根源ドメインモデル 複雑さをモデルで整理オブジェクト指向 モデルと実装の一致
要点を絞り込む©有限会社 システム設計 152019/3/22
2019/3/22 ©有限会社 システム設計 16ドメインロジック → ビジネスルールドメインモデル → 計算モデルオブジェクト指向 → 型指向のプログラミング
ビジネスルール©有限会社 システム設計 172019/3/22
ソフトウエアが複雑になる理由ビジネスルール金額、数量、期日、場所などの計算と判定ビジネスルールを適用する条件による分岐顧客区分、商品種別、有効期間、地域区分、金額区分、数量区分、取引種類、取引状態、支払い方法、支払いタイミング、割り増し条件、割引条件、キャンセル可能条件、…2019/3/22 ©有限会社 システム設計 18
複雑さと戦う準備©有限会社 システム設計 192019/3/22
ビジネスルールの記述を独立したモジュールに分離する2019/3/22 ©有限会社 システム設計 20
ビジネスルールの記述を独立させるプレゼンテーション層のモジュール群アプリケーション層のモジュール群データソース層のモジュール群ビジネスルールを記述したモジュール群利用する2019/3/22 ©有限会社 システム設計 21
ビジネスルールの記述を独立させる効果プレゼンテーション層のモジュール群がシンプルになるアプリケーション層のモジュール群がシンプルになるデータソース層のモジュール群がシンプルになる三つの層から区分判定などの条件分岐が激減する三つの層のモジュール群の設計がパターン化し安定する2019/3/22 ©有限会社 システム設計 22
ビジネスルールを記述するモジュール群に複雑さが集中する複雑なビジネスルールを整理しわかりやすく記述するための考え方とやり方2019/3/22 ©有限会社 システム設計 23
従来のモジュール構造とビジネスルールトランザクションスクリプト機能(データ処理手続き)に分割したモジュール群ビジネスルールの記述、特に条件判定が、あちこちのモジュールに分散し、かつ、重複する変更がやっかいで危険2019/3/22 ©有限会社 システム設計 24
ビジネスルールの複雑さにどう立ち向かうか©有限会社 システム設計 252019/3/22
計算モデル©有限会社 システム設計 262019/3/22
モデル• 複雑さに立ち向かうときの根底技法• 全体をシンプルにとらえて説明する試み• 関心の分離• 「抽象」というよりは「分離」• 枝葉末節も、最終的には必要になるので安易に切り捨てない• 要点を特定することと、要点以外を無視することを混同しない• 焦点を合わせるが、周辺も見る (いったりきたりする)• (計算の)中核と周辺• (計算の)主軸と補助軸2019/3/22 ©有限会社 システム設計 27
計算モデル計算モデル• 計算式• 判定式• 判定結果による条件分岐データモデル• 計算(プログラム)の関心事から独立したデータの記録と参照のモデル• ビジネスアプリケーションを実現するために必須• しかし、ソフトウェアの複雑さに立ち向かう主軸ではない2019/3/22 ©有限会社 システム設計 28
ビジネスルール → 計算モデル©有限会社 システム設計 292019/3/22
ビジネスルールのモデリングFact 事実の表現ビジネスの状況の記録や通知に使う値の種類・ 数値、日付、場所、識別番号、名称、…Rule Factを使った計算や判定のロジック計算式同一性の判定式大小の比較式Goal 知りたいこと計算結果や判定結果を表現する値の種類・合計金額、予定日、残数、…・出荷可否、受付可否、割引種類、…2019/3/22 ©有限会社 システム設計 30
ビジネスルールのモデリング• データモデル → 外周の関心事• 計算に必要な元データの記録と参照• 計算結果の記録• 計算モデル → 中核の関心事• ビジネスルールの計算ロジック判定ロジックそのもの• メモリ上で完結する• 計算と入出力の分離• 計算の準備としての入力• 計算の後処理として出力2019/3/22 ©有限会社 システム設計 31
ビジネスルールの記述が中核の関心事プレゼンテーション層のモジュール群アプリケーション層のモジュール群データソース層のモジュール群ビジネスルールを記述したモジュール群利用する2019/3/22 ©有限会社 システム設計 32
計算モデルをどう整理して記述するか©有限会社 システム設計 332019/3/22
型指向のプログラミング©有限会社 システム設計 342019/3/22
型指向のプログラミングビジネスルール(計算/判定)の記述をモジュール化する基本値の種類(=型)ごとにクラス(モジュール)定義する例:数値を扱う BigDecimal型, 日付を扱う LocalDate型ただし、個々のビジネスルールを記述するには汎用的すぎる2019/3/22 ©有限会社 システム設計 35
型指向のプログラミングビジネスルールに登場する値を分類する値の種類(=型)ごとに、独自のクラスを定義する値の種類ごとに有効な値の範囲を定義する値の種類ごとに必要な計算・判定のロジックを記述する2019/3/22 ©有限会社 システム設計 36
ビジネスルールを型指向のプログラミングで記述する2019/3/22 ©有限会社 システム設計 37
ビジネスルールを記述する3要素Fact 事実の表現ビジネスの状況の記録や通知に使う型・ 数値、日付、場所、識別番号、名称、…Rule Factを使った計算や判定のロジック計算式同一性の判定式大小の比較式Goal 知りたいこと計算結果や判定結果を表現する型・合計金額、予定日、残数、…・出荷可否、受付可否、割引種類、…2019/3/22 ©有限会社 システム設計 38
Fact-Rule-Goalで記述する3つの設計パターン値オブジェクトロジックを持ったenumコレクションのカプセル化2019/3/22 ©有限会社 システム設計 39
値オブジェクト2019/3/22 ©有限会社 システム設計 40
値オブジェクトとは?• Fact の表現手段• 数値、時間、場所、識別番号、識別名称、…• ビジネスとして適切な値の範囲を定義する• Rule (計算ロジックや判定ロジック)の置き場所• Factを使う計算や判定をメソッドとして記述する• Factと持つオブジェクトに、関連するロジックを集める• Goal 知りたいこと(計算結果、判定結果)の表現手段• 知りたいことを表現した型(値の種類)を設計する• メソッドの返す型として使う2019/3/22 ©有限会社 システム設計 41
値オブジェクトのカタログ単一の値 範囲型(from-to) 範囲型のコレクション数値金額型Amount, Money金額範囲x円以上 y円未満金額範囲のコレクション価格帯数量型Quantity, NumberOfXxx数量範囲m人以上 n人以下数量範囲のコレクション数量別割引率時間日付型DueDate, XxxDate期間開始日 - 終了日期間のコレクションシーズン時刻型HourTime, XxxTime時間開始時刻 – 終了時刻時間のコレクション時間帯空間地点型Point接続Path:出発点 – 到達点接続のコレクションRoute [Path,…]-地域型Area, Zone地域のコレクション階層、隣接関係、…2019/3/22 ©有限会社 システム設計 42
値オブジェクトの効果• 値オブジェクト=ビジネスに特化した値の種類を明示的に表現• 動かすだけなら、プログラミング言語が提供する汎用的な型だけでよい• プログラムの表現が、ビジネスルールの記述そのものになる• 値の種類単位で、ビジネスロジックの記述が一か所にまとまる• プログラムのあちこちにビジネスルールの記述が重複しない• ビジネスルールが変わったときのソフトウェアの変更が楽で安全2019/3/22 ©有限会社 システム設計 43
値オブジェクトを設計する計算の意図を、メソッド名とメソッドの返す型で説明する2019/3/22 ©有限会社 システム設計 44
計算の種類 説明、メソッド例 結果の型等値判定 isEqual( other ) , notEqual( other ) boolean / enum大小判定 greaterThan( other ), lessThan( other ), … boolean / enum加算・減算 同じ型同士の計算 同じ型乗算 同じ型同士の乗算は意味がないことが多い 別の数値型除算 同じ型の除算と、異なる型の除算では、意味が異なる 別の数値型境界 Max, Min の存在 同じ型(の固定値)列挙 prev(), next() が可能な集合 (循環が可/不可) 同じ型文字列表現 値の標準的な文字列表現 toString() 文字列文字列からの生成 標準的な文字列表現からのオブジェクト生成 parse() 同じ型計算の候補(単一値)2019/3/22 ©有限会社 システム設計 45
計算の種類 説明、メソッド例 結果の型等値判定 isEqual( other ) , notEqual( other ) boolean / enum大小判定 greaterThan( other ), lessThan( other ), … boolean / enum範囲に含まれる contains( element ), encloses( other ) boolean / enum範囲が重複する isOverlapped(other) boolean / enum厳密に隣接する isConnectedTo(other) boolean / enum境界の値 Max, Min , 要素の型範囲演算 intersect(other), minus(other), add(other) 範囲型文字列表現 標準的な文字列表現 toString(), show(), describe() 文字列計算の候補(範囲型 from-to)2019/3/22 ©有限会社 システム設計 46
計算の種類(メソッド)の設計原則• ある値について、ビジネスルールに必要な計算は、限定的• 金額と金額の足し算はある• 金額と金額の掛け算はない• ビジネスルールの値の範囲は、限定的• 境界値がある• 1以上99まで• 現在日以降 90日以内• 計算の意図を、メソッド名、メソッドの渡す引数の型、メソッドの返す型で説明する2019/3/22 ©有限会社 システム設計 47
値オブジェクトを使って変更を安全にする契約による設計2019/3/22 ©有限会社 システム設計 48
契約による設計変更を楽で安全にするための設計技法assert による表明 型による表明防御的な検査コードを書かない事前条件(クラスを使う側の責任:引数の型)事後条件(計算を提供するクラスの責任:返り値の型)暗黙のビジネスルールの明文化につながる値の範囲と計算の種類を限定 → 動作が安定する2019/3/22 ©有限会社 システム設計 49
enumを使った区分ごとのロジックの整理2019/3/22 ©有限会社 システム設計 50
区分ごとのビジネスルールを扱う区分ごとの条件分岐が複雑さの大きな原因enumは区分ごとのロジックを整理する強力な手段enumを使うと区分体系の問題の発見と改善が進む2019/3/22 ©有限会社 システム設計 51
区分を列挙しただけのenumを作る区分ごとの定数をenumのフィールド変数に移動区分ごとの計算や判定のロジックをenumのメソッドに移動コードがゆがむ(フィールド変数やメソッドの一貫性が崩れる)区分のリファクタリング(区分の分解、再定義)ビジネスルール記述のわかりやすさにブレークスルーが起きる2019/3/22 ©有限会社 システム設計 52
コレクションのカプセル化2019/3/22 ©有限会社 システム設計 53
コレクション操作の問題と改善問題あちこちにコレクションを操作する類似の記述が分散バグが紛れ込みやすい(計算の不整合が起きやすい)コレクション操作の手続きは、ビジネスの関心事ではない改善策目的別のコレクション型を独自につくるコレクション操作のロジックをそのクラスに集めるコレクション操作の詳細を隠蔽する2019/3/22 ©有限会社 システム設計 54
コレクションのカプセル化の効果コレクション操作がちらばっていたコードのぐちゃぐちゃ感が消えるコレクションに必要な計算を集めると、リファクタリングがやりやすいコレクション操作の整合性と一貫性が向上するコレクション操作という技術手段が隠蔽されクラス名、メソッド名、メソッドの返す型でビジネスの関心事が前面に登場する2019/3/22 ©有限会社 システム設計 55
計算の種類 説明、メソッド例 結果の型サイズ count() int要素の検査 contains(要素), isEmpty(), notEmpty() boolean / enum部分集合 select(条件), reject(条件), コレクション集約演算 sum(), min(), max(), average(), … 集約結果の型集合演算 insersect(other), minus(other), add(other) コレクション変換 unique(), sort(), groupBy() コレクション要素の取り出し first(), last(), at(index) 要素の型要素の追加 add(), addAll(), append(), insertAt(), … void文字列表現 show(), describe() 文字列, 文字列[ ]計算の候補(コレクション)2019/3/22 ©有限会社 システム設計 56
ドメイン駆動設計を理解する三つのキーワード©有限会社 システム設計 572019/3/22
2019/3/22 ©有限会社 システム設計 58ドメインロジック → ビジネスルールドメインモデル → 計算モデルオブジェクト指向 → 型指向のプログラミング
エヴァンス本のススメ2019/3/22 ©有限会社 システム設計 59
エリック・エヴァンスのドメイン駆動設計2019/3/22 ©有限会社 システム設計 60
登場するパターン2019/3/22 ©有限会社 システム設計 61基本要素エンティティ値オブジェクトドメインサービスモジュールオブジェクトのライフサイクル集約(アグリゲート)リポジトリファクトリユビキタス言語 モデル駆動設計実践的モデラーしなやかな設計意図の明白なインタフェース副作用のない関数表明概念の輪郭独立したクラス閉じた操作レイヤードアーキテクチャスマートUIコンテキスト境界継続的な統合コンテキストマップ共有カーネル顧客・供給者順応者腐敗防止層別々の道公開ホストサービス公表された言語コアドメイン汎用的なサブドメイン凝集されたメカニズムドメインビジョン声明文コアのハイライトコアの隔離コアの抽象化進化する秩序システムのメタファ責務のレイヤ知識レベル・運用レベル
パターンについて• ひとつひとつのパターンだけ取り上げて理解しても役に立たない• よく登場するパターン名がドメイン駆動設計の本質ではない• パターンの背景にある動機を理解する• パターンとパターンの関係を理解する• そのためには、パターンの拾い読みではなく、本の構成と全体の流れを理解したほうが良い2019/3/22 ©有限会社 システム設計 62
よく登場するパターンへの注釈エンティティビジネスルールや計算モデルとして主要な関心事ではないどちらかといえば入出力(記録と参照)の関心事値オブジェクトビジネスルールの整理と実装の主役計算モデルの構成要素として、別格の重要度ドメインサービス型指向のプログラミングの道具ではないメソッドの引数をインスタンス変数に持つオブジェクトの設計を試みる集約(アグリゲート)計算ロジックの集約データの集約ではない維持するのは、データベースの整合性ではなく、計算の整合性と一貫性リポジトリ計算の準備と計算結果の記録の仕組み入出力の関心事であり、計算モデルの一部ではない2019/3/22 ©有限会社 システム設計 63
よく登場するパターンへの注釈ユビキタス言語目的ではない共通言語 どこにでも、いつでも登場する言葉ビジネスをどこまで理解し、意識してコードを書いているかの評価軸コードや技術者同士の会話で、どこでも、いつでも登場しているか?境界づけられたコンテキスト目的ではないコミュニケーションや共通理解の現状を把握する手段一つのチームに複数のコンテキストが存在するリスクへの警鐘(継続的な統合:CI)ビルドとテストの自動化が本質ではない(ビルドOK,テストOKでは不十分)チーム内で、ビジネスルール理解と計算モデル表現を整合させるそのためには頻繁な会話が必要(特にちょっとした違和感の確認)コンテキストマップ計算モデルのマッピングデータ入出力のマッピングではない同じ計算モデルの通用範囲値の種類の名前が登場するかしないか同じ名前の値の種類は、内容が同じか(値の範囲、計算の種類)2019/3/22 ©有限会社 システム設計 64
エヴァンス本の要点を確認する©有限会社 システム設計 652019/3/22
ドメイン駆動設計でなぜつくるのか©有限会社 システム設計 662019/3/22
ソフトウェアの変更を楽で安全にするため➢ 何年ものあいだ、成長と進化を続けるソフトウエア➢ 新たな要求に対し柔軟性と拡張性をもってこたえるソフトウェア➢ しなやかに設計された変更が容易なコードベース➢ 豊富な機能を持った大きなシステムの段階的な成長出典:まえがき 対照的な3つのプロジェクトエピローグ 5つのプロジェクトのその後2019/3/22 ©有限会社 システム設計 67
2019/3/22 ©有限会社 システム設計 68ドメインロジック 複雑さの根源ドメインモデル 複雑さをモデルで整理オブジェクト指向 モデルと実装の一致
要点を絞り込んで理解する©有限会社 システム設計 692019/3/22
2019/3/22 ©有限会社 システム設計 70ドメインロジック → ビジネスルールドメインモデル → 計算モデルオブジェクト指向 → 型指向のプログラミングこのように意味を限定して読んでみると、ずいぶんわかりやすくなる
エヴァンス本の全体構成を理解する©有限会社 システム設計 712019/3/22
全体の構成2019/3/22 ©有限会社 システム設計 72第1部ドメインモデルを機能させる第2部モデル駆動設計の構成要素第3部深い洞察に向かうリファクタリング第4部戦略的設計1章~3章 4章~7章 8章~13章 14章~17章概論と基本事項ここだけでは役に立たない役に立つモデルを手に入れるための実用的な設計技法大規模に適用する長期的に取り組むための技法
エヴァンス本の中核©有限会社 システム設計 732019/3/22
第3部:役に立つモデルの実用的な設計技法2019/3/22 ©有限会社 システム設計 749章暗黙的な概念を明示的にする10章しなやかな設計ビジネスルールがコードで明示できてないことの検知「制約」や「ルール」をクラスやメソッドで表現する実験ぎこちなくても、とにかくコードにしてみる明示的になった素材を改善する設計技法意図の明白なインタフェース副作用のない関数表明概念の輪郭独立したクラス閉じた操作表現を改善するビジネスを理解する
第4部:大規模に長期的に取り組む2019/3/22 ©有限会社 システム設計 7514章モデルの整合性を維持する15章蒸留16章大規模な構造大規模・長期的に取り組むための準備境界づけられたコンテキスト継続的な統合コンテキストマップビジネスルールの複雑さの整理とモジュール構造の改善コアドメイン汎用的なサブドメイン凝集されたメカニズムドメインビジョン声明文コアのハイライトコアの隔離コアの抽象化全体の関係を共通理解にするモデル間の関係の整理と改善責務のレイヤ(能力・運用・約束・ポリシー)知識レベルと運用レベル
複雑なビジネスルールに立ち向かう技法©有限会社 システム設計 762019/3/22
ビジネスルールの分析設計従来のアプローチ2019/3/22 ©有限会社 システム設計 77
従来のアプローチ• プロセスモデリング• 機能分割• トランザクションスクリプト• データモデリング• ERモデリング• CRUD分析• データベースアクセスのスクリプティング• ビジネスルールの発見と整理が、主軸ではない• その結果、ビジネスルールがあちこちにちらばり重複する2019/3/22 ©有限会社 システム設計 78
ビジネスルールの分析設計ドメイン駆動設計のアプローチ2019/3/22 ©有限会社 システム設計 79
2019/3/22 ©有限会社 システム設計 80ドメインロジック → ビジネスルールドメインモデル → 計算モデルオブジェクト指向 → 型指向のプログラミング
ビジネスルールを記述する3要素Fact 事実の表現ビジネスの状況の記録や通知に使う型・ 数値、日付、場所、識別番号、名称、…Rule Factを使った計算や判定のロジック計算式同一性の判定式大小の比較式Goal 知りたいこと 計算結果や判定結果を表現する型2019/3/22 ©有限会社 システム設計 81
Fact-Rule-Goalで記述する3つの基本パターン値オブジェクトロジックを持ったenumコレクションのカプセル化2019/3/22 ©有限会社 システム設計 82
ビジネスルールの発見と整理の枠組み2019/3/22 ©有限会社 システム設計 83
責務のレイヤ(能力・運用・約束・ポリシー)2019/3/22 ©有限会社 システム設計 84
責務のレイヤの例ポリシー 事業運営の決め事価格、割引、優遇、拒絶オーバーブッキングキャンセル約束顧客との契約取引先との契約見積予約注文運用 ビジネス活動の実態(イベント)出荷、売り上げ請求、回収能力 ビジネスの現実(リソース)在庫出荷能力処理能力2019/3/22 ©有限会社 システム設計 85
ビジネスルールの3つの源泉価値提供の約束と支払いの約束ビジネス活動の連鎖/約束の連鎖競争優位の獲得策/競争劣位の防止策契約バリューチェーン事業運営ポリシー2019/3/22 ©有限会社 システム設計 86
約束何を(区分)どのくらい(数量)いつ(日時)いくらで(金額)誰に(区分)2019/3/22 ©有限会社 システム設計 87
能力:約束してよいこと/約束できないこと出荷可能な在庫配送能力キャパシティ(空席、空きスペース、…)アベイラビリティ(人、空間、モノ、…)2019/3/22 ©有限会社 システム設計 88
運用:約束の履行の監視と促進の決め事いつ何が起きるべきか(イベント区分、状態区分)起きたことの検知起きなかったことの検知起きた場合のアクション起きなかった場合のアクション2019/3/22 ©有限会社 システム設計 89
ポリシー• 価格、割引• 特典、優遇• 提供ポリシー(時間、場所、相手、許容量、…)• オーバーブッキング• 与信• キャンセル2019/3/22 ©有限会社 システム設計 90
約束違反の扱いの決め事約束のキャンセル(可否の判断、可能な場合の補償)価値を提供できなかった時のルール(返品、返金、…)対価の支払いができなかった時のルール(ペナルティ、…)2019/3/22 ©有限会社 システム設計 91
エヴァンス本の構成2019/3/22 ©有限会社 システム設計 92第1部ドメインモデルを機能させる第2部モデル駆動設計の構成要素第3部深い洞察に向かうリファクタリング第4部戦略的設計1章~3章 4章~7章 8章~13章 14章~17章概論と基本事項ここだけでは役に立たない役に立つモデルを手に入れるための実用的な設計技法大規模に適用する長期的に取り組むための技法
ドメイン駆動設計の考え方でレガシーに立ち向かう2019/3/22 ©有限会社 システム設計 93
2019/3/22 ©有限会社 システム設計 94ドメインロジック → ビジネスルールドメインモデル → 計算モデルオブジェクト指向 → 型指向のプログラミング
ビジネスルールを記述する3要素Fact 事実の表現ビジネスの状況の記録や通知に使う型・ 数値、日付、場所、識別番号、名称、…Rule Factを使った計算や判定のロジック計算式同一性の判定式大小の比較式Goal 知りたいこと 計算結果や判定結果を表現する型2019/3/22 ©有限会社 システム設計 95
ビジネスルールの3つの源泉価値提供の約束と支払いの約束ビジネス活動の連鎖/約束の連鎖競争優位の獲得策/競争劣位の防止策契約バリューチェーン事業運営ポリシー2019/3/22 ©有限会社 システム設計 96
レガシーへの立ち向かい方:心の準備• ありがちな設計• トランザクションスクリプト(機能単位のモジュール)• バッチ処理• テーブルは更新可能なデータファイル• ありがちな状況• 設計や分析の資料はない/あっても古くてコードと一致していない• 命名規約は、番号重視 and/or 省略重視 ( KBN01 )• 使われていないロジック、データ、区分が混在• 手がかり• 実際に業務が回っている(実データがある)• 画面、出力帳票、データ交換用のファイル2019/3/22 ©有限会社 システム設計 97
レガシーへの立ち向かい方:手がかり• 実データ、実画面、実帳票、実ファイル• 実際に使われているデータ(事実の記録)が最大の手がかり• プログラムの意図は、コードからは読み取りにくい• そういう設計のスタイルだから• コードは意図の表現ではなく、データ処理の手続きの実現• 目のつけどころ• 区分値 ビジネスルールの複雑さの根源• 導出項目 ビジネスルールの計算・判定の結果2019/3/22 ©有限会社 システム設計 98
区分値の調査と分析• コード内のif文やswitch文と格闘する前に、区分体系を徹底的に調査する• データベースの区分カラム• GROUP BY 句で、実際のデータ内容の確認• 区分によって、使うカラム/使わないカラム、意味の異なるカラムの特定• 画面の区分表示、区分選択ボックス• データベースの区分カラムとの対応• 業務的な使い方の確認2019/3/22 ©有限会社 システム設計 99
導出項目の調査と分析• 導出項目の特定• ビジネスルールを適用した計算結果• 金額、数量、期日、場所、区分• 画面の表示項目• データベースに記録された導出結果• 導出ルールの調査• 業務マニュアル/利用ガイド/料金表 …• ソースコード• ヒアリング(ありえないデータ、ありえない結果を判断できる能力を持つ人)2019/3/22 ©有限会社 システム設計 100
あるべき姿の中核を見極める• 導出(計算・判定)に焦点を合わせる• 単なる記録と参照は、いったんスコープ外にする• データベースは、計算・判定で使う項目に焦点を合わせる• 画面項目も、計算・判定で使う項目/導出結果に焦点を合わせる• ソースコード中の、計算式と判定式に焦点を合わせる• 単なるデータの記録と参照は、ばっさりスコープからはずす2019/3/22 ©有限会社 システム設計 101
あるべき姿の中核を生み出す• データベース• 導出の元になるデータと、導出結果だけに絞り込んだデータベースを用意する• FACTを正しく記録するためのテーブル群を新規に設計• イミュータブルデータモデル• データベース制約を徹底する• 特に NOT NULL 制約• 現行のデータベースから必要データを複製する仕組みづくり• 導出ロジックのプログラミングと検証• FACT駆動で作成した新データベースから、必要な計算・判定ができるプログラムを開発する• 計算結果・判定結果を、既存データベースの該当カラムと突き合わせる2019/3/22 ©有限会社 システム設計 102
複雑さの核心に切り込む• 既存の区分体系• 未使用の区分• 今となっては意図が不明な区分• 複数の区分軸の混在• 区分体系の整理• 未使用を使わない• 意図不明もいったん使わない• 明らかな例外を、事前処理で除外する• 残った区分を論理的に分解する• 2軸か3軸の組み合わせになっていることが多い• すべての組み合わせが網羅されていないことが多い(その理由を分析する)2019/3/22 ©有限会社 システム設計 103
アプリケーションとして組み立てる• 中核は手に入った• FACTを記録したテーブル群(と実データ)• FACTを使った導出プログラム(計算モデル)• 計算サービス、判定サービス• 中核を使って• 画面や外部インタフェース• 作り直す• 既存の画面処理プログラムや、外部インタフェースプログラムから呼び出す• 記録して参照するだけのデータ群• 中核の外周に追加する• 既存の処理にまかせる2019/3/22 ©有限会社 システム設計 104
マイクロサービスとドメイン駆動設計©有限会社 システム設計 1052019/3/22
マイクロサービスアーキテクチャひとつのアプリケーションを複数のサービスで構築する開発の独立性• サービスごとに開発活動が独立• サービスごとに修正・拡張が独立• サービスごとに設計改善が独立配置と運用の独立性• サービスごとに運用が独立• ただし、高可用性が要求される• サービス単位での自動スケーリング2019/3/22 ©有限会社 システム設計 106
マイクロサービスへの分割4つの軸©有限会社 システム設計 1072019/3/22
2019/3/22 ©有限会社 システム設計 108分割の軸 説明予想されるアンチパターンビジネス能力ビジネスアーキテクチャに合わせる部門・業務・職務 (3段階の機能分割)大きなきれいな絵と入り組んだ現実のシステム構造ドメインモデルビジネスルール単位で分割・価格、割引、特典、…・在庫引き当て、予約、キャンセル、…ルールの依存性の整理の失敗区分設計の失敗アクション指向アクション単位(イベント単位)に分割引き合い、見積、在庫確認、受注、出荷指示、売上計上、請求、…手続き的なモジュール構造ロジックがあちこちに重複リソース指向リソース単位に分割リソース管理番号( Entity, URI )FatなEntity/テーブル巨大な中央データベース orデータの重複と不整合
分割の方針4つの軸の組み合わせになる課題• 主軸の選択• 補助軸の組み合わせの優先順位の選択• 大規模な取り組みの一貫性と整合性の維持• 長期的な取り組みの一貫性と整合性の維持• 「最初から正しい分割はできない」• 継続的な「分割の見直し」の現実性2019/3/22 ©有限会社 システム設計 109
マイクロサービスのアーキテクチャドメイン駆動設計のアーキテクチャ©有限会社 システム設計 1102019/3/22
ドメイン駆動設計• マイクロサービスへの分割を目的とはしていない• 良い設計(適切な関心の分離と変更容易なモジュール構造)を目指していると• シンプルなサービスの分割に進化していく• シンプルなデータベース構造に進化していく• その結果、マイクロサービス化をやりやすくなる• 配置・運用を実際にマイクロサービス化するかは、要件しだい• マイクロサービス化のトレードオフを検討する• 不必要な複雑さを持ち込まない2019/3/22 ©有限会社 システム設計 111
モノリスからマイクロサービスへの段階的移行• ドメイン駆動設計で関心の分離とモジュール構造の改善を積重ねる• 最初はシステム全体のあちこちが変更対象になる• この段階でのマイクロサービス化は失敗への道• ある程度、開発と設計改善が進むと• アプリケーション層のクラス/メソッドが安定する• データベース設計が安定する• この段階になってから、(必要なら)マイクロサービス化を検討する2019/3/22 ©有限会社 システム設計 112
マイクロサービス化と関係する設計技法• アプリケーション層の分析・設計• データベースの分析・設計2019/3/22 ©有限会社 システム設計 113
アプリケーション層の設計2019/3/22 ©有限会社 システム設計 114プレゼンテーション層アプリケーション層データソース層データベースビジネスルール層使う
ビジネスルールの記述を独立させるプレゼンテーション層のモジュール群アプリケーション層のモジュール群データソース層のモジュール群ビジネスルールを記述したモジュール群利用する2019/3/22 ©有限会社 システム設計 115
アプリケーション層の複雑さビジネスルールの記述を、ビジネスロジック層に移動する理論的にはアプリケーション層はとてもシンプルになる現実はアプリケーション層に複雑なロジックが残りやすいアプリケーション層の複雑さの分析と整理 (VETRO, Saga)2019/3/22 ©有限会社 システム設計 116
VETRO分析2019/3/22 ©有限会社 システム設計 117
VETRO 分析とは?ビジネストランザクションをビジネスメッセージの処理としてとらえるメッセージ処理を5種類のアクション(VETRO)に分解してみるアクションごとに、どのルールをどのタイミングで適用するか検討する2019/3/22 ©有限会社 システム設計 118
VETROValidation妥当性検証Enrich情報付加Translate情報導出Routing分岐判定Operation通知/記録ビジネスメッセージサービスを実行するステップの分解それぞれのステップで、ビジネスルールの計算・判定をする可能性ステップが複雑になる場合は、サービス単位を分けることを検討する2019/3/22 ©有限会社 システム設計 119
VETROビジネスメッセージEvent 通知、Document送付Query 問い合わせ、Command 指示Validation妥当性検証メッセージ内容の妥当性を検証するデータ形式、必須属性、値範囲、…Enrich情報付加メッセージに含まれたIDなどから、関連する情報を収集するルール(ex. 顧客ID->顧客購買履歴)Translate情報導出付加された情報を元に、新たな情報を導出するルール (ex. 購買履歴 → 顧客ランク )Routing分岐判定導出された情報を元に、適切なオペレーションに分岐させるルール ( ex. 顧客ランクごとの対応 )Operation通知/記録通知ルール:誰に何を通知すべきか?記録ルール:どこに何を記録すべき?2019/3/22 ©有限会社 システム設計 120
Saga複合トランザクションに分解する2019/3/22 ©有限会社 システム設計 121
Sagaとは?③が不成立だった場合、①と②にキャンセル処理を実行するという、さまざまな状況とその対応方法(undo)の物語を用意する①②③を、独立して、順不同で実行する (それぞれの物語)三つともOKであれば、それで完了(Happy Goal)独立したトランザクション A独立したトランザクション B独立したトランザクション Cビジネスメッセージコーディネータひとつの大きなトランザクション → 独立した複数の小さなトランザクションに分割2019/3/22 ©有限会社 システム設計 122
Sagaとは?独立したトランザクションのコミット• 個々のトランザクションは独立して確定する(できる)ビジネス的な undo の仕組み• どこかで不都合な状況が発生した場合、キャンセル処理など適切なカウンタートランザクションを実行する仕組みを用意するビジネスレベルでの代替アクションの分析と実装• 自動的なundo以外に、人間系の代替プロセスや取消プロセスの実行に引き継ぐパターンも選択肢• その場合の支援機能を用意する2019/3/22 ©有限会社 システム設計 123
データベース2019/3/22 ©有限会社 システム設計 124プレゼンテーション層アプリケーション層データソース層データベースビジネスルール層計算モデルとデータモデルのマッピング
マイクロサービスに発展可能なデータベース設計• 事実の記録を徹底する(イベントソーシング)• テーブル単位(カラム構成)を計算の関心事に従属させる• 事実と参照を分ける(テーブル→スキーマ→データベース)• 事実と導出結果を分ける(テーブル→スキーマ→データベース)2019/3/22 ©有限会社 システム設計 125
事実の記録:データベース設計の基本事実の記録の原則• NULL という事実はない• NOT NULL 制約にできないカラムは事実の記録として欠陥• オプショナルな項目は、別テーブルにする• 発生時点の異なる事実は、別テーブルにする• 有効な値の範囲を定義する(型指向の設計)外部キー制約には2つの意味がある• 事実の前後関係(重要)• 同じ時点の事実を別テーブルにしている関係(別事実に分解すべき可能性)2019/3/22 ©有限会社 システム設計 126
テーブルの分割関数従属性• キーに従属するデータは同じテーブルに• この原則だけだと、テーブルが肥大化しがち発生時点で分解• 事実の発生した時点が異なれば別テーブルにわける計算従属性• 計算単位ごとに、計算に必要な事実を別テーブルに分ける○ 商品番号に従属し、かつ、価格計算に関係にあるカラムだけのテーブル× 価格以外に、カタログ情報や在庫情報を持つ肥大化した商品マスター2019/3/22 ©有限会社 システム設計 127
分離・独立を段階的に発展させるテーブル → スキーマ → データベースいきなりデータベース単位の分割を検討しない1. 小さなテーブル単位に役割を分け、利用特性を明確にする2. 同じ特性のテーブルをスキーマでグルーピング3. スキーマ単位の参照権限・更新権限を徹底する4. 独立性の高いスキーマを別データベースへの切り出しを検討する2019/3/22 ©有限会社 システム設計 128
記録と参照、事実と導出結果の分離2019/3/22 ©有限会社 システム設計 129事実の記録 事実の複製 導出結果(残高,状態,集計)イミュータブル イミュータブル ミュータブルINSERT SELECT SELECT永続化を保証する 事実から再生可能 事実から再生可能複製delete/insertcreated_atupdated_at
ドメイン駆動設計マイクロサービスへの分割を目的とはしていない良い設計(適切な関心の分離と変更容易なモジュール構造)を目指す• シンプルなサービスへの分割に進化していく• シンプルなデータベース構造に進化していく• その結果、マイクロサービス化をやりやすくなる実際に配置・運用をマイクロサービスに分割するかは、要件しだい• マイクロサービス化のトレードオフを検討する• 不必要な複雑さを持ち込まない2019/3/22 ©有限会社 システム設計 130
全体のまとめ2019/3/22 ©有限会社 システム設計 131
話した内容2019/3/22 ©有限会社 システム設計 132ドメイン駆動設計の考え方ドメイン駆動設計を理解する三つのキーワードエヴァンス本のススメレガシーに立ち向かうマイクロサービスとドメイン駆動設計
変更を楽で安全に2019/3/22 ©有限会社 システム設計 133変更が楽で安全ビジネスの要求開発スピード開発コスト 運用コスト性能改善セキュリティ向上使いやすさ
ビジネスルールの記述が中核の関心事プレゼンテーション層のモジュール群アプリケーション層のモジュール群データソース層のモジュール群ビジネスルールを記述したモジュール群利用する2019/3/22 ©有限会社 システム設計 134
2019/3/22 ©有限会社 システム設計 135ドメインロジック → ビジネスルールドメインモデル → 計算モデルオブジェクト指向 → 型指向のプログラミング
ビジネスルールのモデリングFact 事実の表現ビジネスの状況の記録や通知に使う値の種類・ 数値、日付、場所、識別番号、名称、…Rule Factを使った計算や判定のロジック計算式同一性の判定式大小の比較式Goal 知りたいこと計算結果や判定結果を表現する値の種類・合計金額、予定日、残数、…・出荷可否、受付可否、割引種類、…2019/3/22 ©有限会社 システム設計 136
Fact-Rule-Goalで記述する3つの設計パターン値オブジェクトロジックを持ったenumコレクションのカプセル化2019/3/22 ©有限会社 システム設計 137
ビジネスルールの3つの源泉価値提供の約束と支払いの約束ビジネス活動の連鎖/約束の連鎖競争優位の獲得策/競争劣位の防止策契約バリューチェーン事業運営ポリシー2019/3/22 ©有限会社 システム設計 138
エヴァンス本の構成2019/3/22 ©有限会社 システム設計 139第1部ドメインモデルを機能させる第2部モデル駆動設計の構成要素第3部深い洞察に向かうリファクタリング第4部戦略的設計1章~3章 4章~7章 8章~13章 14章~17章概論と基本事項ここだけでは役に立たない役に立つモデルを手に入れるための実用的な設計技法大規模に適用する長期的に取り組むための技法

Recommended

PDF
ドメイン駆動設計サンプルコードの徹底解説
PDF
世界でいちばんわかりやすいドメイン駆動設計
PDF
ドメイン駆動設計のためのオブジェクト指向入門
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
PDF
ドメイン駆動設計に15年取り組んでわかったこと
PDF
ドメイン駆動設計 基本を理解する
PDF
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
正しいものを正しく作る塾-設計コース
PDF
PostgreSQLアンチパターン
PDF
ソフトウェア開発のやり方の改善
PPTX
世界一わかりやすいClean Architecture
PDF
3週連続DDDその1 ドメイン駆動設計の基本を理解する
PPT
ドメインロジックの実装方法とドメイン駆動設計
PDF
オブジェクト指向できていますか?
PDF
ドメイン駆動設計の正しい歩き方
PDF
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
PDF
オブジェクト指向エクササイズのススメ
PDF
ドメイン駆動設計という仕事の流儀
PDF
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
PPTX
ドメイン駆動設計の学習曲線とブレークポイント
PDF
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
PDF
ドメイン駆動で開発する ラフスケッチから実装まで
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
PDF
ドメイン駆動設計 の 実践 Part3 DDD
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
ちいさなオブジェクトでドメインモデルを組み立てる
PDF
ビジネスルールの複雑さに立ち向かう
PDF
ドメイン駆動設計という設計スタイル

More Related Content

PDF
ドメイン駆動設計サンプルコードの徹底解説
PDF
世界でいちばんわかりやすいドメイン駆動設計
PDF
ドメイン駆動設計のためのオブジェクト指向入門
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
PDF
ドメイン駆動設計に15年取り組んでわかったこと
PDF
ドメイン駆動設計 基本を理解する
PDF
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
ドメイン駆動設計サンプルコードの徹底解説
世界でいちばんわかりやすいドメイン駆動設計
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話

What's hot

PDF
正しいものを正しく作る塾-設計コース
PDF
PostgreSQLアンチパターン
PDF
ソフトウェア開発のやり方の改善
PPTX
世界一わかりやすいClean Architecture
PDF
3週連続DDDその1 ドメイン駆動設計の基本を理解する
PPT
ドメインロジックの実装方法とドメイン駆動設計
PDF
オブジェクト指向できていますか?
PDF
ドメイン駆動設計の正しい歩き方
PDF
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
PDF
オブジェクト指向エクササイズのススメ
PDF
ドメイン駆動設計という仕事の流儀
PDF
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
PPTX
ドメイン駆動設計の学習曲線とブレークポイント
PDF
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
PDF
ドメイン駆動で開発する ラフスケッチから実装まで
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
PDF
ドメイン駆動設計 の 実践 Part3 DDD
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
ちいさなオブジェクトでドメインモデルを組み立てる
正しいものを正しく作る塾-設計コース
PostgreSQLアンチパターン
ソフトウェア開発のやり方の改善
世界一わかりやすいClean Architecture
3週連続DDDその1 ドメイン駆動設計の基本を理解する
ドメインロジックの実装方法とドメイン駆動設計
オブジェクト指向できていますか?
ドメイン駆動設計の正しい歩き方
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
オブジェクト指向エクササイズのススメ
ドメイン駆動設計という仕事の流儀
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインオブジェクトの見つけ方・作り方・育て方
ドメイン駆動設計の学習曲線とブレークポイント
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
ドメイン駆動で開発する ラフスケッチから実装まで
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
ドメイン駆動設計 の 実践 Part3 DDD
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ちいさなオブジェクトでドメインモデルを組み立てる

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

PDF
ビジネスルールの複雑さに立ち向かう
PDF
ドメイン駆動設計という設計スタイル
PDF
ドメイン駆動設計入門
PDF
ドメイン駆動設計(DDD)の実践Part2
PDF
DDD 20121106 SEA Forum November
PDF
Phpではじめるオブジェクト指向(公開用)
PDF
リッチなドメインモデル 名前探し
PDF
作業分野 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第10回】
PDF
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
PDF
プログラムの大海に溺れないために
PDF
私がドメイン駆動設計をやる理由
PDF
Intalio japan special cloud workshop
PDF
なぜ、現状の基幹業務システムは、ビジネス環境の変化に迅速に対応できないのか? ~超高速開発ツールの導入が必然である理由~
PDF
スキニーなシステム開発にぴったりの契約形態
PDF
間欠的ビッグバンから継続的リフォームへ(公開版)
PDF
第3回SIA研究会(例会)プレゼン資料
PDF
Agile 459 | 11/17 資料
PDF
ソフトウェアの核心にある複雑さに立ち向かう
PDF
DSL駆動によるクラウド・アプリケーション開発
PDF
「ドメイン駆動設計」の複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう
ドメイン駆動設計という設計スタイル
ドメイン駆動設計入門
ドメイン駆動設計(DDD)の実践Part2
DDD 20121106 SEA Forum November
Phpではじめるオブジェクト指向(公開用)
リッチなドメインモデル 名前探し
作業分野 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第10回】
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
プログラムの大海に溺れないために
私がドメイン駆動設計をやる理由
Intalio japan special cloud workshop
なぜ、現状の基幹業務システムは、ビジネス環境の変化に迅速に対応できないのか? ~超高速開発ツールの導入が必然である理由~
スキニーなシステム開発にぴったりの契約形態
間欠的ビッグバンから継続的リフォームへ(公開版)
第3回SIA研究会(例会)プレゼン資料
Agile 459 | 11/17 資料
ソフトウェアの核心にある複雑さに立ち向かう
DSL駆動によるクラウド・アプリケーション開発
「ドメイン駆動設計」の複雑さに立ち向かう

More from 増田 亨

PDF
事業活動モデル・システム機能モデル・ビジネスロジックの記述
PDF
ドメインオブジェクトの設計ガイドライン
PDF
オブジェクト指向プログラミングの現在・過去・未来
PDF
ドメイン駆動設計 コアドメインを語り合ってみよう
PDF
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
PDF
プロダクトづくりのためのソフトウェア設計スタイル
PDF
ソフトウェア設計の学び方を考える
PDF
マイクロサービス 4つの分割アプローチ
PDF
DDD sample code explained in Java
PDF
アジャイルなソフトウェア設計を目指して
PDF
ドメイン駆動設計をゲーム開発に活かす
PDF
SoR 2.0 summary
PDF
毎日が越境だ!
PDF
SoR 2.0 基幹システムの再定義と再構築
PDF
ドメイン駆動設計とは何か 【入門編】
PDF
ドメイン駆動設計のための Spring の上手な使い方
PDF
越境する情シス:進化可能なアーキテクチャを手に入れる
PDF
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
PDF
現場で役立つシステム設計の原則
PDF
現場で役立つシステム設計の原則
事業活動モデル・システム機能モデル・ビジネスロジックの記述
ドメインオブジェクトの設計ガイドライン
オブジェクト指向プログラミングの現在・過去・未来
ドメイン駆動設計 コアドメインを語り合ってみよう
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
プロダクトづくりのためのソフトウェア設計スタイル
ソフトウェア設計の学び方を考える
マイクロサービス 4つの分割アプローチ
DDD sample code explained in Java
アジャイルなソフトウェア設計を目指して
ドメイン駆動設計をゲーム開発に活かす
SoR 2.0 summary
毎日が越境だ!
SoR 2.0 基幹システムの再定義と再構築
ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計のための Spring の上手な使い方
越境する情シス:進化可能なアーキテクチャを手に入れる
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則

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


[8]ページ先頭

©2009-2025 Movatter.jp