> ## Documentation Index
> Fetch the complete documentation index at: https://meta.niceshare.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 関心の分離

> 関心の分離（SoC）は、ソフトウェアを明確なモジュールに分割し、それぞれが特定の関心を処理する設計原則です。その起源、利点、適用方法を学びましょう。

<Info>
  **カテゴリ**: 原則<br />
  **種類**: ソフトウェアアーキテクチャの原則<br />
  **起源**: エドガー・W・ダイクストラ、1974年<br />
  **別名**: SoC、関心の分離
</Info>

<Note>
  **クイックアンサー** —
  関心の分離（SoC）は、ソフトウェアを明確なセクションに分割し、それぞれが別々の関心を処理することで整理する設計原則です。1974年にエドガー・W・ダイクストラによって命名されたこの原則は、現代のソフトウェアアーキテクチャの基盤であり、複雑なシステムにおける保守性、スケーラビリティ、明確さを可能にします。
</Note>

## 関心の分離とは

関心の分離は、ソフトウェアシステムを明確なモジュールに分割する実践であり、各モジュールが特定の側面または関心を処理します。「関心」とは、ビジネスロジック、データ永続化、ユーザーインターフェース、セキュリティ、ネットワーキングなど、システム内のあらゆる興味や責任の領域です。これらの関心を分離することで、開発者は他の部分に影響を与えることなく、個々の部分に取り組むことができます。

> 「関心の分離こそが進むための唯一の方法である。」— エドガー・W・ダイクストラ

この原則は、ダイクストラの1974年の論文「科学思考の役割について」で生まれました。彼は、人間の心は一度に限られた量の情報しか保持できないと論じました。問題を防心の関心に分割することで、人間が理解し管理できる範囲に収めるのです。

現代のソフトウェア開発では、SoCはすべてのレベルで現れます。最高レベルでは、プレゼンテーションレイヤーをビジネスロジックレイヤーから分離するかもしれません。モジュールレベルでは、データアクセスをドメインロジックから分離するかもしれません。関数レベルでは、純粋な計算を副作用から分離するかもしれません。各レイヤーは明確な責任を持ち、明確に定義されたインターフェースを通じて他のレイヤーと通信します。

### 関心の分離を3つの深さで理解する

* **ビギナー**: コードのあらゆる部分で異なる関心を特定してください。ユーザーインターフェースのコードにSQLクエリが含まれている場合、それは関心の混合です。各関心をそれぞれの場所に移動してください。

* **プラクティショナー**: WebアプリケーションのModel-View-Controller（MVC）やエンタープライズシステムのレイヤードアーキテクチャなど、SoCを強制するアーキテクチャパターンを使用してください。

* **アドバンスド**: 組織レベルでSoCを適用してください。コンウェイの法則は、システム設計がコミュニケーション構造を反映することを示唆しています。チームを関心中心に編成することで、並列開発を可能にし、調整のオーバーヘッドを削減します。

## 起源

「関心の分離」という用語は、史上最も影響力のあるコンピュータサイエンティストの一人であるエドガー・W・ダイクストラによって導入されました。1974年のエッセイ「科学思考の役割について」で、ダイクストラは人間の認知の限界について書き、問題を管理可能な部分に分割することが複雑さに対処するために不可欠であると論じました。

ダイクストラの洞察は現代のソフトウェア工学に先行していましたが、ソフトウェアシステムが複雑さを増すにつれて、ますます関連性が高まりました。その後の数十年で、SoCは数多くのアーキテクチャパターンに組み込まれました。1970年代のモジュールプログラミング、1980年代のオブジェクト指向設計、2000年代のサービス指向アーキテクチャ、2010年代のマイクロサービスです。

この原則は、政治哲学における「権力の分立」というより広範な概念にもつながっています。民主主義政府が権力の集中を防ぐために立法、行政、司法の権力を分離するのと同様に、ソフトウェアシステムは複雑さが管理不能になるのを防ぐために関心を分離します。

## 要点

<Steps>
  <Step title="理解性を向上させる">
    各モジュールが一つの関心を処理する場合、開発者はシステム全体を習得する必要なく、個々の部分を理解し、取り組むことができます。
  </Step>

  <Step title="並列開発を可能にする">
    よく分離された関心により、異なる開発者やチームが互いの進行を妨害することなく同時に作業できます。
  </Step>

  <Step title="テストを容易にする">
    分離された関心は独立してテストできます。ユーザーインターフェース、データベース、ネットワーク接続を必要とせずに、ビジネスロジックを単体テストできます。
  </Step>

  <Step title="変更の影響を減らす">
    関心が変更された場合、その影響は局所化されます。ユーザーインターフェースへの変更が、ビジネスロジックの修正を必要とすべきではありません。
  </Step>
