はじめに
クリーンアーキテクチャにおけるユースケースのインターフェース(Usecase Input Port, Output Port)の役割について、個人的な見解を述べたいと思います。というのも、ユースケースを呼び出すのはユースケースの外側に位置するInterface Adapter層であり、依存性逆転を行わなくても依存関係は問題ないからです。つまり、ユースケースのインターフェースが存在しなくても、クリーンアーキテクチャが大事にしている依存の方向には影響を与えないのではないか、あるいは不要ではないかということです。この場合、ヘキサゴナルアーキテクチャについて理解を深めることで、その必要性が分かると思います。
※クリーンアーキテクチャとはなんぞや?という方向けに執筆した記事もありますので、必要であればそちらを先にお読みいただければと思います:クリーンアーキテクチャを少し説明できるようになれる記事
最初に結論
結論から言うと、ユースケースのインターフェースはヘキサゴナルアーキテクチャのポートと同じ役割を果たします。ユースケースのインターフェースは、依存性逆転を実現するというよりも、広い意味でのインターフェース(疎結合、交換容易性、明確な規約)としての意味が強いと考えています。
ヘキサゴナルアーキテクチャとは
ヘキサゴナルアーキテクチャ(またはポート&アダプタパターン)は、アプリケーションのビジネスロジックを中心に据え、その周囲に外部要素(データベース、外部サービスなど)を配置する設計手法です。これにより、内部のアプリケーションのビジネスロジックが外部要素の影響を受けないことを実現します。クリーンアーキテクチャはヘキサゴナルアーキテクチャの影響を受けており、根幹の考えは両者とも同じです。
ヘキサゴナルアーキテクチャでは、ユースケース(アプリケーションのコア)はポート(インターフェース)を介して外部(アダプタ)とやり取りを行います。これにより、アダプタの付け替えが簡単になります。
クリーンアーキテクチャにおけるユースケースのインターフェースの役割
依存性逆転ではなく、インターフェースを利用する一般的なメリットと同様です。
テスト・交換容易性
- ユースケースを使う側(例えばコントローラーなど)の単体テストをやりやすくするためにユースケースをモックにする
- フロントエンド開発とサーバーサイド開発で分業されている場合、フロントエンド開発を行いやすくするためにユースケースをモックにして固定値を返すようにする
この場合特にモックにする必要性がなければ、必要になったタイミングでインターフェースを作成するでも良いかと思います。
明確な契約の提供
個人的にはこちらの役割が特に重要だと思います。インターフェースがあることで、ユースケースを利用する側にとって、ユースケースが何を期待し、どのような出力を生成するのかを明確に定義します。
PCを充電するというユースケースで例えてみましょう。PCがアプリケーションのコア、PCの側面にあるUSB Type-Cの接続穴がインターフェース(ポート)、充電ケーブルがアダプタです。PCの接続穴を見るだけで、「これはType-Cのケーブルを使えば充電できるな」と理解できます。アダプタである充電ケーブルは、100円ショップで買った安価なものでも、PC購入時に付属している純正のものでも、Type-Cに対応していれば何でも問題ありません。
ユースケースのシグネチャを見れば使い方が分かるので十分という方は、必要になったタイミングでインターフェースを作成するでも良いと思います。(不必要にインターフェースを用意すると逆に複雑性が増すと感じる方もいらっしゃるので)
終わりに
タイトルについて回答すると、「テスト・交換容易性」と「ユースケースを利用する側が、このユースケースは何を期待して、何を出力するのかをすぐに理解できる役割」を果たすと考えています。もしインターフェースが存在しない場合、使う側はユースケースの実装の詳細を理解する必要があります。小規模なアプリケーションであれば問題ないかもしれませんが、アプリケーションは複雑になるものです。インターフェースがあることで複雑になるデメリットもありますが、将来的なことを考えると、インターフェースを用意した方がクリーンアーキテクチャの思想に沿っていると思います。