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

问题描述 投票:0回答:1

在干净架构中,主要核心是包含业务逻辑的用例层。现在在 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 clean-architecture use-case
1个回答
0
投票

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

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>
) {
}

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

© www.soinside.com 2019 - 2024. All rights reserved.