Open8

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

match1124match1124

Enterprise Business Rules(ドメイン固有のルール、domain 層)

ビジネスルールをカプセル化した層

ここにはビジネスルールを記述する。
システムなどの要件は一旦考えずに業務要件をまとめたもの。

match1124match1124

Application Business Rules(アプリケーション固有のルール、usecase層)

この層では、アプリケーション固有のビジネスルールが記述される層。

domain 層ではシステムを考慮しないビジネスルールを定義した。
一方、この usecase 層ではすステムとしてのビジネスルールが定義される。

match1124match1124

Interface Adapters

この層は、入力、永続化、表示といった usecase と外部世界のやりとりを担当する。

gateways

データの取り扱いに関する抽象化を担当する。
プログラミングをしているとよく出てくる Repository 層がこれに当たる。

controller

入力値を usecase に渡し、レスポンスを返すなどの橋渡しを担当する。
MVC などでよく聞くコントローラーのこと。

presenter

入力値や出力値を変換する役割を持つ。

  • 入力値に対して: usecase 層が扱いやすい形に変換
  • 出力値に対して: 外部(web, DB)が扱いやすい形に変換
match1124match1124

Frameworks & Drivers

クリーンアーキテクチャの一番外側の層

利用している DB(MySQL, PostgreSQLなど)、フレームワークに依存するコードが配置される。
フロントエンドのUI もここに属する。

match1124match1124

依存している、依存していない

レイヤードアーキテクチャの同心円状の図は中心に向かって依存していることを示している。

インターフェース(抽象クラス)には依存しているものの、具象クラスには依存していない

ユーザ作成処理クラスは 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);
}
match1124match1124

クリーンアーキテクチャを実践するときに開発者が実施すること

  1. UseCase を定義する
  2. リクエストを定義する
  3. レスポンスを定義する
  4. Interactor を定義する
  5. Mock の Interactor を定義する(*)
  6. Interactor を DI 登録する
  7. Mock の Interactor を DI 登録する(*)

'*' は test をする際に必要