BT

Your opinion matters! あなたのご意見でInfoQが変わる!

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

| 作者: Jan Stenberg フォローする 9 人のフォロワー , 翻訳者 吉田 英人 フォローする 0 人のフォロワー 投稿日 2014年11月24日. 推定読書時間: 3 分 |

原文(投稿日:2014/10/31)へのリンク

ポートとアダプタアーキテクチャスタイル,あるいはヘキサゴナルアーキテクチャは,ドメインモデルと入出力に使用されるデバイスの明確な分離を実現する – Ian Cooper氏は,ヘキサゴナルアーキテクチャを中心としたアーキテクチャスタイルに関するプレゼンテーションで,このように説明した。

階層化システム(Layered System)は,結合性を回避する基本的なアーキテクチャスタイルのひとつである。結合性は,20年のソフトウェア開発歴を持つMicrosoft MVPである氏が,特に歳規模システムにおいて,ソフトウェアのメンテナンス性の最大の敵だと考えるものだ。結合性が強くなれば,波及的な影響なしに何らかの変更を行うこと,テストの実施,変更による影響の理解や理由の判断,といったことが困難になる。

ポートとアダプタ(Ports and Adapters)は,階層化の制約や条件をすべて満足するアーキテクチャの一例である。氏はヘキサゴナルアーキテクチャという呼び方よりも,ポートとアダプタという名称が適切だと考えている。ヘキサゴナル(六角形)という,実際には何の意味もない辺の数が,重要な意味を持つかのように疑問を持つことを避けたいからだ。

ヘキサゴナルアーキテクチャには3つの層がある。重要部分にあたるのが,アプリケーションのロジックとルールをすべて含んだドメインモデルだ。HTTPコンテキストやデータベースコールといった技術的な問題は,ドメインモデルでは取り扱わない。これによって,技術的な変更を,ドメインに影響を与えることなく行えるようになる。

ドメインモデルを囲む位置にあるポート層では,ドメインモデルでの動作を統制するユースケースに対応するすべての要求を受信する。ポート層は内側にあるドメインと,外側にある外部エンティティとのバウンダリでもある。

ポート層の外側にはアダプタ層がある。アダプタ層は,さまざまな形式の入力を受け取って出力を生成することを役割とする技術スタックだ。HTTPリクエストを例に取れば,アダプタ層はリクエストをドメイン内へのコールに変換し,ドメインからの応答をクライアントへのHTTPレスポンスにマーシャリングする。アダプタにはドメインロジックは存在しない。外界とドメイン間の技術的な変換が唯一の責務である。ポートのプロトコルに準拠したアダプタであれば,そのポートを使用することができる。複数のアダプタが同じポートを使うことも可能だ。ユースケースのひとつとして氏が説明したのは,同じポートを利用する新旧2つのユーザインターフェースだ。

テストは振る舞いに注目して行われるべきであり,ポートを直接テストすることによって,テストは使用するユーザインターフェースに依存しないものになる,と氏は考えている。ドメインモデル内部を詳細にテストしている開発者が多いが,そういったテストは,実装を少し変更するだけでフェールするようになるため,リファクタを阻害する原因になる。そのようなテスト方法は間違いだ。そうではなく,実装の詳細を変えた後でも影響を受けない公開インターフェースである,ポートバウンダリで行うことが必要だ。

統合テストが必要になるのは,例えばORMマッピングの設定確認のように,構成などをテストする場合のみである。外部バウンダリで行うシステムテストについても同じことが言える。REST APIが動作しているか,というようなテストのように,すべてが正しく接続されていることを確認するために,いくつかの信頼性テストを行えば十分だ。

Alistair Cockburn氏は従来的な階層化や結合,複雑化といった問題へのソリューションとして,ヘキサゴナルアーキテクチャ 2005を発表している。

修正版のひとつとして,Robert C. Martion氏が昨年の講演で取り上げたクリーンアーキテクチャというものがある。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT