الگوهای ابتدایی برای برنامه نویسی دات نت

در این پست چند الگوی شاید معمولی ولی بسیار مهم لیست شده.مطلب جالبیه تنها مشکلش اینه که مثال های اون به هر زبانی هست جز #C.
تو این پست معادل های دات نت ی اون لیست شده.
1-ارزیابی موجود بودن یک شی (null نبودن) قبل از فراخوانی متدها و خواص های اون
تکنیکی به نام “andand” وجود داره که طی اون هنگام فراخوانی مثلا یک متد یک شی نام اون شی رو با فراخوانی متدش AND منطقی میکنیم و این باعث میشه تنها در صورتی که شی ما موجود باشه (null نباشه) متد مربوطه فراخوانی شه.
به این مثال تو زبان JavaScript توجه کنید

var parsed_content = window.JSON && window.JSON.parse("{}");

تا جایی که من میدونم و سرچ هم کردم چنین ویژگی تو #C موجو نیست.
و اما این کار رو به روش های دیگه ی میشه انجام داد مثلا با یه IF قبلش چک کنیم شی ما null نباشه تنها مشکلش اینه که در صورتی که شی ما تو در تو باشه تعداد IF های ما زیاد میشه.

const string xmlDoc =
               @"
                <opml version=""1.0"">
                <head>
                    <title>Mohammad subscriptions in Google Reader</title>
                </head>
                </opml>";

XDocument xDocument = XDocument.Parse(xmlDoc);
var xElement = xDocument.Element("opml");
if (xElement != null)
{
    var element = xElement.Element("head");
    if (element != null)
    {
        var xElement1 = element.Element("title");
        if (xElement1 != null)
        {
            var headXElement = xElement1.Value;
        }

    }
}

خیلی زشته…

2-استفاده از مقادیر پیش فرض در هنگام تخصیص به یک متغییر(در صورت نامعتبر بودن مقدار تخصیصی)
با این کار شما از شر مشکلات احتمالی ناشی از  مقادیر null و نامعتبر در ادامه برنامه راحت میشید تقریبا کاری که در Linq داریم OrDefault ها.

var headXElement = string.IsNullOrWhiteSpace(xElement1.Value)
                                               ? "YOURNAME subscriptions in Google Reader"
                                               : xElement1.Value;

در کد بالا در صورتی که تگ title ما خالی باشه از مقدار پیش فرض YOURNAME استفاده میکنیم.

3-مقایسه کردن برابری یکه متغییر با چندین مقدار معین
فرض کنید متغیری بنام currentDay دارید میخواهید چک کنید ببینید currentDay روز زوج هست.
شاید اولین روشی که انجام بدیم کد زیر باشه

if (currentDay == "شنبه" || currentDay == "دوشنبه" || currentDay == "چهارشنبه")

بهتره اون مقادیر رو تو لیستی (آرایه) داشته باشیم و currentDay رو داخل اون چک کنیم.

 var evenDays = new List { "شنبه", "دوشنبه", "چهارشنبه" };
 if (evenDays.Contains(currentDay))
  {
     var isEven = true;
  }

4-شرط های پیچده و تکرارشونده رو به متد تبدیل کنید
این نکته تو سری پست های جناب نصیری در رابطه با Refactoring برسی شده(البته با روشی متفاوت)
شرط‌هاي تركيبي را كپسوله كنيد
در واقع هدف بالا بردن خوانایی کد هست

5-حفظ کردن نتیجه ی متدهای تکرارشونده
یکی از مزیت های تبدیل شرط های پیچیده در قالب یک متد استفاده از نتیجه ی اون تو فراخوانی های بعدی هستش.

readonly Dictionary _validDays = new Dictionary();
private bool IsValidDay(string day)
{
    bool lookup;
    if (_validDays.TryGetValue(day, out lookup))
        return lookup;
            
    //lookup=خروجی یک محاسبه پیچیده و گرفتن دیتا از سرور های ناسا

    _validDays[day] = lookup;
    return lookup;
}

مثلا تو کد بالا ما میایم نتیجه فراخوانی های قبلی رو تو یک دیکشنری ذخیره میکنیم و در متد قبل از انجام محاسبات دیکشنری رو جستجو میکنیم اگه پارامتر ورودی متد در Key های اون دیکشنری بود Value ش رو برمیگردونیم.

نظرات

  1. براي مورد اول، حداقل دو راه حل براي زيباتر شدن وجود دارد:
    - استفاده از extension methods و معرفي متدهايي مانند GetSafeXYZ جهت توسعه كلاس‌هايي كه دسترسي به سورس آن‌ها نداريم.
    - استفاده از Null object pattern براي كلاس‌هايي كه دسترسي به سورس آن‌ها وجود دارد.

    پاسخحذف
  2. برای مورد اول در صورت null بودن windows.JSON متغییر parsed_content چه مقداری خواهد گرفت؟ undefined یا null. در هر صورت باز هم شما مجبور به چک کردن این مورد هستید. امروزه اضافه کردن ویژگی به زبان کار پیچیده‌ای نیست مسئله اینجاست که سازنده زبان تا حد امکان نباید اجازه دهد که برنامه نویسان بتوانند کد ناخوانا یا ضد الگو بزنند.

    پاسخحذف
  3. برای مورد یک، اینطوری من راحترتم ;)

    Element xElement ,element ,xElement1 ;
    xElement = xDocument.Element("opml");
    if    (xElement != null &&
        (element = xElement.Element("head")) != null &&
        (xElement1 = element.Element("title")) != null)
    {
        var headXElement = xElement1.Value;
    }

    پاسخحذف
  4. parsed_content برابر undefined ميشه.
    توجه كنيد اين مورد براي اين انجام ميشه كه اون قسمت از كد NullReferenceException نده بر فرض اگه JSON نال باشه فراخواني متد parse باعث خطا ميشه(فراخواني متد يك شي نال) در واقع با تكنيك andand ما اطمينان حاصل ميكنيم شي مورد نظر ما (در اينجا JSON) نال نيست.

    پاسخحذف
  5. ببخشید می تونید جواب سوال من رو بدید؟
    چطوری میشه با کد سایز متن داخل textboxرو تغییر داد.

    پاسخحذف
  6. لطفا سوال مرتبط با موضوع بپرسید
    کپی و پیست سوال شما در مترجم گوگل
    نتیجه
           
    Font font = textBox1.Font;
    float newSize = 18f;
    textBox1.Font = new Font( font.FontFamily, newSize, font.Style);

    پاسخحذف

ارسال یک نظر

پست‌های معروف از این وبلاگ

lnav ابزاری بسیار کاربردی برای پیمایش لاگ ها در لینوکس و البته مک

ساختن ایمیج های داکری به کمک BuildKit - بخش دوم

ساختن ایمیج های داکری به کمک BuildKit - بخش اول