حسین احمدی
بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

30 نکته برای نوشتن کد با کیفیت در سی شارپ

نوشتن کد با کیفیت و البته پروژه ای که از هر نظر مبتنی بر اصول تعریف شده باشد، نیازمند داشتن آگاهی از یکسری قواعد و قوانین است که کد نویسان و البته مدیران پروژه می بایست نسبت به آن ها آگاهی داشته باشند. عملیات Code Review پروسه ایست که کد نوشته مرور شده و بعد نهایی می شود. عملیات Code Review معمولاً توسط مدیران پروژه انجام می شود و البته برنامه نویسانی که به صورت انفرادی (Freelance) نیز کار می کنند، می بایست این اصول و قواعد را رعایت کنند. در این مطلب قصد دارم تا چک لیستی از مواردی که در هنگام مرور کدهایتان به کارتان خواهد آمد را در اختیار برنامه نویسان عزیز قرار دهم. البته تکرار این قواعد به مرور باعث می شود که به صورت ناخودآگاه این موارد را در کدهای خود رعایت کنید.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
  1. مطمئن شوید که پروژه شما هیچ اخطاری ندارد. شما می توانید لیست warning ها را از پنجره error list مشاهده کنید و نسبت به برطرف کردن آن ها اقدام کنید.
  2. سعی کنید همیشه عملیات Code Analysis را بر روی کدهای خود اجرا کنید. ابزارهای زیادی در این زمینه وجود دارند، هم خود Visual Studio به شما امکان انجام Code Analysis را می دهد و هم می توانید از ابزارهای جانبی استفاده کنید. یکی از بهترین ابزارهای موجود Resharper است که می توانید اصول و قواعد را نیز برای انجام Code Analysis در آن تعریف کنید.
  3. در تمامی قسمت های برنامه که امکان ارسال مقادیر null برای پارامترها وجود دارد، باید عملیات Null Checking انجام شود تا از بروز خطای NullReferenceException جلوگیری شود.
  4. برای خودتان یا تیمتان قواعد نام گذاری تعریف کنید و بر اساس آن کدها را بنویسید، برای مثال، خیلی از افراد برای نام گذاری field ها از کاراکتر __ در ابتدای نام گذاری استفاده کرده و خیلی ها خیر. مکانیزم های نام گذاری PascalCase و CamelCase را رعایت کنید، مخصوصاً برای نام گذاری کلاس ها، متغیرها و پارامترها.
  5. قبلاً در انجمن در مورد قواعد SOLID مطلبی ارسال کردم. حتماً با این قواعد آشنا شوید و در کد خود آن ها را رعایت کنید.
  6. از نوشتن کدهای تکراری خود داری کنید. اصطلاحا وجود Duplication در کد، فاجعه به حساب می آید. کدها باید به نحوی نوشته شوند که قابلیت Reusablity داشته باشند. می توانید برای شرایط خاص متدها و کلاس های generic تعریف کنید و در قسمت های مختلف از آن ها استفاده کنید. همچنین برای رابط کاربری سعی کنید User Control ایجاد کرده و در قسمت های مختلف از آن ها استفاده کنید.
  7. سعی کنید یکپارچگی را در کد خود حفظ کنید، اینکه در قسمتی از برنامه از int و در قسمتی دیگر از Int32 برای تعریف متغیر استفاده کنید اصلاً جالب نیست.
  8. کد خود را به نحوی بنویسید که قابل خواندن باشد. منظورم از قابل خواندن انتخاب نام مناسب برای متغیر ها، کاهش حلقه ها، کاهش if ها و خیلی از موارد دیگر است که می تواند به بالا بردن خوانایی کد شما کمک کند. کد باید به صورتی نوشته شود که سایر برنامه نویسان در تیم به راحتی متوجه عملکرد آن شوند.
  9. زمانی که از منابع مدیریت نشده یا اصطلاحاً Unmanaged Resources استفاده می کنید، مانند فایل ها، منابع تحت شبکه و ...، حتماً عملیات Dispose کردن این منابع را مد نظر بگیرید تا برنامه شما به بهترین شکل از منابع استفاده کند. استفاده از عبارت using هنگام استفاده از منابع و همچنین پیاده سازی الگوری Dispose در برنامه ها به شدت توصیه می شود.
  10. مدیریت خطا باید به بهترین شکل در برنامه انجام شود، هر قسمتی که احتمال بروز خطا توسط کاربر وجود دارد باید توسط ساختار try..catch مدیریت شود. همچنین از کلیه خطاهای اتفاق افتاده حتماً log تهیه کنید تا بتوانید در اولین فرصت نسبت به بررسی و رفع آن ها اقدام کنید.
  11. متدهای نوشته شده باید کوتاه باشند، معمولاً برای یک متد نباید بیش از 30 خط کد نوشته شود. در غیر این صورت باید متد نوشته شده به متدهای کوچکتر شکسته شود.
  12. پیش از check-out کردن یا check-in کردن فایل در source control حتماً کد جاری را با کدهای موجود در respository مقایسه کنید. می توانید از ابزارهای Code Compair استفاده کنید. به شخصه ابزار Beyond Compair که با ابزارهای Source Control نیز یکپارچه می شود را توصیه می کنم.
  13. برای کدها حتماً باید Unit Test نوشته شود. هر بخشی از کد که دارای Unit Test نباشد، بعدها برای شما مشکل ایجاد خواهد کرد.
  14. تا جایی که امکان دارد از نوشتن حلقه و شرط های تودرتو خودداری شود.
  15. در صورتی که کلاسی فقط یکبار در کد شما استفاده می شود بهتر است به جای تعریف کلاس از Anonymous Type ها استفاده کنید.
  16. استفاده از LINQ و عبارات Lambda به جای Anonymous Method ها به خوانایی کد شما به شدت کمک می کند.
  17. همگام استفاده از نوع های object و dynamic بسیار دقت کنید، درست است که می توان کار یکسانی با آن ها انجام داد اما در ماهیت این دو کلمه کلیدی تفاوت های بسیاری وجود دارد و باید نسبت به آن ها و شرایط استفاده از آن ها آگاهی کامل داشته باشید.
  18. سطوح دسترسی به بخش های کد باید به درستی رعایت شود، شاید کلاسی باید به صورت internal تعریف شود و نه به صورت public، نسبت به این موضوع دقت کافی داشته باشید.
  19. در قسمت هایی که باید ارتباط بین کدها به حداقل برسد، حتماً از interface ها استفاده شود. آشنایی با مفاهیم DI و IoC به شدت به شما در این زمینه کمک می کند.
  20. زمانی که کلاس ها از هم ارث بری می کنند، به درستی از کلمات کلیدی abstract و sealed استفاده کنید.
  21. استفاده از اعضاء static، مخصوصاً در برنامه های تحت وب به شدت خطرناک است و می تواند تاثیر زیادی در ایجاد مشکل در کد شما داشته باشد. در صورت استفاده از اعضاء static، حتماً مکانیزم های synchronization را در نظر بگیرید.
  22. در قسمت هایی که کار زیادی بر روی رشته ها انجام می شود، باید از کلاس StringBuilder استفاده شود.
  23. بررسی کنید که تمام قسمت های برنامه شما قابل اجرا باشند. اصطلاحی وجود دارد با نام Unreachable Code که به کدهایی گفته می شود که در طول اجرای برنامه شما، به هیچ عنوان اجرا نخواهند شد. در صورت وجود این کد ها آن ها را بررسی کرده و مشکل را حل کنید.
  24. در صورتی که به صورت تیمی کار می کنید و یک Library برای تیم نوشته شده است، حتماً برای آن متد XML Documentation ایجاد کنید.
  25. از فیلد های read-only و همچنین متغیرهای constant به درستی استفاده کنید.
  26. تا حد امکان از عملیات تبدیل یا Type Casting جلوگیری کنید.
  27. تا حد امکان برای کلاس ها متد ToString را override کنید و اطلاعات مورد نیاز برای آن کلاس را به صورت رشته برگردانید. این مورد خیلی بهتر از دریافت نام Type یک کلاس زمان اجرای متد ToString است.
  28. یکی از خطرناک ترین کارها، کپی کردن کد از سایر منابع است. سعی کنید تا حد امکان کد مورد نظر توسط خودتان یا اعضاء تیم نوشته شود تا بعدها برای تغییر آن کد دچار مشکل نشوید. (در اینجا منظورم استفاده از Component ها و ابزارهای آماده نیست).
  29. برنامه باید توسط ابزارهای Memory Profiler بررسی شود تا مشکلات احتمالی برنامه در مورد حافظه شناسایی شود.
  30. قسمت هایی از برنامه که با بانک اطلاعاتی در ارتباط است، در صورت عدم استفاده از ORM ها، حتماً مقادیر باید با استفاده از Parameter ها به Query ها ارسال شوند، نه به صورت مستقیم داخل رشته.

در این لیست سعی کردم چک لیستی از مواردی که می بایست زمان Code Review به آنها توجه کرد را با دوستان به اشتراک بگذارم. شما نیز اگر موردی مدنظرتان هست در نظرات می توانید ارسال کنید. امیدوارم که این مطلب مورد توجه دوستان عزیز قرار گرفته باشد. ITPRO باشید


حسین احمدی
حسین احمدی

بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ...

نظرات