Предположим, у меня есть парсер с внутренними состояниями.Один из которых соответствует полному и успешному разбору.У парсера есть поля, которые содержат результаты анализа.Поля должны быть доступны только при полном и успешном разборе.В противном случае при доступе к полю выдается исключение.
interface Parser {
fun parse()
}
interface Data {
val propertyA: String
}
class SimpleParser: Parser, Data {
private var parserState = SimpleParserState.UNPARSED
// property (getter), available only when state equals to PARSED_ALL (i.e. if parsing done successfully)
private lateinit var _propertyA: String
override val propertyA: String
get() {
if (parserState === SimpleParserState.PARSED_ALL) {
return _propertyA
}
throw IllegalStateException("Parser's state is not PARSED_ALL. This property is unavailable")
}
override fun parse() {
if (parserState !== SimpleParserState.UNPARSED) {
throw IllegalStateException("Already parsed!")
}
// DO PARSING LOGIC
_propertyA = "parsed string"
parserState = SimpleParserState.PARSED_ALL
}
}
enum class SimpleParserState {
UNPARSED, PARSED_ALL, PARSED_PARTIAL, PARSED_NONE
}
Правильн ли этот метод, когда данные и логика хранятся в одном объекте?Какие еще альтернативы соответствуют принципам ООП?