タグ

DDDに関するfbisのブックマーク (33)

  • DDD以外の設計手法についてご教示いただきたく、DDDの主張をある程度正確に理解した上でDDDをこき下ろしているイメージの強いくまぎさんに質問させていただきました。 最近はソフトウェアの設計について調べると、DDDについての記事ばかりで辟易する一方、私がエンジニアになった頃にDDDに勢いがあった影響もあって私自身DDD以外の良い設計とされているものを知らず、DDDに胡散臭さを感じつつもDDDの考え方にとらわれている、毒親の影響を受けた子供のような状態から抜け出せずにいます。 その最たる例がリポジトリパター

    DDD以外の設計手法についてご教示いただきたく、DDDの主張をある程度正確に理解した上でDDDをこき下ろしているイメージの強いくまぎさんに質問させていただきました。 最近はソフトウェアの設計について調べると、DDDについての記事ばかりで辟易する一方、私がエンジニアになった頃にDDDに勢いがあった影響もあって私自身DDD以外の良い設計とされているものを知らず、DDDに胡散臭さを感じつつもDDDの考え方にとらわれている、毒親の影響を受けた子供のような状態から抜け出せずにいます。 その最たる例がリポジトリパターンです。 よく依存性の逆転・DIと一緒に語られますが、くまぎさんがおっしゃる通り余計にインターフェースを切るのはイケてないと感じます。また、DI抜きにしても、リポトリパターン由来の様々な問題(N+1やバルクアップデート、管理画面用のメソッド生やしたくなる問題など)に対する解決策として提示さ

    DDD以外の設計手法についてご教示いただきたく、DDDの主張をある程度正確に理解した上でDDDをこき下ろしているイメージの強いくまぎさんに質問させていただきました。 最近はソフトウェアの設計について調べると、DDDについての記事ばかりで辟易する一方、私がエンジニアになった頃にDDDに勢いがあった影響もあって私自身DDD以外の良い設計とされているものを知らず、DDDに胡散臭さを感じつつもDDDの考え方にとらわれている、毒親の影響を受けた子供のような状態から抜け出せずにいます。 その最たる例がリポジトリパター
  • ドメインモデリングで全システムの設計をゼロからやり直す。リアーキテクチャに挑む2年間の全貌【モノタロウCTO普川】 | レバテックラボ(レバテックLAB)

    株式会社MonotaRO CTO 普川 泰如 慶應義塾大学環境情報学部卒業。SIer企業を経て2009年にオイシックス・ラ・大地に入社し、2016年にシステム副部長に就任。2019年にモノタロウに参画。2021年1月にECシステムエンジニアリング部門長、2022年4月に執行役CTO/VPoEに就任。 X 多くの企業で、10年以上前に開発されたシステムが、事業拡大に伴い続々と限界を迎え、リアーキテクチャに取り組み始めています。 間接資材のネット販売ビジネスを展開するモノタロウ社もその1つです。約20年前の創業期から内製で開発してきたモノリシックなシステムは、事業成長とともに度重なる機能追加を経て、2015年頃にはコードの変更すら容易にできない状態に。一度はパッケージシステムの導入も試みますが、2022年頃から、再度内製開発による抜的なリアーキテクチャに取り組んでいます。 今回のリアーキテ

    ドメインモデリングで全システムの設計をゼロからやり直す。リアーキテクチャに挑む2年間の全貌【モノタロウCTO普川】 | レバテックラボ(レバテックLAB)
  • 【DDD入門】TypeScript × ドメイン駆動設計ハンズオン

    TypeScriptとドメイン駆動設計(DDD)を組み合わせ、APIを構築するハンズオンガイドです。このでは、DDDとは何かという基礎的なところからソフトウェア開発における戦略的設計、戦術的設計まで、包括的な知識を提供します。 戦略的設計では、ビジネスの要求に合わせたドメインモデルの設計をイベントストーミングを用いて行います。その後、戦術的設計では、具体的なコードの実装に関連するDDDの原則と実践を学びます。 TypeScriptを使ってコードを書きながら、DDDの概念を実際のプロジェクトに適用するヒントを紹介します。

    【DDD入門】TypeScript × ドメイン駆動設計ハンズオン
  • DDDはなぜ難しいのか / 良いコードの定義と設計能力の壁

    "Object-Oriented Conference 2024" の登壇資料です。 https://ooc.connpass.com/event/305241/

    DDDはなぜ難しいのか / 良いコードの定義と設計能力の壁
  • DDDの実装にはあまり興味がなくなっている - Mitsuyuki.Shiiba

    以前は、DDDでどう実装したらいいかなぁって考えてたんだけど、最近は、そういうことへの興味があまりなくなっている。エンティティや値オブジェクト、集約やリポジトリなど、そのあたりにあまり興味がない。ヘキサゴナルアーキテクチャなども、そんなに考えなくなった。 TypeScriptを使うことが多いので、型でしっかり守るとかカプセル化するとか、そのあたりがどっちでもいっかという気持ちになっていることが影響してるとは思う。TypeScriptでクラスを使おうとはあまり思わないし。BrandedTypeみたいなのを使ってまで型で守ろうとは思わない。 じゃあ何に興味があるんだっけ?って考えてみると、トランザクション境界とユビキタス言語かな。 トランザクション境界 トランザクションの境界を作って、DBRDBMS)を小さく保ちたいと思っている。DBが大きくなると、すぐに複雑になっていく感じがする。 だから

    DDDの実装にはあまり興味がなくなっている - Mitsuyuki.Shiiba
  • エラーハンドリングをクリーンアーキテクチャで書く場合に意識すること

    はじめに 業務においてクリーンアーキテクチャを意識してコードを日々書いていますが、「これってクリーンアーキテクチャの考えに沿うためにはどう書けば良いんだろう」と悩むことがあります。 今回はエラーハンドリングについて、クリーンアーキテクチャに則って考えてみたいと思います。 あくまで筆者一個人のいわゆる「ぼくのかんがえたさいきょうのエラーハンドリング」なのでエラーハンドリング時の一意見として参考になれば幸いです。 想定読者 Webのバックエンド開発においてクリーンアーキテクチャを意識してコードを書いているがエラーハンドリングに悩んでいる人 エラーハンドリングをするメリットを知りたい人 まとめ 基的には型で例外をハンドリングするべきなので自作型を作ろう ドメイン層にHttpExceptionを書くな ドメイン層はプレゼンテーション層を意識しないため、エラーメッセージをAction層でコントロー

    fbis
    fbis 2023/08/22
  • 【Go】DDD + レイヤードアーキテクチャでREST APIを実装する | みんたく

    Go + DDD + レイヤードアーキテクチャをやネットで調べ、実際に動かしながらREST APIを構築してみました。 ドメイン駆動設計のや記事を読んでも実際に自分の手でやってみないと身につかないと思い、簡易的ですが使えるところまで実装してみました。 DDD(domain driven design)とはDDD(ドメイン駆動設計)とはソフトウェアの設計手法であり、ドメインモデリングに着目してソフトウェアの価値を高める手法です。 ソフトウェアの核心にある複雑さに立ち向かうため、チームの共通言語である「ユビキタス言語」を用いて「ドメインモデル」を構築し、それをコードとして実装します。 また、大規模で密結合なシステムにならないように「ドメイン」と「境界づけられたコンテキスト」にシステムを分割し、「コアドメイン」という最重要領域に集中して開発を行います。 DDDについてはまだ理解が浅いので、今

    【Go】DDD + レイヤードアーキテクチャでREST APIを実装する | みんたく
  • Chat GPT-4にDDDのドメインモデルを考えさせたら凄かった件

    株式会社モアで、バックエンド兼インフラエンジニアのrevenue-hackです! DDD(ドメイン駆動設計)でドメインモデル考えますよね? その時にGPT-4にやってもらったらどうなんだろう?とふと思い、実際にユースケースからドメインモデルを作ってもらいました! ↓記事移行しました!↓ AI駆動開発&設計に力を入れていて、 弊社では適宜エンジニアを募集しているので、興味のある方はご連絡ください! 株式会社モア

    Chat GPT-4にDDDのドメインモデルを考えさせたら凄かった件
    fbis
    fbis 2023/04/10
  • 新卒にも伝わるドメイン駆動設計のアーキテクチャ説明[DDD] - little hands' lab

    ドメイン駆動設計で実装を始めるのに一番とっつきやすいアーキテクチャは何か ドメイン駆動 + オニオンアーキテクチャ概略 以前こちらの記事でアプリケーションアーキテクチャについて書きました。 こちらの記事では比較的ネタ元に忠実な解説をしたのですが、実際これに基づいて人にレイヤの説明をした際、依存性の逆転部分や円形で表現する部分がなかなか伝わりにくいことがありました。 そんな中で、所属プロダクトで新卒含めて大規模なリニューアル案件でDDDを採用することになり、新卒にも伝わるように説明をする必要性が生じました。 結果、新卒にも伝わり、運用が割と回る説明が見つかったのでご紹介したいと思います。 アプリケーションアーキテクチャ全体図 とにかく、何か説明する際はこの図を常に傍に置き、一方通行の依存性を徹底したい、という話をしています。 何かについて議論をする際は、 「それはどの層の責務なの?」 という

    新卒にも伝わるドメイン駆動設計のアーキテクチャ説明[DDD] - little hands' lab
    fbis
    fbis 2023/03/29
  • DDDの一般的なアーキテクチャをまとめてみた

    はじめに 久しぶりの投稿ですが、仕事の中でDDDに関連したアーキテクチャを整理する機会があったので、改めて知識の整理のためにまとめておきたいと思います。 一般的なWebアプリケーションのアーキテクチャ(3層アーキテクチャ) 矢印の方向に依存していきます。 一般にこの依存関係を持ってwebアプリケーションは作られますが、ビジネスロジック層が肥大化する傾向が多いです。 それぞれの層を言語化すると以下のようになります。 プレゼンテーション層 = クライアントとの入出力をする層 ビジネスロジック層 = ビジネスロジックの実現をする層 データアクセス層 = データベースとの入出力をする層 問題点 その中でビジネスロジック層は、そもそもビジネスロジックが複雑になりがちなため、うまく設計ができずに、メンテナンス性の悪い、所謂神クラスの氾濫(xxxService、xxxManager)が起こりがちです。

    DDDの一般的なアーキテクチャをまとめてみた
  • DDD - 仕様パターンの紹介 - yujiro's blog

    DDD には仕様パターンというものが存在する。 仕様パターンは、 バリデーションなどの評価処理 リポジトリと組み合わせたフィルタリング機能 この2つに使われる事が多い。 評価処理 評価処理とは、オブジェクトがある基準に達しているのか評価する 処理である。 定義した評価ロジックは、バリデーションの際に使用されることが多くなるだろう。 ドメインオブジェクトへの実装 真っ先に思い浮かぶのは、これをドメインオブジェクトに実装する方法だ。 例として、高校のWEBシステムにおいて、 「模試の申し込みは2,3年生の特進クラスの生徒しかできない」 というバリデーションロジックをドメインオブジェクトに実装してみよう。 class Student { ... private val birthday: Date private val classId: Int fun canApplyPracticeExam

    DDD - 仕様パターンの紹介 - yujiro's blog
    fbis
    fbis 2023/03/13
  • DDDを実践するための手引き(リポジトリパターン編)

    以前DDDの入門記事を書いたのですが、ここではリポジトリパターンについて深掘って取り上げます。続編ぽいタイトルですが、そんなにつながりはないのでコレ単体で読めます。 はじめに リポジトリパターンは、DDDで有名になった、ドメインモデルの永続化のためのデザインパターンです。 今やいろいろなところで「Repository」という名前を冠するクラスを目にするようになりましたが、誤解されたり誤用されることも多くあります。 ここではリポジトリパターンの意図や質を理解することを目指します。リポジトリパターンには役立つ考え方が詰まっているので、このパターンを採用しなくても知っておくときっと役に立つと思います。 なお実装例はKotlinで書きますが、オブジェクト指向の言語であればだいたい同じ感じです。 リポジトリ(Repository)とは? 日語訳は「保管庫」です。オブジェクトを保管しておき、必要な

    DDDを実践するための手引き(リポジトリパターン編)
  • DDDの「集約」コードを見れば一発でわかります。自信があるから見てほしい。 - ドメイン駆動設計

    fbis
    fbis 2023/02/24
  • 「DDDで複数集約間の整合性を確保する方法 Rev2」に対する考察 - かとじゅんの技術日誌

    どうも、かとじゅんです。 松岡さん(id:little_hands)が以下の記事を更新されたそうです。松岡さん自身が悩まれた中で検討したオプションであって、唯一の正解ではないと踏まえたうえで、率直な感想を述べたいと思います。結論からいうと、論旨は前回の記事と変わりませんが、コード例で具体的な考え方を示している点を工夫しています。 little-hands.hatenablog.com 前回の考察記事も古くなったので、最新の記事に併せて考察をまとめ直したいと思います。 blog.j5ik2o.me ドメインモデル ドメインモデル図が追加されていますね。以下の3つの集約があるそうです。「一つの集約にまとめればいいよね」という提案はなしという前提で考えます。 ユーザー タスク アクティビティ・レポート 「アクティビティ・レポート」は「タスク」もしくは「ユーザー」に関連を持つようです。 「これらの

    「DDDで複数集約間の整合性を確保する方法 Rev2」に対する考察 - かとじゅんの技術日誌
    fbis
    fbis 2023/02/24
  • 「DDDで複数集約間の整合性を確保する方法」に対する考察 - かとじゅんの技術日誌

    久しぶりにブログ記事を書きますか。 ということで、松岡さん(id:little_hands)のブログ記事に対する考察記事です。 この記事は古くなったので、ぜひ以下も参照してください。 blog.j5ik2o.me little-hands.hatenablog.com 題材も松岡さんのブログ記事と同じもので考えます。 「実装方法1. ユースケースで複数集約を更新する」について考察したいと思います。 注意事項)この記事で使うトランザクションという用語は単なる一連の手続きという意味ではなく、ACID特性を持つRDBのトランザクションという意味です。 class CreateTaskUseCase1( private val taskRepository: TaskRepository, private val taskReportRepository: TaskReportRepository

    「DDDで複数集約間の整合性を確保する方法」に対する考察 - かとじゅんの技術日誌
    fbis
    fbis 2023/02/24
  • Goでエンティティを実装(「ドメイン駆動設計入門」Chapter3)

    概要 戦術的 DDD の実装パターンを Go で実装します。 今回は、「ドメイン駆動設計入門」Chapter3 のエンティティ(Entity)の実装をします。 実装したソースコードは以下です。 参考にしたサンプルコードは以下です。 エンティティ まず、エンティティについて説明します。 「ドメイン駆動設計入門」ではエンティティの性質を以下のように解説されていました。 可変である 同じ属性であっても区別される 同一性により区別される 出典:ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基 Chapter3 可変であると記述されていますが、以下のことも記述されています。 但し、すべての属性を必ず可変にする必要はありません。エンティティはあくまでも、必要に応じて属性を可変にすることが許可されているに過ぎません。可変なオブジェクトは基的には厄介な存在です。可能な限り不変にしておく

    Goでエンティティを実装(「ドメイン駆動設計入門」Chapter3)
    fbis
    fbis 2023/01/17
  • 境界づけられたコンテキスト 概念編 - ドメイン駆動設計用語解説 [DDD] - little hands' lab

    境界づけられたコンテキストとは 公式DDD Referenceの定義は以下の通りです。(和訳はだいぶ意訳しています) bounded context A description of a boundary (typically a subsystem, or the work of a particular team) within which a particular model is defined and applicable. 境界づけられたコンテキスト 特定のモデルを定義・適用する境界を明示的に示したもの。 代表的な境界の例は、サブシステムやチームなど。 まぁなかなかよくわからないですよね。DDD用語の中でもかなり難解なワードです。 境界づけられたコンテキストは、2つの観点から解説が必要でしょう。 ・概念としての境界づけられたコンテキスト ・境界づけられたコンテキストをどう実装に

    境界づけられたコンテキスト 概念編 - ドメイン駆動設計用語解説 [DDD] - little hands' lab
  • DDDにおける値オブジェクトの位置付け(モデルとコード事例あり)[ドメイン駆動設計] - little hands' lab

    株式会社ログラスの松岡(@little_hand_s)です。 最近、値オブジェクトに関して書かれているブログ記事を見ますが、 SNSなどにおいてDDDにおける値オブジェクトについて誤解されているような反応が見受けられました。 そこで、この記事では「DDDにおける値オブジェクトの位置付け」について解説し、具体的なモデル・コードを用いながら誤解を解いていきたいと思います。 なお、値オブジェクトに関する詳細な説明はここでは行いませんのでご了承下さい。 DDDの目的 まず最初に、DDDの目的について確認します。 DDDの目的は、モデリングを通じてソフトウェアの価値を大きくすることです。 これに関しては、こちらの記事で詳細に解説しているのでこちらをご覧ください。 ドメイン駆動設計は何を解決しようとしているのか - little hands' lab ここで大切なのは、モデルは一回のモデリングで完成形

    DDDにおける値オブジェクトの位置付け(モデルとコード事例あり)[ドメイン駆動設計] - little hands' lab
  • Value Object (値オブジェクト) でリファクタリングしたら結構良かった

    ドメイン分析とモデル化ここで「モデル化」と呼ぶのは、実装者が理解しやすいように重要な側面に注目して、端的な形に抽象化する行為であると定義します。 また、実際に実務で行なっている自身のモデル化を行う時の書き振りを近しく再現(中身は変更)しているため、わかりづらいかもしれませんが、”実務ではこうやっている” というのを理解していただければ。 先の要件を整理すると、数という概念に金額とポイントという2つのドメインモデルが含まれる。 金額とポイントという異なる概念を計算して最終的に獲得ポイント数を導き出す必要がある。 存在する制約 金額が負の数になることはありえない。ポイントが負の数になることはありえない。金額は日円のみを考慮し、外貨は存在しない。ポイントは文脈によって呼び名が変わるが、単位は変わらない。支払い金額合計以上にポイント利用数が設定されることはない。金額に小数点は存在しない。ポイント

    Value Object (値オブジェクト) でリファクタリングしたら結構良かった
  • ドメインロジックとSQL - Martin Fowler's Bliki (ja)

    以下の文章は、Martin Fowler による Domain Logic and SQLの日語訳である。 データベース指向ソフトウェア開発者とメモリ上(in-memory)アプリケーションソフトウェア開発者との間のギャップは、ここ数十年、徐々に広がってきている。このギャップが原因で、データベースの機能(SQLやストアドプロシージャ)をどのように扱えばよいのかという議論が数多く巻き起こっている。ここでは、ビジネスロジックを SQL に置くべきか、それともメモリ上のコードに置くべきかといった問題について、主にパフォーマンスと更新性の観点から考察を行う。考察には簡単な例を使うが、SQL クエリはしっかりとしたもの(rich SQL queries)を用いるので悪しからず。 エンタープライズアプリケーション(訳注:以下、EA)構築に関する(私の近著『P of EAA』など)を読むと、ロジック

    fbis
    fbis 2022/06/06