TL;DR
アプリケーションの内側と外側を、ポートとアダプタで分けるアーキテクチャ。別名 Ports and Adapters。Alistair Cockburn が 2005 年に発表した。
なぜ必要か
ビジネスロジックが UI や外部のデータベースと絡み合うと、自動テストが難しくなり、バッチなど UI なしでの利用もできなくなる。ヘキサゴナルアーキテクチャは、アプリケーションを利用者、プログラム、自動テスト、バッチスクリプトのどれからでも同じように動かせるようにし、データベースや外部機器から切り離して開発・テストできるようにすることを目指す。
仕組み
重要な境界は左右や上下ではなく、アプリケーションの内側と外側の間にある。
ポートは、アプリケーションが外部とやりとりする API である。ポートは技術ではなく、やりとりの目的ごとに定義する。アダプタは、ポートの API と、GUI、テストハーネス、HTTP、実際のデータベース、インメモリのモックなどの具体的な技術との間を変換する。1 つのポートに複数のアダプタをつなぐことができ、アプリケーションを変えずに差し替えられる。
アプリケーションを動かす側(GUI やテストハーネスなど)をプライマリ(driving)、アプリケーションが動かす側(データベースや通知サービスなど)をセカンダリ(driven)と呼ぶ。
注意点
六角形であることに意味はない。一般的なアプリケーションには、他のシステムやアダプタとつながる部分が 4 つ以上あることを示したかっただけである。六角形は 1 次元のレイヤの図にとらわれず、必要なだけポートとアダプタを書き足せるように選ばれた形である。