コンテンツにスキップ

ポートとアダプタ

出典: フリー百科事典『ウィキペディア(Wikipedia)』

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

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

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

歴史

[編集]

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

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

原則

[編集]
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
ヘキサゴナル・アーキテクチャの例

ヘキサゴナルアーキテクチャは、システムを疎結合で交換可能な部品に分割する。(e.g. アプリケーションコア、データベースUI、テストコード、ほかシステム間のインターフェースなど)

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

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

批評

[編集]

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

活用

[編集]

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

種類

[編集]

オニオンアーキテクチャ

[編集]

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

クリーンアーキテクチャ

[編集]

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

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

脚注

[編集]
  1. ^ a b c d Cockburn (2005年4月1日). “Hexagonal architecture”. alistair.cockburn.us. 2020年11月18日閲覧。
  2. ^ a b c Hexagonal Architecture in the C2 Wiki”. 2024年12月12日閲覧。
  3. ^ Ports And Adapters Architecture in the C2 Wiki”. 2024年12月12日閲覧。
  4. ^ Hexagonal Architecture Explained”. 2024年12月12日閲覧。
  5. ^ Fowler, Martin (2003). Patterns of enterprise application architecture. Addison-Wesley. pp. 21. ISBN 0-321-12742-0. OCLC 50292267 
  6. ^ Rajesh R. V. (2017). Spring 5.0 microservices : build scalable microservices with Reactive Streams, Spring Boot, Docker, and Mesos (Second ed.). Packt Publishing. pp. 13–14. ISBN 978-1-78712-051-8. OCLC 999610958 
  7. ^ Jeffrey, Palermo (2008年7月29日). “The Onion Architecture : part 1” (英語). Programming with Palermo. 2019年8月12日閲覧。
  8. ^ Martin, Robert, C. (2012年8月12日). “The Clean architecture | Clean Coder Blog”. blog.cleancoder.com. 2019年8月12日閲覧。
  9. ^ Martin, Robert C. (2017). Clean architecture : a craftsman's guide to software structure and design. Prentice Hall. ISBN 978-0-13-449416-6. OCLC 1004983973 

関連項目

[編集]