В моем Ktor REST API я получаю JSON. Для меня это удобно десериализовать в простые классы данных kotlinx.serialization
. Прежде чем я смогу продолжить использовать эти данные, я должен применить некоторую проверку. Затем я могу передать его другим частям кода.
Я хотел бы получить четкое разделение между десериализованными, но не проверенными данными, самой проверкой и проверенным кодом.
Например, у меня есть кое-что с эффектом:
@Serializable
data class Input(val something: Int)
fun Input.validate() {
if(something < 5) { throw WhateverException("invalid") }
}
Но есть несколько проблем с этим: При получении экземпляра Input
в любом месте, я не могу быть уверенэто уже было подтверждено, поэтому, чтобы быть в безопасности, я позвоню validate()
снова.
Итак, чтобы избежать этого, я бы хотел, чтобы validate()
возвратил некоторую версию Input
, которая сообщает мне, что данные действительны, и чтобы я мог иметь сигнатуры методов в моей кодовой базе, которые принимают только проверенные данные.
Я знаю, что могу скопировать класс Input
в частный класс с именем ValidatedInput
и получить validate()
, который возвращает это, но это похоже на дублирование кода. (В итоге я получу десятки классов, таких как Input
.) Также это будет препятствовать тому, чтобы интерфейс, указывающий Input
, имел метод validate
и возвращал что-то вроде Validated<Input>
Как мне спроектировать свои классы и методы, чтобы четко выразить это разделение, без повторения кода?