2

ファイルを解析するメソッドをリファクタリングしようとしています。任意のサイズのファイルをサポートするには、固定バッファーを使用したチャンキング アプローチを使用する方法。

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 メソッドは外側のスコープにアクセスできたことを覚えています。

これは奇妙で醜いですか、それとも合理的なアプローチですか?

4

3 に答える 3

0

必要なのは、質問で提案したものと同じように、インスタンスを作成する静的解析メソッドだけです

public class MyClass
{
     // your existing code.... but make the members and constructor private.


     public static int Parse(string filenameToParse)
     {
         return new MyClass(filenameToParse).Parse();
     }
}

それから

あなたが提案するようにそれを使用してください...

var result = MyClass.Parse(filenameToParse);
于 2013-07-10T03:59:06.833 に答える
0

ただし、MyClass は静的クラスではありません。Parse メソッドでローカル インスタンスを作成する必要があります。

静的メソッドを利用できるようにするために、静的クラスは必要ありません。たとえば、これはうまくいきます:

public class MyClass
{
    public static string DoStuff(string input)
    {
        Console.WriteLine("Did stuff: " + input);
        return "Did stuff";
    }
}

public class Host
{
    public void Main()
    {
        MyClass.DoStuff("something");
    }
}
于 2013-07-10T05:47:26.893 に答える