Android Kotlin:检查多个布尔函数的惯用方法

Android Kotlin:检查多个布尔函数的惯用方法,android,kotlin,Android,Kotlin,我试图通过多次调用相同的函数来验证表单。我的目标是isFormValid函数应该“等待”所有函数被调用,然后返回布尔值 我目前的解决方案是可行的,但看起来确实很糟糕。难道没有更好的办法吗 FormValidator类 谢谢你的帮助。如果已经有这样的问题,那么很抱歉我打开了另一个问题。您可以使用一个列表及其。所有实现: fun isFormValid():Boolean=listOf( formValidator.ValidateMinLengtet(btNumber,BTNumberRem,7)

我试图通过多次调用相同的函数来验证表单。我的目标是
isFormValid
函数应该“等待”所有函数被调用,然后返回布尔值

我目前的解决方案是可行的,但看起来确实很糟糕。难道没有更好的办法吗

FormValidator类
谢谢你的帮助。如果已经有这样的问题,那么很抱歉我打开了另一个问题。

您可以使用一个列表及其
。所有
实现:

fun isFormValid():Boolean=listOf(
formValidator.ValidateMinLengtet(btNumber,BTNumberRem,7),
formValidator.validateNormalET(etFirstName,etFirstNameEM),
formValidator.validateNormalET(etLastName,etLastNameEM),
formValidator.validateEmail(etEmail,etEmailEM),
formValidator.ValidateMinLengtet(etPostCode,etPostCodeEM,5),
formValidator.validateNormalET(etCity,etCityEM),
formValidator.validateNormalET(etStreet,etStreetEM),
formValidator.validateNormalET(etHouseNumber,ethouseNumberRem)
)
.所有{it}
这样你就遵循了开放/封闭原则。
如果您想让它稍微短一点,可以使用
和(formValidator){}
-scope,就像在注释中发布的那样

编辑
如果希望它使用尽可能少的资源,可以将列表类型转换为布尔生产者:
()->boolean

fun isFormValid():Boolean=listOf(
{formValidator.validateMinLengtet(btNumber,btNumberRem,7)},
{formValidator.validateNormalET(etFirstName,etFirstNameEM)},
...
)
.all{it()}

要使其略短一些,可以使用`with(formValidator){}`作用域,这样就不必在每一行中都编写
formValidator
。但是,这将是一个漫长的过程function@iknow看起来是朝着正确的方向迈出了一步,但实际上仍然很糟糕。它会检查所有情况吗?我不确定,但我认为当您使用
时,所有函数都会执行,但如果您在第一次
错误之后使用
和&
运算符函数,则不会执行。因此,在您的情况下,当
validateMinLength
返回
false
时,其他所有函数都不会执行,
isFormValid
立即返回
false
。@我知道这是可行的,但出于好奇,可能有更好的解决方案,这如何符合打开/关闭原则?我发现在这两种情况下,如果要添加新的验证,仍然需要修改代码。@Siddharthakamaria Open for extension:如果需要其他属性,请按项目扩展列表;关闭以进行修改:“所有必须为真”的逻辑不会改变。与
相反。。和。。而且..
解决方案,每个
都是一个修改。这看起来是一个很好的解决方案。但我有两个问题:“它”在。all中到底意味着什么?使用布尔生成器的好处是什么?@Andrew我想你对kotlin很陌生,所以我建议你在第一个问题中使用它。生产者(这里称为lambda)的好处是,只有在真正需要时才执行其中的函数。如果第一个元素已经为false,那么其余元素将永远不会执行,也不会从cpu/threads/中获得负载@Neo好的,谢谢,但我在使用这种方法时遇到了一个问题。它说:将lambda返回类型更改为()->Boolean
class FormValidator(private val context: Context) {

// some strings

private fun String.isValidEmail() = android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()

fun validateNormalET(editText: MutableLiveData<String>, editTextEM: MutableLiveData<String>): Boolean {
    if (editText.value.isNullOrEmpty()) {
        editTextEM.value = emptyFieldError
        return false
    }
    return true
}

fun validateMinLengthET(editText: MutableLiveData<String>, editTextEM: MutableLiveData<String>, minLength: Int): Boolean {
    val errorMessage = when {
        minLength < 5 -> postCodeTooFewChar
        minLength < 7 -> btNumberTooFewChar
        else -> "Error"
    }
    if (editText.value.isNullOrEmpty()) {
        editTextEM.value = emptyFieldError
        return false
    } else if (editText.value.toString().length < minLength) {
        editTextEM.value = errorMessage
        return false
    }
    return true
}

fun validateEmail(editText: MutableLiveData<String>, editTextEM: MutableLiveData<String>): Boolean {
    if (editText.value.isNullOrEmpty()) {
        editTextEM.value = emptyFieldError
        return false
    } else if (!editText.value.toString().isValidEmail()) {
        editTextEM.value = emailNotValidError
        return false
    }
    return true
}
fun isFormValid(): Boolean =
    formValidator.validateMinLengthET(btNumber, btNumberEM, 7) and
    formValidator.validateNormalET(etFirstName, etFirstNameEM) and
    formValidator.validateNormalET(etLastName, etLastNameEM) and
    formValidator.validateEmail(etEmail, etEmailEM) and
    formValidator.validateMinLengthET(etPostCode, etPostCodeEM, 5) and
    formValidator.validateNormalET(etCity, etCityEM) and
    formValidator.validateNormalET(etStreet, etStreetEM) and
    formValidator.validateNormalET(etHouseNumber, etHouseNumberEM)