<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>「依存性の注入」タグの記事一覧Python Tech</title>
	<atom:link href="https://tech.nkhn37.net/tag/dependency-injection/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Sun, 07 Dec 2025 08:44:59 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.4</generator>

<image>
	<url>https://tech.nkhn37.net/wp-content/uploads/2021/01/cropped-lion-normal-clear-1-32x32.png</url>
	<title>「依存性の注入」タグの記事一覧Python Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>クリーンアーキテクチャ概要</title>
		<link>https://tech.nkhn37.net/clean-architecture-basics/</link>
					<comments>https://tech.nkhn37.net/clean-architecture-basics/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Fri, 05 Dec 2025 20:00:00 +0000</pubDate>
				<category><![CDATA[クリーンアーキテクチャ]]></category>
		<category><![CDATA[SOLID原則]]></category>
		<category><![CDATA[ドメイン駆動設計]]></category>
		<category><![CDATA[依存性の注入]]></category>
		<category><![CDATA[依存性逆転の原則]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=12966</guid>

					<description><![CDATA[ソフトウェアアーキテクチャの 1 つとして有力な設計手法・アーキテクチャパターンであるクリーンアーキテクチャの概要を解説します。 クリーンアーキテクチャの概要 クリーンアーキテクチャとは クリーンアーキテクチャとは、Ro [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">ソフトウェアアーキテクチャの 1 つとして有力な設計手法・アーキテクチャパターンである<span class="jinr-d--text-color d--marker1 d--bold">クリーンアーキテクチャ</span>の概要を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">クリーンアーキテクチャの概要</h2>



<h3 class="wp-block-heading jinr-heading d--bold">クリーンアーキテクチャとは</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">クリーンアーキテクチャ</span>とは、Robert C. Martin（Uncle Bob）氏が提唱した、ソフトウェアの設計手法・アーキテクチャパターンの 1 つです。</p>



<p class="wp-block-paragraph">クリーンアーキテクチャの主な目的は、以下です。</p>



<ol class="wp-block-list jinr-list">
<li>疎結合になり、テストしやすい。</li>



<li>技術選択を後から変更しやすい。</li>



<li>ドメインのロジックの見通しがよくなる。</li>



<li>大規模・長期プロジェクトで特に力を発揮する。</li>
</ol>



<p class="wp-block-paragraph">クリーンアーキテクチャの考え方を採用することで「<span class="jinr-d--text-color d--marker1 d--bold">変更に強く、テストしやすく、長期運用に耐えうるシステム</span>」を作ることが可能になります。</p>



<p class="wp-block-paragraph">この記事では、クリーンアーキテクチャの概要について紹介します。</p>





<h2 class="wp-block-heading jinr-heading d--bold">クリーンアーキテクチャの基礎となる 4 層</h2>



<p class="wp-block-paragraph">クリーンアーキテクチャ では、<span class="jinr-d--text-color d--marker1 d--bold">エンティティ (Entities)</span> / <span class="jinr-d--text-color d--marker1 d--bold">ユースケース (Use Cases)</span> / <span class="jinr-d--text-color d--marker1 d--bold">インターフェースアダプター (Interface Adapters)</span> / <span class="jinr-d--text-color d--marker1 d--bold">フレームワークとドライバー (Frameworks &amp; Drivers)</span> という 4 つの代表的な層（レイヤ）があります。</p>



<p class="wp-block-paragraph">クリーンアーキテクチャは、以下のような図で表現されます。まずは、それぞれの層について概要を説明していきます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img fetchpriority="high" decoding="async" width="1024" height="566" src="https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-1024x566.png" alt="クリーンアーキテクチャ概要図" class="wp-image-12985" srcset="https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-1024x566.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-300x166.png 300w, https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-768x424.png 768w, https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2.png 1224w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">クリーンアーキテクチャ概要図</figcaption></figure>
</div>


<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox1 ">
			<i class="jif jin-ifont-v2bulb" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">上記図はクリーンアーキテクチャの説明で使われる代表的な層（レイヤ）を表します。クリーンアーキテクチャの層（レイヤ）の数は状況に応じて変わっても問題はありません。どういった考え方が軸となっているのかという本質を理解することに重点をおいてみてください。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">エンティティ (Entities)</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">エンティティ (Entities)</span> は、企業のビジネスルールのデータをまとめてカプセル化したデータ構造のことを言います。このエンティティは、メソッドを持ったオブジェクトなどであり、企業の様々なアプリケーションから利用されるものです。</p>



<p class="wp-block-paragraph">機能の追加や UI の変更があっても、ビジネス上で中核となるデータ構造は比較的安定しているため、エンティティは外側の変更の影響を受けにくい層になります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">ユースケース (Use Cases)</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">ユースケース (Use Cases)</span> は、アプリケーション固有のビジネスルールを定義する層です。ユースケースでは、エンティティのデータをもとに目的を達成するための機能を実装します。</p>



<p class="wp-block-paragraph">この層は、データベースや UI、その他のフレームワークといった外部の変更から影響を受けることはありません。例えば、データベースが Oracle だとしても、PostgreSQL であったとしても、その上でユースケースとして実装する機能にとってはどちらでもいいのです。</p>



<p class="wp-block-paragraph">ただし、アプリケーションの画面などの操作変更により、ユースケースに手を加えなければいけないということはあり得ます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">インターフェースアダプター (Interface Adapters)</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">インターフェースアダプター (Interface Adapters)</span> は、エンティティやユースケースにとって便利なデータフォーマットと、データベースや UI などにとって便利なフォーマットとの間の変換をするためのアダプターです。</p>



<p class="wp-block-paragraph">インタフェースアダプター層が変換を担うため、ユースケースの層では、外部のデータ構造を意識する必要がなくなります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">フレームワークとドライバー (Frameworks &amp; Drivers)</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">フレームワークとドライバー (Frameworks &amp; Drivers)</span> は、円の最も外側で最も詳細な部分です。これらは、DB や UI 等の外部インターフェースに関する機能です。</p>



<p class="wp-block-paragraph">例えば、DB アクセス用のライブラリやデバイスのための制御プログラムなどがこの層に該当します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">SOLID 原則とクリーンアーキテクチャ</h2>



<h3 class="wp-block-heading jinr-heading d--bold">SOLID 原則</h3>



<p class="wp-block-paragraph">クリーンアーキテクチャを理解する上で重要な原則に「<span class="jinr-d--text-color d--marker1 d--bold">SOLID 原則</span>」があります。SOLID とは、Robert C. Martin（Uncle Bob）氏が提唱した 保守性と拡張性の高い設計を行うための 5 つの原則 をまとめたものです。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>原則</th><th>名称</th><th>概要</th></tr></thead><tbody><tr><td>S</td><td>単一責任の原則<br>(SRP: Single Responsibility Principle)</td><td>各モジュールを変更する理由がたった 1 つだけになるようにすること</td></tr><tr><td>O</td><td>開放閉鎖の原則<br>(OCP: Open-Closed Principle)</td><td>既存のコード変更よりも新しいコードの追加によってシステムの変更ができるようにすること</td></tr><tr><td>L</td><td>リスコフの置換原則<br>(LSP: Liskov Substitution Principle)</td><td>インターフェースで抽象化されたコンポーネントで安全に交換可能となっていること</td></tr><tr><td>I</td><td>インターフェース分離の法則<br>(ISP: Interface Segregation Principle)</td><td>用途ごとにインターフェースが分離して定義されていること</td></tr><tr><td>D</td><td>依存性逆転の原則<br>(DIP: Dependency Inversion Principle)</td><td>上位レベルの実装コードが下位レベルの詳細の実装コードに依存するのではなく、逆に詳細側が上位の方針に依存するべきであること</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">各原則の細かな説明についてはしませんが、SOLID 原則の中でもクリーンアーキテクチャで特に重要な原則である「<span class="jinr-d--text-color d--marker1 d--bold">依存性逆転の法則 (DIP)</span>」については、この記事で考え方を紹介します。</p>



<p class="wp-block-paragraph">その他の設計原則については、書籍「<strong>Clean Architecture 達人に学ぶソフトウェアの構造と設計</strong>」を参考にしてください。</p>





<h3 class="wp-block-heading jinr-heading d--bold">クリーンアーキテクチャで特に重要な依存性の方向（DIP)</h3>



<p class="wp-block-paragraph">上記で紹介した SOLID 原則は、いずれも重要な設計原則ですが、その中でもクリーンアーキテクチャを考えるうえで特に重要な原則が「<span class="jinr-d--text-color d--marker1 d--bold">依存性逆転の原則 (DIP: Dependency Inversion Principle)</span>」です。以降、DIPと略します。</p>



<p class="wp-block-paragraph">プログラミングでは、何も考えずに実装を始めると図でいう外側に依存するようなプログラミングをよくしてしまいます。しかし、DIP では、依存の向きを図における内側、つまり Entities 方向に向けることが重要であると言っています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img fetchpriority="high" decoding="async" width="1024" height="566" src="https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-1024x566.png" alt="クリーンアーキテクチャ概要図" class="wp-image-12985" srcset="https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-1024x566.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-300x166.png 300w, https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2-768x424.png 768w, https://tech.nkhn37.net/wp-content/uploads/2025/11/image-2.png 1224w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">クリーンアーキテクチャ概要図（再掲）</figcaption></figure>
</div>


<p class="wp-block-paragraph">依存方向とは、「どちらの変更がどちらに影響するか」を示します。Python を例にすると A が B をインポートしているとき、A は B の変更の影響を受けるため A は B に依存していると言います。矢印としては A → B となります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import module</pre>



<p class="wp-block-paragraph">例えば、上記例のように <code>module</code> モジュールをインポートしているプログラムは <code>module</code> に依存します。これは <code>module</code> での変更が当該プログラムに影響を与える可能性があるということです。</p>



<p class="wp-block-paragraph">クリーンアーキテクチャにおいては、Entities や UseCases といった、企業のビジネスルールやアプリケーションのルールが、詳細である外側の層から影響を受けてはいけないということを言っています。</p>



<p class="wp-block-paragraph">なかなかイメージが難しいと思いますので、DIP に反する依存関係の例と DIP に従っている例を見ながら考えてみましょう。</p>



<h4 class="wp-block-heading jinr-heading d--bold">DIP に反する依存関係の例</h4>



<p class="wp-block-paragraph">以降では、ユーザー情報を DB に登録するような例を使って紹介していきます。まずは、依存関係が DIP に反する例を見てみましょう。</p>



<p class="wp-block-paragraph">以下は、ユーザー情報を定義した <code>User</code> クラスがあり、<code>CreateUserUseCase</code> クラスで PostgreSQL にユーザー登録している場合です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="281" height="461" src="https://tech.nkhn37.net/wp-content/uploads/2025/12/1d931945afab52005feda92764e7bf93.webp" alt="依存性逆転の原則 (DIP) に反する例" class="wp-image-13109" srcset="https://tech.nkhn37.net/wp-content/uploads/2025/12/1d931945afab52005feda92764e7bf93.webp 281w, https://tech.nkhn37.net/wp-content/uploads/2025/12/1d931945afab52005feda92764e7bf93-183x300.webp 183w" sizes="(max-width: 281px) 100vw, 281px" /></figure>
</div>


<p class="wp-block-paragraph">この例では、<code>CreateUserUseCase</code> → <code>PostgreSqlUserRepository</code> → <code>PostgreSqlDriver</code> というように内側から外側に向かう依存関係となっています。</p>



<p class="wp-block-paragraph">この場合、<code>PostgreSqlDriver</code> が変更されると <code>PostgreSqlUserRepository</code> の変更が必要になる可能性があり、その次には、<code>CreateUserUseCase</code> クラスの実装まで変更が波及する可能性があります。</p>



<p class="wp-block-paragraph">詳細である DB 管理が変更されても、ユースケース自体が何も変更されているわけでもないのにプログラムの修正が必要になってしまうかもしれないわけです。</p>



<h4 class="wp-block-heading jinr-heading d--bold">依存関係の理想（DIP）</h4>



<p class="wp-block-paragraph">では、次に DIP がどのようにこの問題を解決するのかを見てみましょう。以下が、DIPを考慮した場合のクラス図の例です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="281" height="621" src="https://tech.nkhn37.net/wp-content/uploads/2025/12/1c720fc8731b185e7b3df727f878a436.webp" alt="依存性逆転の原則 (DIP) の例" class="wp-image-13110" srcset="https://tech.nkhn37.net/wp-content/uploads/2025/12/1c720fc8731b185e7b3df727f878a436.webp 281w, https://tech.nkhn37.net/wp-content/uploads/2025/12/1c720fc8731b185e7b3df727f878a436-136x300.webp 136w" sizes="(max-width: 281px) 100vw, 281px" /></figure>
</div>


<h5 class="wp-block-heading jinr-heading d--bold">抽象化されたインターフェース</h5>



<p class="wp-block-paragraph">DIP でポイントとなるのは、抽象化されたインターフェースの使用です。</p>



<p class="wp-block-paragraph">例では、UseCases 層で Interface Adapters 層 で実装するべきインターフェース (<code>UserRepository</code>) を定義します。Interface Adapters 層側では、そのインターフェースに従うように <code>PostgreSqlUserRepository</code> の具体的な実装を行います。UseCases 層では、<code>CreateUserUseCase</code> → <code>UserRepository</code> に依存（矢印）が向いているように、具体的な実装ではなく抽象化されたインターフェースに依存します。</p>



<p class="wp-block-paragraph">同様に、Interface Adapters 層でもインターフェース (<code>DbDriver</code>) を定義し、Frameworks &amp; Drivers 層の <code>PostgreSqlDriver</code> が、そのインターフェースに従って具体的な実装を行います。<code>PostgreSqlUserRepository</code> は 抽象化されたインターフェースである <code>DbDriver</code> に依存します。 </p>



<p class="wp-block-paragraph">この例で、各層の間の矢印を確認してみてください。先ほどの DIP に反した例とは依存関係の矢印が逆向きになっています。これが、<span class="jinr-d--text-color d--marker1 d--bold">依存性逆転</span>と言われる理由です。この逆転のためには、抽象化されたインターフェースがポイントとなります。</p>



<h5 class="wp-block-heading jinr-heading d--bold">依存性の注入</h5>



<p class="wp-block-paragraph">DIP での構成が優れているところは、各層が自身の層で定義したインターフェースで定義された機能の仕様のみ知っておけばよいということです。ここで、仕様と言っているのは、例えば、メソッドの引数、戻り値、それらの型だと思ってください。外側の具体的実装は、そのインターフェースに従うように実装されるため、具体的な詳細まで知る必要がありません。</p>



<p class="wp-block-paragraph">例では PostgreSql を想定したクラスを例示していますが、<code>UserRepository</code> というインターフェースに従ったクラス（例えば、<code>OracleUserRepository</code> や <code>MySqlUserRepository</code> など）を作成すれば、そのクラスはインターフェース仕様で決められた引数や戻り値、型を持つ機能を実装しているため、付け替えも容易です。</p>



<p class="wp-block-paragraph">インターフェースを使うため、テスト時にドライバーやスタブを用意しやすい点も重要な特徴です。また、DBMS などの詳細技術が決まっていない段階では、技術の選択を後回しにしてビジネスロジックの開発を進められるという利点があります。</p>



<p class="wp-block-paragraph">内側の関数やメソッドでは、抽象化されたインターフェースを呼び出すように開発されるため、具体的にインスタンス化するクラスを変更するだけで簡単に実装の変更ができます。このようにどの具象クラスを使うかを外側から渡す方法を「<span class="jinr-d--text-color d--marker1 d--bold">依存性の注入（DI: Dependency Injection）</span>」と言います。DI は、DIP の考え方を現実のコードで実現する代表的な手法の 1 つです。</p>



<p class="wp-block-paragraph">例のクラス図での UseCases 層と Interface Adapters 層の間の関係性をイメージして、実際に簡単なコードイメージを見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># interface.py
from abc import ABC, abstractmethod

class UserRepository(ABC):

    @abstractmethod
    def save(self, user_name: str) -> None:
        ...</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># postgresql_repository.py
from interface import UserRepository

class PostgreSqlUserRepository(UserRepository):

    def save(self, user_name: str) -> None:
        print(f"[PostgreSQL] save user: {user_name}")
        # ※本当は具体的な登録処理が実行される</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># usecase.py
from interface import UserRepository

class CreateUserUseCase:

    def __init__(self, repo: UserRepository):
        self.repo = repo  # 抽象に依存

    def execute(self, user_name: str):
        # 具体的なDB処理は知らない
        self.repo.save(user_name)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># main.py
from usecase import CreateUserUseCase
from postgresql_repository import PostgreSqlUserRepository

def main():
    repo = PostgreSqlUserRepository()   # ここで具体を選択（OracleUserRepository に変えれば Oracle に切替が簡単にできる）
    usecase = CreateUserUseCase(repo)   # 依存性の注入（内側へ注入）
    usecase.execute("Taro")

if __name__ == "__main__":
    main()</pre>



<p class="wp-block-paragraph"><code>UserRepository</code> という抽象クラスをインターフェースとして用意し、それを継承して、<code>PostgreSqlUserRepository</code> を作成しています。<code>CreateUserUseCase</code> クラスは実際にユーザーを作成・登録するためのユースケースだと思ってください。 </p>



<p class="wp-block-paragraph">上記でのポイントは、<code>CreateUserUseCase</code> のコンストラクタ <code>__init__</code> が、抽象の <code>UserRepository</code> を引数に取っている点です。これは、ユースケースが、具体的に PostgreSQL を使うのか、Oracle を使うのかといった具体的なことは全く意識していないということを意味しています。</p>



<p class="wp-block-paragraph">具体的にどの実装を使うかはエントリポイントである <code>main</code> 関数で選択しています。<code>CreateUserUseCase</code> のインスタンス化で <code>PostgreSqlUserRepository</code> のインスタンスを渡しています。これが、依存性を注入している部分です。</p>



<p class="wp-block-paragraph">このようにしておくと DB を Oracle に変えたければ、<code>UserRepository</code> を実装した <code>OracleUserRepository</code> を作成し、<code>main</code> 関数でインスタン化するクラスを変えれば、技術の付け替えが完了します。この時には、<code>main</code> 関数のみに変更を加えればよく、 <code>usecase.py</code> を変更する必要が全くないことが非常に重要なことです。</p>



<p class="wp-block-paragraph">上記で見てきたように DIP の考え方に従うロジックの見通しがよくなり、テストがしやすく、技術選択も後から変更しやすいシステムを構築できます。これにより、特に大規模・長期のプロジェクトでは、改修・維持・管理といった負担が軽減されます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">依存関係の現実</h4>



<p class="wp-block-paragraph">DIP の考え方について紹介しましたが、現実の場面では少し柔軟性を持って考える必要が出てくる場合があります。以下は、Frameworks &amp; Drivers の層として、PostgreSQL を扱うためのモジュールである psycopg2 を使っている例です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="282" height="542" src="https://tech.nkhn37.net/wp-content/uploads/2025/12/00391bc22175b43aef49e2653992dfaa.webp" alt="依存性逆転の原則 (DIP) の現実" class="wp-image-13111" srcset="https://tech.nkhn37.net/wp-content/uploads/2025/12/00391bc22175b43aef49e2653992dfaa.webp 282w, https://tech.nkhn37.net/wp-content/uploads/2025/12/00391bc22175b43aef49e2653992dfaa-156x300.webp 156w" sizes="(max-width: 282px) 100vw, 282px" /></figure>
</div>


<p class="wp-block-paragraph">psycopg2 は、コミュニティで開発されているため、自分たちで定義した Interface Adapters 層のインターフェースに従うように機能を実装してもらうことは困難です。そのため、アダプターから psycopg2 への依存はどうしても発生します。</p>



<p class="wp-block-paragraph">ただし、この依存は外側の詳細同士の依存であり、内側の Entity や UseCase からは、psycopg2 が見えていない限り、DIP の本質は守られていると言えます。</p>



<p class="wp-block-paragraph">クリーンアーキテクチャでは、DIP を完全に実現することが目的ではなく、重要なビジネスルール（Entity や UseCase）を外部の詳細から守ることがより重要です。</p>



<p class="wp-block-paragraph">もちろん Frameworks &amp; Drivers 層の機能も自分たちで開発する場合は、DIP に従うように考えるのがベストですが、世の中にある便利なモジュールを使うことは、開発コストを抑えることができて合理的な場合も多くあります。原則にこだわりすぎるのではなく、柔軟な考え方でアーキテクチャを検討するようにしましょう。</p>



<h2 class="wp-block-heading jinr-heading d--bold">ドメイン駆動設計（DDD）との関係</h2>



<p class="wp-block-paragraph">システムの設計では、<span class="jinr-d--text-color d--marker1 d--bold">ドメイン駆動設計（DDD: Domain Driven Design）</span>という設計思想があります。エリック・エヴァンス（Eric Evans）氏が提唱したもので、クリーンアーキテクチャと一緒に語られることが多く、混同されやすいため簡単に整理しておきます。</p>



<p class="wp-block-paragraph">ドメイン駆動設計は、複雑なビジネスドメインをどのように定義し、正しくモデル化することを目的にした設計思想のことです。一方で、クリーンアーキテクチャは、主にソフトウェアをどのような構造で分割するかといった、システムアーキテクチャの設計手法になります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>クリーンアーキテクチャ</th><th>ドメイン駆動設計（DDD）</th></tr></thead><tbody><tr><td>アプリケーションの構造を整理することが目的</td><td>ビジネスドメインを正しく表現することが目的</td></tr><tr><td>層構造や依存方向を重視</td><td>ドメインモデルの表現を重視</td></tr><tr><td>システムアーキテクチャの話</td><td>モデリングの考え方（設計思想）</td></tr><tr><td>多くの種類のアプリケーションに適用しやすい</td><td>大規模・複雑なドメインで特に有効</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ドメイン駆動設計の文脈で出てくる概念をアーキテクチャとして実現する際に、クリーンアーキテクチャの考え方は適用しやすいため、両者は目的は明確に異なりますが、併用されて力を発揮することが多いです。</p>



<p class="wp-block-paragraph">ドメイン駆動設計に関する書籍としては「<strong>エリック・エヴァンスのドメイン駆動設計</strong>」「<strong>ドメイン駆動設計をはじめよう</strong>」「<strong>ドメイン駆動設計入門 ボトムアップでわかる！ドメイン駆動設計の基本</strong>」を参考にしてみてください。</p>









<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">ソフトウェアアーキテクチャの 1 つとして有力な<span class="jinr-d--text-color d--marker1 d--bold">クリーンアーキテクチャ</span>の概要を解説しました。クリーンアーキテクチャの考え方を採用すると変更に強い、長期運用に耐えうるシステムの開発が可能となります。</p>



<p class="wp-block-paragraph">この記事では、クリーンアーキテクチャの基本的な概念である 4 つの層の考え方や、アーキテクチャ設計原則である SOLID 原則を紹介しました。また、設計原則の中でも特に中心となる「<span class="jinr-d--text-color d--marker1 d--bold">依存性逆転の原則 (DIP: Dependency Inversion Principle)</span>」について少し深堀をして紹介しました。</p>



<p class="wp-block-paragraph">プログラミングは文法を覚えるだけでは、良いシステムを開発できるとは限りません。システムアーキテクチャの理解は、学習コストも高く、解釈も人により微妙に異なる場合がある領域かと私は思っています。また、正解のアーキテクチャが決まっているわけではなく、適用するシステムの特徴に合わせて最適なアーキテクチャを十分に検討する必要があるため、非常に難しい領域だと思っています。</p>



<p class="wp-block-paragraph">この記事を参考にしていただいて、自分の中でシステムアーキテクチャの最適な考え方や理解に落とし込んでいただければと思います。</p>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>

]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/clean-architecture-basics/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: tech.nkhn37.net @ 2026-08-13 12:12:03 by W3 Total Cache
-->