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