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