</Steps>

## 応用場面

<CardGroup cols={2}>
  <Card title="レイヤードアーキテクチャ">
    コードをレイヤー（プレゼンテーション、ビジネスロジック、データアクセス）に整理してください。各レイヤーは特定の役割を持ち、インターフェースを通じて隣接するレイヤーと通信します。
  </Card>

  <Card title="コンポーネント設計">
    特定の責任を中心にソフトウェアコンポーネントを設計してください。支払いコンポーネントは支払いを処理し、通知コンポーネントは通知を処理します。
  </Card>

  <Card title="関数型プログラミング">
    純粋関数（副作用なし）を不純関数（I/O、状態変更）から分離してください。これにより、コードの推論とテストが容易になります。
  </Card>

  <Card title="横断的関心">
    アスペクト指向プログラミングなどのテクニックを使って、ロギングやセキュリティなど、システムの複数の部分に影響する関心を、ビジネスコードを汚染することなく処理してください。
  </Card>
</CardGroup>

## 事例

2000年代初頭、大規模eコマースプラットフォームは、ビジネスロジック、データベースクエリ、HTMLテンプレートが同じPHPファイルに絡み合った一枚岩のコードベースに苦しんでいました。五人の小規模チームが数千のファイルを管理していましたが、無関係な機能を壊すリスクのため、新機能の追加には数か月かかりました。

会社はデータ（Model）、プレゼンテーション（View）、ロジック（Controller）の分離を強制するModel-View-Controller（MVC）アーキテクチャを採用しました。また、独立したデータアクセスレイヤーも実装しました。

結果は開発速度を変革しました。以前は三か月かかっていた新機能が、三週間で配信されるようになりました。開発者は専門化できました。一部はユーザーエクスペリエンスに、他方はビジネスルールに、互いの仕事を踏むことなく集中できました。各関心を独立して最適化または置き換えられたため、プラットフォームはスケールできました。製品カタログのためにリレーショナルデータベースからNoSQLに切り替えましたが、プレゼンテーションレイヤーに触れることはありませんでした。

この事例はSoCの力を示しています。明確な関心を中心にコードを整理することで、かつてのボトルネックがスケーラブルで保守可能なシステムに変わりました。

## 境界と失敗モード

最も一般的な失敗は、実際の関心を反映しない人工的な境界を作成することです。論理的な正当化なしにコードを別々のファイルやモジュールに分割することは、利益なく複雑さを追加します。関心は *変更される理由* に基づいて分離されるべきです。異なる理由で変更されるものは、別の場所にあるべきです。

もう一つの落とし穴は、過剰な分離です。複数のモジュールを管理するコストが利益を上回る場合です。二つの関心が常に変更される場合、それらを一緒に保つことが多くの場合理にかなっています。

境界条件。利益（複雑さの削減、並列開発、テスト性）が分離の作成と保守のコストを上回る場合にSoCを適用してください。粗粒度の分離から始め、パターンが現れるにつれて洗練してください。

## よくある誤解

<AccordionGroup>
  <Accordion title="誤解: SoCはファイルを増やすことを意味する">
    分離はファイルを増やすことではありません。論理的な整理についてです。明確な命名と構造を通じて、単一ファイル内で分離を持つことができますが、別々のファイルの方が多くの場合明確です。
  </Accordion>

  <Accordion title="誤解: SoCはコードにのみ適用される">
    この原則はコードを超えて拡張されます。システムアーキテクチャ、API設計、ドキュメント、組織構造にも適用できます。
  </Accordion>

  <Accordion title="誤解: SoCは複雑さを排除する">
    分離は複雑さを管理しますが、排除しません。システムは依然として同じ総複雑さを持っています。SoCは、焦点を絞ったモジュールに分散させることで、人間が理解しやすくします。
  </Accordion>
</AccordionGroup>

## 関連コンセプト

関心の分離は、他の基本的なソフトウェア設計原則と密接に関連しています。

<CardGroup cols={3}>
  <Card title="単一責任の原則" href="/ja/principles/single-responsibility">
    SoCとSRPは密接に関連しています。SRPは、クラスと関数レベルでのSoCの実装としばしば考えられます。
  </Card>

  <Card title="モジュール性">
    モジュール性はSoCの実践的応用であり、明確に定義されたインターフェースを持つ自己完結型のモジュールを作成します。
  </Card>

  <Card title="凝集">
    凝集は、単一モジュールの責任がどれだけ強く関連しているかを測定します。モジュール内の高い凝集はSoCを補完します。
  </Card>
</CardGroup>

## 一言で言うと

<Tip>
  **システムを明確な責任領域に基づいてモジュールに分割せよ。各関心は独自の場所を持ち、システム全体を理解し、開発し、保守しやすくする。**
</Tip>
