Bloc 事件是否与 Clean Architecture 用例相同?

Are Bloc events the same as Clean Architecture use-cases?

提问人:Ουιλιαμ Αρκευα 提问时间:11/17/2023 更新时间:11/17/2023 访问量:31

问:

我有这个用例示例代码:

final class AuthUseCases {
  final DataProxy dataProxy;

  const AuthUseCases(this.dataProxy);

  Future<AuthSession> login(TCredential credential) async {
    // a lot of lines here...
  }

  AuthSession logout(AuthSession session) {
    // a few lines here...
  }
}

我使用 Freezed 包为 BloC 事件提供了以下示例代码:

@freezed
sealed class TmdbEvent with _$TmdbEvent {
  const factory TmdbEvent.login(TCredential credential) = LoginEvent;
  const factory TmdbEvent.logout() = LogoutEvent;
}

class TmdbBloc extends Bloc<TmdbEvent, PageState> {
  // more lines here...
}

所以我问自己是否可以把这些课程合并在一起,因为我认为 BloC 事件与用例相同。所以这里有一些问题:

  • 这个想法正确吗?
  • 这个新班级会是什么样子?我是 Freezed 包的新手
  • 保留一个班级还是将它们分开是个好主意?
Flutter 事件 bloc clean-architecture 用例

评论


答:

1赞 pixel 11/17/2023 #1

与用例相结合的想法是合理的,因为两者都与处理业务逻辑和表示应用程序中的操作有关。但是,保持明确的关注点分离至关重要。虽然它们可以共享相似之处,但将它们保留为不同的实体通常有益,以便更好地组织代码和可维护性。BloC events

建议如下:

@freezed
abstract class AuthBlocEvent with _$AuthBlocEvent {
  const factory AuthBlocEvent.login(TCredential credential) = LoginEvent;
  const factory AuthBlocEvent.logout() = LogoutEvent;
}

class AuthBloc extends Bloc<AuthBlocEvent, PageState> {
  final DataProxy dataProxy;

  AuthBloc(this.dataProxy) : super(InitialState);

  @override
  Stream<PageState> mapEventToState(AuthBlocEvent event) async* {
    if (event is LoginEvent) {
      // Login logic...
    } else if (event is LogoutEvent) {
      // Logout logic...
    }
  }
}

但是,请记住,合并或分离类的决定取决于代码复杂性、可维护性和对单一责任原则的遵守等因素。如果类变得太大或太复杂,将其拆分为单独的用例和 BloC 事件可能是有益的,以提高可读性和可维护性。