簡體   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