109. The maybe monad and nested null checking - Do extension method

בהמשך לשבוע האולי טוב,

לפעמים אנחנו מעוניינים לבצע איזשהי פעולה בין בגישה לProperty פנימי, במידה ואחד השדות בדרך הוא לאnull.

למשל,

1
2
3
4
5
6
7
8
9
10
11
if ((company != null) &&
(company.Chairman != null))
{
company.Chairman.Address =
GetAddressFromDB(company.Chairman);
if (company.Chairman.Address != null)
{
zipCode = company.Chairman.Address.ZipCode;
}
}

כאן אנחנו ממלאים את הכתובת של company.Chairman במידה והוא לא null, וממשיכים לנסות לגשת בסופו של דבר לZipCode.

נוכל לעשות את זה בגישה דומה למה שראינו בשאר השבוע בצורה הבאה:

נגדיר Extension Method כזה בשם Do לצורך העניין:

1
2
3
4
5
6
7
8
9
10
11
public static TSource Do<TSource>
(this TSource source,
Action<TSource> action)
where TSource : class
{
if (source != null)
{
action(source);
}
return source;
}

זה Extension Method שמקבל אובייקט וdelegate, ומבצע את הDelegate במידה והאובייקט אינו null.

כעת נוכל לכתוב את הקוד למעלה בצורה הבאה:

1
2
3
4
5
ZipCode zipCode =
company.With(x => x.Chairman)
.Do(x => x.Address = GetAddressFromDB(x))
.With(x => x.Address)
.With(x => x.ZipCode);

כמה הערות על סדרת הטיפים הזאת:

  • היא מבוססת על מאמר שקראתי בבלוג devtalk.net שנקרא בשם דומה (Chained null checks and the Maybe monad). ממליץ לקרוא למי שהתעניין בסדרה. יש שם גם דוגמה של כותב הבלוג מהעולם האמיתי.
  • אני לא אומר שמעכשיו תכתבו את כל הקוד שלכם בצורה הזאת, וגם לא אמרתי את זה בשום מקום. אחת המטרות של הטיפ היומי היא לחשוף את קוראיו לרעיונות מעניינים ולהרחיב אופקים. בקיצור, אני לא אומר אם להשתמש בכתיבה הזאת או לא. אם אתם רואים שכתיבה כזו יכולה להתאים לכם לפרויקט ולחסוך לכם עבודה, שווה לנסות.

המשך יום אולי טוב

שתף