1

我正在创建一个拉式解析器,它在很大程度上依赖于以顺序方式读取字符。解析器的状态随着字符的读取而变化,因此我们可以说有一个“上下文”指定如何解释下一个字符。

问题是我通常发现有一些方法应该是查询,但它们也修改了状态。

例如,这个方法:

private void string ReadIdentifier() 
{
    string identifier = ReadUntilTheseCharsAreFound("=", ";");
    if (this.lastChar != "=")
    {
        this.state = States.ReadingProperty;
    } 
    else 
    {
        this.state = States.ReadingValue;
    }

    return identifier;
}

如您所见,这不仅会检索标识符,还会更改状态。如果最后一个字符是“=”,则状态为一,如果是“;” 国家是另一个。

这不符合 CQS 原则,我不太喜欢它:(

但鉴于它是一个解析器,也许这是最好的方法。所以我的问题是:你能想出一个更好的方法来做到这一点而不破坏 CQS 吗?

谢谢!

4

0 回答 0