从 UI 向 UseCase Android Clean Architecture 传递太多参数

Posted

技术标签:

【中文标题】从 UI 向 UseCase Android Clean Architecture 传递太多参数【英文标题】:Pass too much params from UI to UseCase Android Clean Architecture 【发布时间】:2021-03-15 11:25:28 【问题描述】:

我正在申请 Clean Architecture,但实际上还有很多问题。

假设,我的 API @POST fun createJob(@Body request: JobRequest)。并且参数是从 UI 提供的。所以,

    data:我创建了一个JobRequest,如下所示:
data class JobRequest(
    @Expose @SerializedName("p1") val p1: String?,
...
    @Expose @SerializedName("p7") val p7: String?
)
    domain: 我创建了一个CreateJobUseCase,如下所示:

class CreateJobUseCase(private val userRepository: UserRepository) :
    BaseUseCase<CreateJobUseCase.Input, Job>() 

    override suspend fun execute(input: Input): Job 
        return userRepository.createJob(input.p1, ...input.p7)
    

    data class Input(
       val p1: String,
       ....
       val p7: String,
   ) : BaseInput()

    presentation:我会从ViewModel 打电话,比如:
   createJobUseCase.execute(CreateJobUseCase.Input(p1, p2...p7)) 
     //handle output
   

我的问题是:

domain,我的UserRepository接口应该像A还是B?

A: suspend fun createJob(input: CreateJobUseCase.Input) : Job

or

B: suspend fun createJob(p1: String,... p7: String) : Job

在很多项目中,我看到他们使用B,似乎repository功能被清除了。但是,我认为A 仍然可以,因为它仍然遵循依赖规则,并且CreateJobUseCase.Input 已经包含了createJob 函数所需的内容。我错了吗?

【问题讨论】:

【参考方案1】:

这取决于您要在函数中放入什么逻辑。 总的来说,我认为你应该选择你更喜欢和更适合你需求的任何变体。

另外,如果您要使用相同类型的变量,我可以提出另一个选项C)。也许 vararg 会更好地满足您的需求?至少函数的构造函数会更短更简洁。例如:

suspend fun createJob(vararg p: String) 
    for (item in p) 
        println(item)
    

然后你可以这样调用你的函数:

createJob("1", "2", "3")

【讨论】:

感谢您的回答,您给出的 C 是我的特殊情况。我想听听更多关于正确方法的解释,因为我不确定我的解决方案。 例如,如果您打算用单元测试覆盖这个用例,您应该考虑如何将数据传递给createJob 函数。您会如何发现它对您更方便...假设您将进行 5 种不同的测试。将 A CreateJobUseCase.Input 传递给 createJob 函数是否更方便,或者将 B p1: String,... p7: String 传递给 createJob 函数会更方便,还是将 C vararg p: String 传递更方便到createJob 函数。不要担心正确的方法。满足你自己的需要。

以上是关于从 UI 向 UseCase Android Clean Architecture 传递太多参数的主要内容,如果未能解决你的问题,请参考以下文章

Android,如何从 UI 中删除视图?

Android:子线程向UI主线程发送消息

android asynctask向ui发送回调[重复]

Android开发——UI_片段

codevs 2494 Vani和Cl2捉迷藏

Android基础到进阶UI爸爸级 TextView介绍+实例