UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Architecture】ヘキサゴナルアーキテクチャとは

あるJavaソースコードをみていて、portというディレクトリがあった

これはヘキサゴナルアーキテクチャからきていると知ったのだが、ヘキサゴナルアーキテクチャがわからなかったので調べた

こちらの翻訳記事を参考にさせてもらった blog.tai2.net

ヘキサゴナルアーキテクチャ

別名「Ports & Adapter」

アーキテクチャの意図

  • アプリケーションを、ユーザー、プログラム、自動テストあるいはバッチスクリプトから、同じように駆動できるようにする
  • 実際のランタイムデバイスとデータベースから隔離して、開発とテストをできるようにする。
  • 外側の世界からポートに届くと、特定テクノロジーのアダプターが、利用可能な手続きを呼び出すか、メッセージに変換して、アプリケーションに渡す
  • アプリケーションは、入力デバイスの正体を知らなくて済む
  • アプリケーションがなにかを送る必要があるとき、ポートを通じてアダプターに送られて、受信側のテクノロジーが必要とする信号を送る
  • アプリケーションは、実際に他方のアダプターの正体を知ることはなしに、全側面のアダプターと意味的に完全なやりとりをする

動機

従来のソフトウェアアプリケーションではビジネスロジックユーザーインターフェースコードに侵入することがあった

どうにか頑張ってレイヤーを分けてビジネスロジックが入らないようにしても、度重なる変更によりビジネスロジックがとっ散らかることになってしまう

そこで、アプリケーションの提供する機能の部品すべてを、API(application programmed interface)ないし関数呼び出しを通して利用できるようにしたらどうかと考えた

レイヤー

ヘキサゴナル(六角形)といっているが、実際には何の意味もない辺の数みたいなので、ポートとアダプタ(Ports and Adapters)という名称の方が適切とのこと

ヘキサゴナルアーキテクチャには3つのレイヤーがある

  • 重要部分にあたるのが、アプリケーションのロジックとルールをすべて含んだドメインモデル
    • HTTPコンテキストやデータベースコールといった技術的な問題はドメインモデルでは取り扱わない
    • 技術的な変更をドメインに影響を与えることなく行えるようにする
  • ドメインモデルを囲む位置にあるポート層
    • ドメインモデルでの動作を統制するユースケースに対応するすべての要求を受信する
    • ポート層は内側にあるドメインと,外側にある外部エンティティとの境界となる
  • ポート層の外側にアダプタ層
    • アダプタ層はさまざまな形式の入力を受け取って出力を生成することを役割とする技術スタック
    • HTTPリクエストであれば、アダプタ層はリクエストをドメイン内へのコールに変換し、ドメインからの応答をクライアントへのHTTPレスポンスにマーシャリングする
    • アダプタにはドメインロジックは存在せず、外界とドメイン間の技術的な変換が唯一の責務となつ
    • ポートのプロトコルに準拠したアダプタであれば,そのポートを使用することができ、複数のアダプタが同じポートを使うこともできる