ファイルを解析するメソッドをリファクタリングしようとしています。任意のサイズのファイルをサポートするには、固定バッファーを使用したチャンキング アプローチを使用する方法。
public int Parse()
{
// Get the initial chunk of data
ReadNextChunk();
while (lengthOfDataInBuffer > 0)
{
[parse through contents of buffer]
if (buffer_is_about_to_underflow)
ReadNextChunk();
}
return result;
}
上記の疑似コードは、(コンストラクター以外の) クラス内の唯一の public 非静的メソッドの一部です。このクラスは、ファイルの解析中に追跡する必要がある状態をカプセル化するためにのみ存在します。さらに、このメソッドがクラスで呼び出されると、再度呼び出すことはできません/すべきではありません。したがって、使用パターンは次のようになります。
var obj = new MyClass(filenameToParse);
var result = obj.Parse();
// Never use 'obj' instance again after this.
これは、何らかの理由で私を悩ませます。MyClass コンストラクターを非公開にし、Parse を静的メソッドに変更し、Parse メソッドをメソッドにスコープされた Parse のインスタンスに新規作成することができます。これにより、次のような使用パターンが得られます。
var result = MyClass.Parse(filenameToParse);
ただし、MyClass は静的クラスではありません。Parse メソッドでローカル インスタンスを作成する必要があります。
このクラスには 2 つのメソッドしかないため、Parse と (プライベート) ReadNextChunk の場合、Parse 内に ReadNextChunk ロジックを匿名メソッドとして埋め込むことで、Parse を単一の静的メソッドとして記述する方がクリーンではないのではないかと考えています。残りの状態は、メンバー変数ではなくローカル変数として追跡できます。
もちろん、ReadNextChunk を静的メソッドにして、すべてのコンテキストを渡すことで同様のことを実現できましたが、anon メソッドは外側のスコープにアクセスできたことを覚えています。
これは奇妙で醜いですか、それとも合理的なアプローチですか?