ポートとアダプタ

ポートとアダプタ（）あるいはヘキサゴナルアーキテクチャ（）とは、ソフトウェア設計におけるアーキテクチャパターンである。ポートとアダプタパターンは、アプリケーションのコンポーネントを相互に交換可能かつ疎結合に導く。これによりソフトウェアテストの自動化が容易になるとされる。

オブジェクト指向ソフトウェア設計における間の不適切な依存関係や、ユーザーインターフェースについてのコードがビジネスロジックに混入してしまうという構造上の問題を防ぐ試みの中で、によって発明された。

当初は「ヘキサゴナルアーキテクチャ」とされたが、のちに「ポートアンドアダプタアーキテクチャ」と改名されている。

 歴史 
ヘキサゴナルアーキテクチャは、ウィキにおいて初めて提議され、2005年にはコックバーンによって「ポートアンドアダプタアーキテクチャ」と改名された。2024年4月にコックバーンは本主題を包括的に扱った書籍をユアン・マニュエル・ガリード・デ・ペスと共著で出版している。

コックバーンは、90年代にはデータベースをアーキテクチャ・スタックの最下部に置くのではなく、アプリケーションの外部に置く対称的なアーキテクチャを描くようになったとしている。コックバーンによれば、形が六角形なのはコンポーネントと外部世界の間に必要なさらなるインターフェースを表現する余地を残しておくためのものであるとされている一方で、レイヤードアーキテクチャにおける上下左右の固定観念を打破するためであるともされている。

 原則 
代替文=Example of hexagonal architecture with an inner hexagon representing the application core, and an outer hexagon for the adapters, the border between the two being the ports|サムネイル|313x313ピクセル|ヘキサゴナル・アーキテクチャの例
ヘキサゴナルアーキテクチャは、システムを疎結合で交換可能な部品に分割する。（e.g. アプリケーションコア、データベース、UI、テストコード、ほかシステム間のインターフェースなど）

このアプローチは伝統的なレイヤードアーキテクチャを代替する考え方である。

それぞれの部品は提供された複数の「ポート」によって他の部品と接続される。これらのポートを介した通信は、それぞれの目的に応じて所定のプロトコルに従う。ポートとプロトコルはAPIのインターフェースを定義し、任意の適当な技術的手段によって実装される。（e.g. オブジェクト指向言語におけるメソッド呼び出し、遠隔手続き呼び出し、webサービス）

 批評 
マーティン・ファウラーは、ヘキサゴナルアーキテクチャはプレゼンテーション層とデータソース層の類似性を利用することによって、インターフェースによってアプリケーションコアが囲まれる対称的なコンポーネントを作ることができる利点があるとする一方、これはサービス提供者とサービス使用者側の間に本来存在する、むしろレイヤーとして表現される方が良いような非対称性を隠してしまう欠点もあるとしている。

 活用 
複数の人物によって、ヘキサゴナルアーキテクチャはマイクロサービスアーキテクチャの起源だとされる。

 種類 

 オニオンアーキテクチャ 
ヘキサゴナルアーキテクチャに類似するアーキテクチャとして、オニオンアーキテクチャが2008年にジェフリー・パレルモによって提案されている。オニオンアーキテクチャはヘキサゴナルアーキテクチャと同様、アプリケーションとデータベースを分離するために、インターフェースとインフラストラクチャを外部に置く。オニオンアーキテクチャは、制御の反転を利用して、アプリケーションコアをさらに複数のレイヤーに分割している。

 クリーンアーキテクチャ 
2012年には、によってクリーンアーキテクチャが提唱された。クリーンアーキテクチャは、ヘキサゴナルアーキテクチャ、オニオンアーキテクチャ、他いくつかのアーキテクチャの原則を組み合せたものであり、コンポーネントにさらに詳細なレベルを追加している。

また、クリーンアーキテクチャでは、アダプターやインターフェース（UIやデータベース、外部システム、デバイス）をより外側のレイヤーに分離し、ユースケースやエンティティをより内側のレイヤーに置く。クリーンアーキテクチャは外側から内側への依存関係のみを許し、その逆を許さないという厳格なルールのもとで、依存性逆転の原則を利用している。

 脚注 

 関連項目 

 ドメイン駆動開発


 ハニカムアーキテクチャ

 複合構造図
 オブジェクト指向分析設計

Category:ソフトウェア設計
Category:アーキテクチャパターン (コンピュータ科学)
Category:オブジェクト指向