۱۳۸۷/۱۲/۱۹

اشتباهات متداول برنامه‌نويس‌هاي دات نت


اشتباه 1:
استفاده از

throw ex;
بجاي استفاده از
throw;
در حالت اول، تمام stack trace موجود تا نقطه‌ي فراخواني دستور ذكر شده پاك خواهند شد، اما در حالت دوم stack trace‌ حفظ شده و ديباگ كردن كد را ساده مي‌كند.

اشتباه 2:
درك اشتباه عملكرد متد replace :
string s = "Take this out";
s.Replace("this", "that"); //wrong
بجاي استفاده از :
s = s.Replace("this", "that");  //correct

اگر از fxCop استفاده كنيد، اينگونه خطاها را (عدم استفاده از مقدار بازگشتي) گوشزد مي‌كند.

اشتباه 3:
استفاده‌ي بي دقت از متغيرهاي استاتيك در يك برنامه وب. دو مثال زير را در نظر بگيريد:
public static string GetCookieName(Cookie c)
{
return c.Name;
}

static List<string> cookieList = new List<string>();
public static void AddToCookieList(Cookie c)
{
cookieList.Add(c.Name);

}

برنامه‌هاي وب ذاتا چند ريسماني هستند و زمانيكه يك متغير را از نوع استاتيك تعريف مي‌كنيد، اين متغير، هنگام مراجعه‌ي كاربران بين آن‌ها به اشتراك گذاشته مي‌شود و امكان تخريب يا استفاده‌ي ناصحيح از مقادير آن‌ها وجود خواهد داشت. در حالت اول نيازي به مباحث همزماني و قفل كردن منابع نيست زيرا متغيري كه در متد استفاده مي‌شود، thread safe است اما cookieList در مثال دوم خير و حتما هنگام استفاده از آن بايد مباحث قفل كردن منابع را درنظر داشت. (حتي اگر برنامه‌ي شما از نوع وبي هم نيست اما چند ريسماني است اين مطلب باز هم صادق مي‌باشد)


اشتباه 4:
مقابله با خطاها به شكلي نادرست: (اصطلاحا خفه كردن خطاها!)
 try
{
//something
File.Delete(blah);
}
catch{}
در اين حالت اگر خطايي رخ دهد كاربر متوجه نخواهد شد دقيقا مشكلي وجود داشته يا خير و علت آن چيست.
هرچند گاهي از اوقات اگر خطاي حاصل براي ما اهميتي نداشت مي‌توان از آن استفاده نمود، در غيراينصورت بايد حتما از اين روش پرهيز كرد.

اشتباه 5:
ارائه‌ي برنامه‌هاي ASP.Net با گزينه‌ي پيش فرض Debug=true در web.config كه پيشتر در مورد آن در اين سايت بحث شده است.


اشتباه 6:
عدم استفاده از امكانات ويژه‌ي دات نت فريم ورك هنگام كار با رشته‌ها:
string s = "This ";
s += "is ";
s += "not ";
s += "the ";
s += "best ";
s += "way.";

StringBuilder sb = new StringBuilder();
sb.Append("This ");
sb.Append("is ");
sb.Append("much ");
sb.Append("better. ");

زمانيكه نياز به كنار هم قرار دادن رشته‌هاي مختلف وجود داشت و تعداد ‌آن‌ها نيز زياد بود، مثال دوم توصيه مي‌شود.
البته در مثال فوق كه تعداد كمي رشته قرار است با هم جمع شوند، كامپايلر به اندازه‌ي كافي هوشمند خواهد بود كه تمام ‌آن‌ها را كنار هم قرار دهد و تفاوتي در كارآيي احساس نشود، حتي روش اول سريع‌تر از روش دوم خواهد بود، اما زمان استفاده از هزاران رشته، اين تفاوت محسوس است.

اشتباه 7:
عدم استفاده از عبارت using هنگام استفاده از اشيايي از نوع Idisposable . مثالي در اين مورد.

using (StreamReader reader=new StreamReader(file))
{
//your code here

}

اشتباه 8:
فراموش كردن بررسي نال بودن يك شيء هنگام استفاده از آن.
string val = Session["xyz"].ToString();

اين نوع كد نويسي يكي از اشتباهات متداول تمامي تازه واردان به ASP.Net است. حتما بايد پيش از استفاده از متد ToString بررسي شود كه آيا اين سشن نال است يا نه. در غيراينصورت حاصل كار فقط يك exception خواهد بود. (استفاده از افزونه‌ي ري شارپر در اين موارد كمك بزرگي است، زيرا به محض قرار گرفتن مكان نما روي شيءايي كه احتمال نال بودن آن ميسر است، يك راهنما را به شما ارائه خواهد كرد)

اشتباه 9:
بازگشت دادن يك property عمومي از نوع ليست‌هاي جنريك.
با توجه به اينكه اين نوع ليست‌ها فقط خواندني نيستند و امكان دستكاري اطلاعات آن توسط فراخوان وجود دارد، توصيه مي‌شود از نوع جنريك IEnumerable استفاده شود. همچنين توصيه شده است هنگام انتخاب نوع پارامترهاي ورودي يك متد نيز به اين مورد دقت شود.