107. The maybe monad and nested null checking - Return extension method

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

ראינו פעם שעברה שאפשר להשתמש בExtension method ששמו With בשביל לבצע גישות בטוחות למאפיינים של אובייקט.

מה אם אנחנו רוצים להחזיר ערך דיפולטי כאשר לא ניתן לגשת לערך המקורי?

מצד אחד נראה שנוכל פשוט לבדוק האם התוצאה שחזרה היא null או לא, אלא שהנחה זו אינה נכונה.

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

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

ניתן לפתור את הבעיה באמצעות Extension method אחר, שנקרא לו לצורך העניין Return:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static TResult Return<TSource, TResult>
(this TSource source,
Func<TSource, TResult> accessor,
TResult defaultValue)
where TSource : class
where TResult : class
{
if (source == null)
{
return defaultValue;
}
else
{
return accessor(source);
}
}

כעת נוכל להשתמש בה בשיטה הבאה:

1
2
3
4
ZipCode zipCode =
company.With(x => x.Chairman)
.With(x => x.Address)
.Return(x => x.ZipCode, new ZipCode(12345));

קריאה זו מחזירה לנו את הZipCode במידה וניתן לגשת אליו בדרך הסטנדרטית, ובמידה ולא, היא מחזירה לנו ZipCode דיפולטי (12345).

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

שתף