ポートとアダプタ
ポートとアダプタ(英語: Ports and Adapters architecture)あるいはヘキサゴナルアーキテクチャ(英語: Hexagonal architecture)とは、ソフトウェア設計におけるアーキテクチャ・パターンである。ポートとアダプタパターンは、アプリケーションのコンポーネントを相互に交換可能かつ疎結合に導く。これによりテストの自動化が容易になるとされる[1]。
歴史
[編集]ポートとアダプタ方式は、オブジェクト指向ソフトウェア設計における既知の構造上の問題、例えば、ソフトウェアにおけるレイヤー間の不適切な依存関係や、ユーザーインターフェースについてのコードがビジネスロジックに混入してしまうことを防ぐ試みの中で、当初ヘキサゴナルアーキテクチャとしてアリステア・コックバーンによって発明された。
ヘキサゴナルアーキテクチャは、ポートランドパターン・リポジトリウィキにおいて初めて言及され[2][3]、2005年にコックバーンによって「ポートアンドアダプタアーキテクチャ」に改名された[1]。2024年4月にコックバーンは本主題を包括的に扱った書籍をユアン・マニュエル・ガリード・デ・ペスと共著で出版している[4]。
コックバーンは、90年代にはデータベースをアーキテクチャ・スタックの最下部に置くのではなく、アプリケーションの外部に置くような対称的なアーキテクチャを描くようになったとしており、六角形であることは、コンポーネントと外部世界の間に必要なさらなるインターフェースを表現する余地を残しておくためのものであると説明している[1][2]。また、コックバーンは、レイヤードアーキテクチャにおける上下左右の固定観念を打破するためにアーキテクチャを六角形で描くことにしたともしている[2]。
原則
[編集]ヘキサゴナルアーキテクチャは、システムを疎結合で交換可能な部品に分割する。(e.g. アプリケーションコア、データベース、UI、テストコード、ほかシステム間のインターフェースなど)このアプローチは伝統的なレイヤードアーキテクチャを代替するものである。
それぞれの部品は提供された複数の「ポート」によって他の部品と接続される。これらのポートを介した通信は、それぞれの目的に応じて所定のプロトコルに従う。ポートとプロトコルはAPIのインターフェースを定義し、任意の適当な技術的手段によって実装される。(e.g. オブジェクト指向言語におけるメソッド呼び出し、遠隔手続き呼び出し、webサービス)
批評
[編集]マーティン・ファウラーは、ヘキサゴナルアーキテクチャはプレゼンテーション層とデータソース層の類似性を利用することによって、インターフェースによってアプリケーションコアが囲まれる対照的なコンポーネントを作ることができる利点があるとする一方、これはサービスプロバイダとサービスコンシューマ間に本来存在する、むしろレイヤーとして表現される方が良いような非対称性を隠してしまう欠点もあるとしている[5]。
活用
[編集]複数の人物によって、ヘキサゴナルアーキテクチャはマイクロサービスアーキテクチャの起源だとされる[6]。
種類
[編集]ヘキサゴナルアーキテクチャに類似するアーキテクチャとして、オニオンアーキテクチャが2008年にジェフリー・パレルモによって提案されている。オニオンアーキテクチャはヘキサゴナルアーキテクチャと同様、アプリケーションとデータベースを分離するために、インターフェースと共にインフラストラクチャを外部化する[7]。オニオンアーキテクチャは、制御の反転を利用して、アプリケーションコアをさらに複数のレイヤーに分割している。
2012年には、ロバート・C・マーチンによってクリーンアーキテクチャが提唱された。クリーンアーキテクチャは、ヘキサゴナルアーキテクチャ、オニオンアーキテクチャ、他いくつかのアーキテクチャの原則を組み合せたものであり、コンポーネントにさらに詳細なレベルを追加している。クリーンアーキテクチャは、アダプターやインターフェース(UIやデータベース、外部システム、デバイス)をより外側の円に分離し、ユースケースやエンティティをより内側の円に置く[8][9]。クリーンアーキテクチャは外側から内側への依存関係のみを許し、その逆を許さないという厳しいルールのもとで、依存性逆転の原則を利用している。
脚注
[編集]- ^ a b c Cockburn (2005年4月1日). “Hexagonal architecture”. alistair.cockburn.us. 2020年11月18日閲覧。
- ^ a b c “Hexagonal Architecture in the C2 Wiki”. 2024年12月12日閲覧。
- ^ “Ports And Adapters Architecture in the C2 Wiki”. 2024年12月12日閲覧。
- ^ “Hexagonal Architecture Explained”. 2024年12月12日閲覧。
- ^ Fowler, Martin (2003). Patterns of enterprise application architecture. Addison-Wesley. pp. 21. ISBN 0-321-12742-0. OCLC 50292267
- ^ 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
- ^ Jeffrey, Palermo (2008年7月29日). “The Onion Architecture : part 1” (英語). Programming with Palermo. 2019年8月12日閲覧。
- ^ Martin, Robert, C. (2012年8月12日). “The Clean architecture | Clean Coder Blog”. blog.cleancoder.com. 2019年8月12日閲覧。
- ^ 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