2017-04-15 14 views
0

多くのロギング情報(時間など)を持つメソッドの呼び出しのロギングを実装する必要があります。私はこれのようにすることができます:ロギング操作、より良い実装方法

var stopwatch = new Stopwatch(); 
OCRResult ocrResult = await ocr.GetTextAsync(dataStream, filename, language); 
stopwatch.Stop(); 
// log here, with time, result etc 

私はこのアプローチが嫌いです。まずはじめに、私は多くの場所で多くの呼びかけをしており、コードを公表する必要があります。第2に、このアプローチはSRP(単一の責任ある原則)に違反し、各呼び出しが1つの作業を行います。私はラッパーを行うか、Strategyパターンを使用する必要があります。いずれにしても、それを行うためにもう1つのクラスを作成する必要があります。しかし、それを実装する方法は?

+1

PostSharpのようなものは、この種のメソッド計測を注入することができます。あなたのプロジェクトが小さな面にあれば、それを無料で使うことさえできます。 – Crowcoder

+0

[この記事](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91)では、アプリケーションの設計方法を簡単に説明しています。パフォーマンスのプロファイリングとロギングに関わるクロスカッティングを追加し、PostSharpなどのコード製織ツールの使用を防ぎます。 – Steven

+1

@Stevenは、多くの継承が行われていない限り、Decoratorを扱いにくいものにすることに同意しました。 – Crowcoder

答えて

2

あなたはそれを関数の時間を計測し、ログの一般的な方法を作成することができます。

public static void LogFunc<T>(Func<T> func) 
{ 
    var stopwatch = Stopwatch.StartNew(); 
    T result = func(); 
    stopwatch.Stop(); 
    long time = stopwatch.ElapsedMilliseconds; 
    // log here, with time, result etc 
} 

LogFunc(async() => await ocr.GetTextAsync(dataStream, filename, language)); 

この方法のasyncバージョン:

public static async Task LogFuncAsync<T>(Func<Task<T>> func) 
{ 
    var stopwatch = Stopwatch.StartNew(); 
    T result = await func(); 
    stopwatch.Stop(); 
    long time = stopwatch.ElapsedMilliseconds; 
    // log here, with time, result etc 
} 

await LogFuncAsync(() => ocr.GetTextAsync(dataStream, filename, language)); 
+0

興味深い考えですが、func()を呼び出すと関数の実行を待機しません。それを正しく呼び出す方法は? –

+0

この関数の非同期バージョンを作成できます。 –

0

フォロー「Kfirガイ」の回答の私は変更を彼の答えは次のとおりです:

public static async Task LogFuncAsync<T>(Func<Task<T>> func) 
    { 
     var stopwatch = Stopwatch.StartNew(); 
     T result = await func(); 
     stopwatch.Stop(); 
     long time = stopwatch.ElapsedMilliseconds; 
     // log here, with time, result etc 
    } 

とそれを呼び出す:

await Utils.LogFuncAsync(async() => ocrResult = await ocr.GetTextAsync(dataStream, filename, language)); 
+0

あなたの答えは良いですが、私の編集したはずです。 –

関連する問題