干净的架构为什么我们有用例?

Ard*_*jan 8 architecture dart flutter clean-architecture

在清洁架构中,我们将用例作为业务逻辑规则。但我们也可以直接调用存储库中的函数,因此我们不需要用例。这背后的原因是什么?

示例用例

class GetMarketUseCase implements UseCase<Stream<ResponseModel>, void> {
  final PriceTrackerRepository priceTrackerRepository;

  GetMarketUseCase(this.priceTrackerRepository);

  @override
  Stream<ResponseModel> call(void params) {
    return priceTrackerRepository.getMarketWithSymbols();
  }
}
Run Code Online (Sandbox Code Playgroud)

样本库

class PriceTrackerRepositoryImpl implements PriceTrackerRepository {
  late final PriceTrackerDataSource priceTrackerDataSource;

  PriceTrackerRepositoryImpl(this.priceTrackerDataSource);

  @override
  Stream<ResponseModel> getMarketWithSymbols() {


    return _marketStreamController.stream;
  }
Run Code Online (Sandbox Code Playgroud)

man*_*n21 12

因为它可以防止你的演示者在必须处理 UI 逻辑和业务逻辑时成为上帝对象。

例如:一个注销用例,您需要在里面调用API注销AuthenRepo,取消注册Firebase FCM令牌,关闭套接字,也许还清除里面的一些本地数据CartRepoUserRepo...然后想象一下将所有这些东西放在Presenter中,而不是一团糟创建LogoutUseCase对您需要的每个存储库的调用

而且,您可以在很多地方使用它,例如当用户按下“注销”按钮时,当用户登录令牌过期时,...只需调用LogoutUseCase而不是将代码从这个 Presenter 复制到另一个 Presenter,当您需要时也可以轻松使用更改有关注销要求的内容

Presenter 的代码示例是 Bloc:

AuthBloc 与用例:

class AuthBloc extends Bloc<AuthEvent, AuthState> {
  AuthBloc(AuthState state) : super(state) {
    on<AuthLogoutEvent>(_onLogout);
  }

  Future<void> _onLogout(
      AuthLogoutEvent event,
      Emitter<AuthState> emit,
      ) async {
    await getIt<LogoutUseCase>().call(NoParams());
  }
}
Run Code Online (Sandbox Code Playgroud)

没有用例的 AuthBloc:

class AuthBloc extends Bloc<AuthEvent, AuthState> {
  AuthBloc(AuthState state) : super(state) {
    on<AuthLogoutEvent>(_onLogout);
  }

  Future<void> _onLogout(
      AuthLogoutEvent event,
      Emitter<AuthState> emit,
      ) async {
    await getIt<AuthRepo>().logout();
    await FirebaseMessaging.instance.deleteToken();
    await getIt<SocketRepo>().close();
    await getIt<CartRepo>().clearData();
    await getIt<UserRepo>().clearData();
    // maybe more Repo need to call here :((
  }
}
Run Code Online (Sandbox Code Playgroud)

在你上面的例子中,它只是简单的用例,只有action getMarketWithSymbols(),那么我同意这里的Usecase是多余的,但是为了一致性,它应该有,谁知道,将来这个UseCase需要扩展,那么你会很容易然后。