[英]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.