Open8
クリーンアーキテクチャ学ぶ

Enterprise Business Rules(ドメイン固有のルール、domain 層)
ビジネスルールをカプセル化した層
ここにはビジネスルールを記述する。
システムなどの要件は一旦考えずに業務要件をまとめたもの。

Application Business Rules(アプリケーション固有のルール、usecase層)
この層では、アプリケーション固有のビジネスルールが記述される層。
domain 層ではシステムを考慮しないビジネスルールを定義した。
一方、この usecase 層ではすステムとしてのビジネスルールが定義される。

Interface Adapters
この層は、入力、永続化、表示といった usecase と外部世界のやりとりを担当する。
gateways
データの取り扱いに関する抽象化を担当する。
プログラミングをしているとよく出てくる Repository 層がこれに当たる。
controller
入力値を usecase に渡し、レスポンスを返すなどの橋渡しを担当する。
MVC などでよく聞くコントローラーのこと。
presenter
入力値や出力値を変換する役割を持つ。
- 入力値に対して: usecase 層が扱いやすい形に変換
- 出力値に対して: 外部(web, DB)が扱いやすい形に変換

Frameworks & Drivers
クリーンアーキテクチャの一番外側の層
利用している DB(MySQL, PostgreSQLなど)、フレームワークに依存するコードが配置される。
フロントエンドのUI もここに属する。

クリーンアーキテクチャなんのため?
実装時に同時に考えなければならない事柄を減らすこと
この一点につきます。
別の言い方をすれば「Aについて考えている時にはBのことは考えなくて良い」という状態を意図して作り出すことが重要です。

依存している、依存していない
レイヤードアーキテクチャの同心円状の図は中心に向かって依存していることを示している。
インターフェース(抽象クラス)には依存しているものの、具象クラスには依存していない
ユーザ作成処理クラスは IUserRepository という抽象に依存していますが、具象クラスには依存していません。
「依存していない」と表現するときはつまり「(具象クラスに)依存していない」という意味なのです。
// ユーザ作成処理クラス
public class CreateUserUsecase {
private readonly IUserRepository userRepository;
public CreateUser(IUserRepository userRepository){
this.userRepository = userRepository;
}
public void Execute(string name){
var user = new User(name);
this.userRepository.Save(user);
}
}
// インターフェースには依存しているものの、具象クラスには依存していない
public interface IUserRepository{
void Save(User user);
}

クリーンアーキテクチャを実践するときに開発者が実施すること
- UseCase を定義する
- リクエストを定義する
- レスポンスを定義する
- Interactor を定義する
- Mock の Interactor を定義する(*)
- Interactor を DI 登録する
- Mock の Interactor を DI 登録する(*)
'*' は test をする際に必要