我正在创建一个拉式解析器,它在很大程度上依赖于以顺序方式读取字符。解析器的状态随着字符的读取而变化,因此我们可以说有一个“上下文”指定如何解释下一个字符。
问题是我通常发现有一些方法应该是查询,但它们也修改了状态。
例如,这个方法:
private void string ReadIdentifier()
{
string identifier = ReadUntilTheseCharsAreFound("=", ";");
if (this.lastChar != "=")
{
this.state = States.ReadingProperty;
}
else
{
this.state = States.ReadingValue;
}
return identifier;
}
如您所见,这不仅会检索标识符,还会更改状态。如果最后一个字符是“=”,则状态为一,如果是“;” 国家是另一个。
这不符合 CQS 原则,我不太喜欢它:(
但鉴于它是一个解析器,也许这是最好的方法。所以我的问题是:你能想出一个更好的方法来做到这一点而不破坏 CQS 吗?
谢谢!