jak zdefiniować ogólne zasady walidacji pól w aplikacji

0

Aplikacja składa się z wielu formularzy, dodatkowo jest sporo komunikacji z innymi serwisami po REST i SOAP. Problemem są często białe znaki jak np. " "
Czy dobrym rozwiązaniem byłoby zdefiniować listę znaków (np. w propertisach), które są nieakceptowalne i je sprawdzać za każdym razem? Czy może jest jest jakaś biblioteka, która by to ogarniała?

1
masjav napisał(a):

Aplikacja składa się z wielu formularzy, dodatkowo jest sporo komunikacji z innymi serwisami po REST i SOAP. Problemem są często białe znaki jak np. " "
Czy dobrym rozwiązaniem byłoby zdefiniować listę znaków (np. w propertisach), które są nieakceptowalne i je sprawdzać za każdym razem? Czy może jest jest jakaś biblioteka, która by to ogarniała?

Dodanie biblioteki w takim miejscu to byłby bardzo średni pomysł, z uwagi na to że byłoby to znaczna i ścisła zależność Twojej apki.

Ja bym tego w ogóle nie robił na poziomie komunikacji (jak Rest czy SOAP), tylko po prostu rozparsowałbym żądania na modele biznesowe, i dopiero w nich umieścił odpowiednią walidacje.

0

Już jest, proszę:

interface ValidationRule<T, R> {
    fun applyValidationRule(objectToValidate: T): R
}

class Validator<T, R>(private val rules: List<ValidationRule<T, R>>) {
    fun applyRules(objectToValidate: T): List<R> {
        return rules.map { it.applyValidationRule(objectToValidate) }.toList()
    }
}

I jeszcze przykład użycia:



data class ValidationResponse(val correct: Boolean, val message: String)

class NoTrailingSpaces : ValidationRule<String, ValidationResponse> {
    override fun applyValidationRule(objectToValidate: String): ValidationResponse {
        if (objectToValidate.isEmpty()) return ValidationResponse(true, "Empty string")
        if (objectToValidate.last() == ' ') return ValidationResponse(false, "String has empty space(s) at the end")

        return ValidationResponse(true, "Everything OK")
    }
}

fun main() {
    val validator = Validator(listOf(NoTrailingSpaces()))

    val stringToCheck = "   String "
    val validationResults = validator.applyRules(stringToCheck)

    validationResults.map { it.message }.forEach{ println(it) }
}

Tworzysz sobie te klasy raz, możesz składać jak lubisz. Tak, wiem, da się funkcyjnie i ładniej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1