假设我有一个具有内部状态的解析器。其中之一对应于完整且成功的解析。解析器具有包含解析结果的字段。只有完整且成功的解析,字段才可用。否则,在访问该字段时,将引发异常。
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
}
当数据和逻辑存储在一个对象中时,此方法正确吗? 还有哪些其他符合OOP原则的替代方案?
答案 0 :(得分:0)
一个选项:让parse()
方法返回解析结果(而不是将其存储在解析器的状态中)。该结果可能是具有两个具体子类的抽象类:一个用于成功(对于相关的结果信息使用getter),而一个对于失败(对于失败的原因使用getter)。