プル パーサーを作成していますが、文字を順番に読み取ることに大きく依存しています。パーサーの状態は、文字が読み取られるたびに変化するため、次の文字をどのように解釈するかを指定する「コンテキスト」があると言えます。
問題は、通常、クエリであるはずのメソッドがいくつかあることに気づきますが、それらは状態も変更します。
たとえば、次の方法があります。
private void string ReadIdentifier()
{
string identifier = ReadUntilTheseCharsAreFound("=", ";");
if (this.lastChar != "=")
{
this.state = States.ReadingProperty;
}
else
{
this.state = States.ReadingValue;
}
return identifier;
}
ご覧のとおり、これは識別子を取得するだけでなく、状態も変更します。最後の文字が「=」の場合、状態は 1 になり、「;」の場合は状態が 1 になります。状態は別です。
これはCQSの原則に準拠しておらず、あまり好きではありません:(
しかし、これがパーサーであることを考えると、これが最善の方法かもしれません。私の質問は、CQS を壊さずにこれを行うためのより良い方法を考えてもらえますか?
ありがとう!