繁体   English   中英

KOTLIN 如何使用密封类减少 if 条件

[英]KOTLIN How to decrease if conditions by using sealed classes

我有一个用例 class 正在验证表单字段并在必要时传递错误。 我使用的结构让我觉得它是错误的。 你有什么建议吗? 如何减少 if 条件的数量?

用例 Class

suspend operator fun invoke(userInfo: UserInfo): Resource<Unit> {

    val a = userInfo.name.length < 3
    val b = userInfo.name.length > 10
    val c = userInfo.surname.length < 2
    val d = userInfo.surname.length > 10
     if (a){
       return Resource.Error(type = FormValidationError.NameFieldError(""))
    }
    if (b){
        return Resource.Error(type = FormValidationError.NameFieldError(""))
    }
    if (c){
        return Resource.Error(type = FormValidationError.LastNameError(""))
    }
    if (d){
        return Resource.Error(type = FormValidationError.LastNameError(""))
    }

    return currentUserRepository.insertCurrentUserInfo(userInfo)

}

资源 Class

sealed class Resource<T>(val data: T? = null, val message: String? = null) {
class Loading<T>(data: T? = null): Resource<T>(data)
class Success<T>(data: T?): Resource<T>(data)
class Error<T>(message: String? = null, data: T? = null, val type: FormValidationError? = null): Resource<T>(data, message)

}

FormValidationError Class

sealed class FormValidationError(val message: String? = null) {
   class NameFieldError(message: String?): FormValidationError(message)
   class LastNameError(message: String?): FormValidationError(message) 
}

密封类实际上与简化此代码无关。 由于所有 if 条件都是互斥的,因此您可以切换到使用when表达式。 此外,您可以使用带in的范围来减少案例数量。

suspend operator fun invoke(userInfo: UserInfo): Resource<Unit> {
    return when {
        userInfo.name.length !in 3..10 -> Resource.Error(type = FormValidationError.NameFieldError(""))
        userInfo.surname.length !in 2..10 ->Resource.Error(type = FormValidationError.LastNameError(""))
        else -> currentUserRepository.insertCurrentUserInfo(userInfo)
    }
}

您的错误和加载状态是否需要能够返回数据? 如果不是,您可以使您的数据不可为空,并将您的 Loading state 更改为object ,因为它不携带 state。 您定义它们的方式违背了密封 class 的目的。 它也可能只是一个 class 因为它总是具有所有可能的属性并且它使它们可以为空。 这就是我的做法,在这种情况下使用密封接口,因为它根本不需要保存通用的 state:

sealed interface Resource<T> {
    object Loading: Resource<Nothing>
    class Success<T>(val data: T): Resource<T>
    class Error(val message: String? = null, val type: FormValidationError? = null): Resource<Nothing>
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM