300. StopwatchBlock

[נכתב ע”י שני אלחרר]

אהלן.

בהמשך לטיפ היומי של אתמול.

לפעמים נרצה להשתמש בSyntax יותר יפה לבדיקת זמנים במחלקות שלנו. דרך אחת לעשות זאת היא לממש את המתודה Dispose של הממשק IDisposable כדי לכתוב את הזמן לConsole, בדרך כלל אני משתמש בשיטה הזו מכיוון שהיא נוחה יותר, ולקוד מהיר יותר נוח לי להשתמש בה בטווח הבינוני.

אז איך נעשה את זה?

  • ניצור מחלקה חדשה שבC’tor שלה יוצרת Stopwatch
  • ב Disposeניצא את הזמן לפונקציה אחרת

זה נראה בערך כך :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class StopwatchBlock : IDisposable
{
private readonly Stopwatch mStopwatch = Stopwatch.StartNew();
private readonly Action<TimeSpan> mOnEnd;
public StopwatchBlock(Action<TimeSpan> onEnd)
{
mOnEnd = onEnd;
}
#region IDisposable Members
public void Dispose()
{
mOnEnd(mStopwatch.Elapsed);
}
#endregion
}

ולצורך העניין, אם יש לי מתודה כזו :

1
2
3
4
static Action<TimeSpan> GetWriteTimeToConsole(string withName)
{
return timeSpan => Console.WriteLine("{0} Took {1}", withName, timeSpan);
}

אוכל להשתמש במחלקה שלי כך :

1
2
3
4
using (new StopwatchBlock(GetWriteTimeToConsole("DoHeavyWeightStuff")))
{
DoHeavyWeightStuff();
}

מרחיקי הלכת יצרו מתודות-עזר-סטטיות כאלו :

1
2
3
4
static IDisposable GetConsoleStopwatchBlock(string withName)
{
return new StopwatchBlock(GetWriteTimeToConsole(withName));
}

ואז ישתמשו בהן כך :

1
2
3
4
using (GetConsoleStopwatchBlock("DoHeavyWeightStuff"))
{
DoHeavyWeightStuff();
}

נחמד, לא?

החסרון בשיטה הזו נובע מביצועים, אך מדובר בהבדל זניח לעומת שימוש Native במחלקה Stopwatch. כמו כן, אי אפשר לעשות Reuse לStopwatchBlock.

בברכת Syntax קריא יותר - קוד בריא יותר.

שתף