Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Clean Architecture

Avatar for r-hagihara-max r-hagihara-max
November 07, 2025
58

Clean Architecture

クリーンアーキテクチャ勉強会資料

Avatar for r-hagihara-max

r-hagihara-max

November 07, 2025
Tweet

Transcript

  1. 本日の流れ  事前準備  クリーンアーキテクチャの基礎を理解  ソフトウェアアークテクチャとは  ソフトウェアアーキテクチャの目的 

    DDD、ドメインモデリングとは  クリーンアーキテクチャとは  SOLID原則1つずつ解説  どんな原則か  悪いコードを見てみる  修正方針  Q&Aで理解を深める  ぐちゃぐちゃコードをクリーンなコードにするワーク
  2. Speaker Profile  株式会社Digeon 2025年6月入社  氏名:萩原里菜(29)  PM兼開発者 

    仕事で使っている言語:Go、React等  家族:双子の弟・父・母・祖母・19さいのといぷー  趣味:ボードゲーム、旅行、お笑いラジオ、映画  X(Twitter):@fjwmmlb25  Zenn:https://zenn.dev/h4gi
  3. DDD、ドメインモデリングとは(シンプルに)  ドメインとは ソフトウェアが解決しようとしている、業務の領域のこと  DDD(ドメイン駆動設計)とは ドメインをソフトウェアの中心に添えてシステムを構築する設計手法 ドメイン駆動設計の主な目的は、ビジネスの本質(ドメイン)を深く理解し、それをソフトウェアに適切に反映させる こと 

    ドメインモデリングとは 業務用語やルールを整理し、エンティティや値オブジェクトに分け、関連や振る舞い(メソッド)を設計すること 基本的に、ドメインエキスパートとエンジニアが一緒に行うことを前提としており、「作ろうとしているシステムについて、ビ ジネスサイドとエンジニアサイドが、共通認識を持ち、意思疎通する」ことを可能にする
  4. クリーンアーキテクチャ  Enterprise Business Rules ビジネスルールを表現する層  Application Business Rules

    ユーザーの行動(ユースケース)を表現する層  Interface Adapters データをユースケースやエンティティで扱える形に変換する層  Frameworks and Drivers データベースやUIなど、外部の技術的な詳細を担当する層
  5. 「変更に強いソフトウェア設計」を行うコツとしてRobert C. Martin という開発者が提唱した5つの原則  単一責任の原則:Single Responsibility Principle  オープン・クローズドの原則:Open-Closed

    Principle  リスコフの置換原則:Liskov Substitution Principle  インターフェイス分離の原則:Interface Segregation Principle  依存関係逆転の原則:Dependency Inversion Principle それぞれの頭文字を一文字ずつとって、SOLID原則とよばれる SOLID原則
  6.  不変条件は、派生型でも保護されねばならない。派生型でそのまま維持される。 もし「人」が「年齢は常に 0 以上」 という不変条件を持っているなら、派生クラスの「ティーン」が「年齢は 13〜19 の間でなければならない」と制限を強くしてしまってはいけない。 → 不変条件(Age

    ≥ 0)は、派生型でもそのまま維持されなければならない。  基底型の例外から派生した例外を除いては、派生型で独自の例外を投げてはならない。 もし「ファイル読み込み処理」がFileNotFoundError だけを投げる と契約されているなら、派生クラスの「画像ファ イル読み込み処理」がImageFormatError といった 新しい例外 を投げてしまってはいけない。 → 利用側は「FileNotFoundError だけ来る」と思っているため、新しい例外が来ると正しく扱えなくなる。 LSP:リスコフ置換原則〜例で解説〜
  7.  インターフェースを定義する:EmployeeRepo, LeaveRequestRepo, Notifier, Clock など →上位層(ビジネスロジック)が下位層(DB・SMTPなど)に依存している構造を解消する  ユースケースがインターフェースに依存するようにする 

    実装側でインターフェースを実装する  main.goで依存注入(コンポジションルートとして全層を組み立て) ※コンポジションルート・・・アプリケーション全体の依存関係を「組み立てる(compose)」場所のこと DIP:依存性逆転の原則 〜修正方針〜
  8. 参考記事 ドメインモデリング https://products.sint.co.jp/ober/blog/ddd https://zenn.dev/m10maeda/articles/i-had-domain-driven-design-down-pat ヘキサゴナルアーキテクチャ https://zenn.dev/heyyou/articles/f380adb8d1fe8f https://qiita.com/cocoa-maemae/items/b08c4cf95d47e314e2dc https://www.issoh.co.jp/tech/details/2965/#i-2 オニオンアーキテクチャ https://qiita.com/cocoa-maemae/items/e3f2eabbe0877c2af8d0

    https://qiita.com/GleapPost/items/d58b309315effb0e9515 [DDD]ドメイン駆動設計で実装を始めるのに一番とっつきやすいアーキテクチャは何か #Java - Qiita クリーンアーキテクチャ https://zenn.dev/sre_holdings/articles/a57f088e9ca07d https://www.geeksforgeeks.org/system-design/complete-guide-to-clean-architecture/?utm_source=chatgpt.com https://tech.anycloud.co.jp/articles/clean-architecture/
  9. レイヤードアーキテクチャ  メインの概念 システムを責務ごとに「層」に分け、上位層が下位層に依存する構造。 典型的には「プレゼンテーション層 → アプリケーション層 → ドメイン層 →

    インフラ層」。  メリット 責務の分離により保守性・拡張性が高い 各層ごとにテストが容易 チーム開発時の分担がしやすい 層という一貫した共通のルールがあることで学習コストが低く済む  デメリット ドメインロジックが外部技術に依存してしまう
  10. ヘキサゴナルアーキテクチャ (Ports & Adaptersアーキテクチャ)  ドメイン(内側):変わらない本質(ビジネスルール)  アプリケーション・コア(内側寄り):ユースケースの制御(フロー管理)  ポート(外側):ドメインが外の世界とやり取りするためのインターフェース

    多くのアプリではユーザー側のポートとDB側のポート2種類を持つ  アダプタ(外側):外部をポートに合わせて変換する実装 Inbound Adapter・・・ UIやAPIなど「ドメインを呼び出す側」 Outbound Adapter・・・ DBや外部APIなど「ドメインに呼ばれる側」
  11. オニオンアーキテクチャ  ドメインモデル層:アプリケーションのビジネスドメインを表現 Entity, ValueObjectなど  ドメインサービス層:ビジネスロジックを記述する層 Repositoryインターフェース、ビジネスルール、ドメイン固有のロジック  アプリケーションサービス層:ユースケースを表現

    ドメインサービスのインターフェースを順次呼び出す  インフラストラクチャー層:外部システムとの連携を担当 Repositoryの実装クラス、外部API、データベースへのアクセス  プレゼンテーション層:APIのリクエスト・レスポンスに責任を持つ 入力値の検証とドメインモデルへの変換する