我们是否应该将用例接口作为参数传递

Should we want to pass Usecase interface as param

提问人:Shreyas Sparrow 提问时间:9/16/2023 更新时间:9/16/2023 访问量:36

问:

在干净的架构中,主要核心是包含业务逻辑的用例层。现在在 Android 中,我们将使用 case 并将其作为构造函数中的参数传递给 viewmodel。例如

class AddNoteUseCase(noteRepository:INoteRepository):IUseCase{
  override fun invoke(note:Note){
      noteRepository.addNote(note)
}
}

我看到了两种类型的代码来传递视图模型的用例

  1. 用例与视图模型紧密耦合
class NoteViewModel(addNoteUseCase:AddNoteUseCase){
  // usecase code
}
  1. 用例与视图模型松散耦合
class NoteViewModel(addNoteUseCase:IUseCase){
  // usecase code
}

如果我们采用第一种方法,那么我们就不能伪造,而且将来的改变也很困难。 如果我们采用第二种方法,那么我们就可以伪造单元测试

我的问题是哪种方法会有所帮助。因为有些人说一种方法,因为不需要伪造用例,因为它只包含一种方法,有些人说没有伪造,你将如何测试用例

Android Kotlin ViewModel 清理架构 用例

评论


答:

1赞 Sergei Mikhailovskii 9/16/2023 #1

我会说第二种变体是正确的。根据我的经验,如果你有一个基本的用例类/接口,通常它看起来像这样:

interface UseCase<I, O> {
    suspend operator fun invoke(param: I): O
}

假设你有一个子类:AddNoteUseCase

class AddNoteUseCase : UseCase<Note, Unit> {
    override suspend operator fun invoke(param: Note) {}
}

如果以这种方式将此用例作为参数传递给 VM:

class ViewModel(
    val addNoteUseCase: UseCase<Note, Unit>
) {
}

它仍然使你的代码具有可读性(因为你通过名称理解这个用例的作用)和可测试性(因为你可以在单元测试中通过任何你想要的实现)。恕我直言,没有必要为每个用例创建单独的抽象,因为它们都具有相同的接口 - 一个公共方法调用,仅此而已

评论

0赞 Shreyas Sparrow 9/18/2023
感觉是一样的。谢谢