الگوهای ابتدایی برای برنامه نویسی دات نت
در این پست چند الگوی شاید معمولی ولی بسیار مهم لیست شده.مطلب جالبیه تنها مشکلش اینه که مثال های اون به هر زبانی هست جز #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 ش رو برمیگردونیم.
براي مورد اول، حداقل دو راه حل براي زيباتر شدن وجود دارد:
پاسخحذف- استفاده از extension methods و معرفي متدهايي مانند GetSafeXYZ جهت توسعه كلاسهايي كه دسترسي به سورس آنها نداريم.
- استفاده از Null object pattern براي كلاسهايي كه دسترسي به سورس آنها وجود دارد.
برای مورد اول در صورت null بودن windows.JSON متغییر parsed_content چه مقداری خواهد گرفت؟ undefined یا null. در هر صورت باز هم شما مجبور به چک کردن این مورد هستید. امروزه اضافه کردن ویژگی به زبان کار پیچیدهای نیست مسئله اینجاست که سازنده زبان تا حد امکان نباید اجازه دهد که برنامه نویسان بتوانند کد ناخوانا یا ضد الگو بزنند.
پاسخحذفبرای مورد یک، اینطوری من راحترتم ;)
پاسخحذف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;
}
parsed_content برابر undefined ميشه.
پاسخحذفتوجه كنيد اين مورد براي اين انجام ميشه كه اون قسمت از كد NullReferenceException نده بر فرض اگه JSON نال باشه فراخواني متد parse باعث خطا ميشه(فراخواني متد يك شي نال) در واقع با تكنيك andand ما اطمينان حاصل ميكنيم شي مورد نظر ما (در اينجا JSON) نال نيست.
ببخشید می تونید جواب سوال من رو بدید؟
پاسخحذفچطوری میشه با کد سایز متن داخل textboxرو تغییر داد.
لطفا سوال مرتبط با موضوع بپرسید
پاسخحذفکپی و پیست سوال شما در مترجم گوگل
نتیجه
Font font = textBox1.Font;
float newSize = 18f;
textBox1.Font = new Font( font.FontFamily, newSize, font.Style);