4

このようなブロックで構成されるクラス TestSeq とメソッド Go() を使用したテスト アプリケーションがあります。

            _writer.WriteLine("Doing foo action...");
            var stopwatch = Stopwatch.StartNew();
            // foo - some work here
            stopwatch.Stop();
            _writer.WriteDone("Results of foo action.", stopwatch.Elapsed);

「一部の作業」では、WCF クライアントへのさまざまな呼び出しがあります (CRUD アクション、フィルターなど)。

したがって、多くのコードが繰り返され、明らかにリファクタリングをここで行う必要があります。クラスTestActionを作成することを考えていますが、その「いくつかの作業」部分をその中に入れる最良の方法は何ですか。

これは非常に単純な問題のように思えますが、どのキーワードを検索すればよいかわかりません。なので、キーワード(パターン名とか)やリンクだけで回答いただけると嬉しいです。

4

1 に答える 1

5

他にもあると思いますが、私の考えでは、この定型コードには 2 つの方法があると思います。

方法 1 : using 構文を使用して対象のコードをラップする

class MeasuredOperation : IDisposable
{
    Stopwatch stopwatch;
    string message;

    public MeasuredOperation(string message)
    {
        Console.WriteLine("Started {0}", message);
        stopwatch = Stopwatch.StartNew();
        this.message = message;
    }

    public void Dispose()
    {
        stopwatch.Stop();
        Console.WriteLine("Results of {0} Elapsed {1}", this.message, this.stopwatch.Elapsed);
    }
}

    static void Main(string[] args)
    {
        using (new MeasuredOperation("foo action"))
        {
            // Do your action
        }
    }

方法 2 : 新しい関数を作成し、コード ブロックをデリゲートとして渡す

static void MeasuredAction(string message, Action action)
{
    Console.WriteLine("Started {0}", message);
    var stopwatch = Stopwatch.StartNew();
    action();
    stopwatch.Stop();
    Console.WriteLine("Results of {0} Elapsed {1}", message, stopwatch.Elapsed);
}

static void Main(string[] args)
{
    MeasureAction(delegate()
    {
        // do work
    });
}
于 2012-04-22T07:28:32.807 に答える