Доступность геттеров / свойств на основе состояния объекта (например, на основе состояния синтаксического анализа) - PullRequest
0 голосов
/ 07 июня 2019

Предположим, у меня есть парсер с внутренними состояниями.Один из которых соответствует полному и успешному разбору.У парсера есть поля, которые содержат результаты анализа.Поля должны быть доступны только при полном и успешном разборе.В противном случае при доступе к полю выдается исключение.

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
}

Правильн ли этот метод, когда данные и логика хранятся в одном объекте?Какие еще альтернативы соответствуют принципам ООП?

1 Ответ

0 голосов
/ 07 июня 2019

Один вариант: метод parse() возвращает результат анализа (вместо сохранения его в состоянии анализатора).Этот результат может быть абстрактным классом с двумя конкретными подклассами: один для успеха (с получателем (ями) для соответствующей информации о результате) и один для отказа (с получателем (ями) для причины отказа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...