۲۰ تا از نکات کلیدی برنامه نویسی سی شارپ (کدنویسی تمیز)
در این روزها، نوشتن کد کار دشواری نیست. با این حال، نوشتن کد تمیز و مقیاس پذیر آسان نیست. در این آموزش، در مورد برخی از نکات نوشتن کد #C تمیز برای پروژه های خود صحبت خواهیم کرد. در نگاه اول، هر سازنده ای که قبلاً کد شما را ندیده است، باید آن را تا حد ممکن درک کند. هر کلاس باید داستانی را تعریف کند. این به ما کمک می کند تا کد را بهتر درک کنیم.
در اینجا لیستی از نکات مهم برای نوشتن کد #C آورده شده است.
۱-از IDE خوب استفاده کنید
اول از همه، بهترین IDE موجود را انتخاب کنید. Visual Studio یکی از محبوب ترین و بهترین IDE ها برای # C و محصولی قوی و کاملاً رایگان مایکروسافت است. برخی از توسعه دهندگان، Rider IDE را نیز ترجیح می دهند (رایگان نیست). کار با این IDE ها باعث می شود کد شما مرتب بماند. Visual Studio دارای ویژگی های کاملاً پایدار Intellisense است که می تواند کد را اصلاح و تغییرات را پیشنهاد دهد.
۲-از اسامی معنی دار استفاده کنید
نامگذاری متغیرها احتمالاً سخت ترین قسمت کل چرخه عمر توسعه نرم افزار است. فکر کردن برای نام های معنی دار برای متغیرها و متد های شما بسیار وقت گیر است. اما گذر از این فرآیند و دادن نام های تصادفی نیز ایده خوبی نیست.
مثال بد:
- int d;
این ساده ترین راه برای نامگذاری متغیرها است، درست است؟ اما این کار را نکنید. نام خوب به سایر توسعه دهندگان کمک می کند تا زمینه و کاربرد متغیر / متد را درک کنند. در اینجا نحوه نام گذاری مناسب متغیرها آورده شده است.
مثال خوب:
- int daysToAppocalypse;
۳-از روش های کوهان شتر و پاسکال کیس استفاده کنید
جدا از انتخاب نام مناسب برای متغیرها، نحوه نوشتن نام ها را نیز حفظ کنید. در حالت ایده آل، ما از Camel Case و Pascal Case Notation به عنوان بهترین شیوه کد استفاده می کنیم. در متغیرهای خود از حروف بزرگ تصادفی استفاده نکنید. این فقط زیبا به نظر نمی رسد!
روش کوهان شتر
اصولاً حرف اول کلمه اول متغیر با حروف کوچک است و حرف اول هر کلمه دیگری که بعد آن می آید باید با حروف بزرگ باشد. هنگام نام گذاری متغیرهای محلی و آرگومان های متد، باید از این علامت گذاری استفاده کنید.
مثال بد:
- int RandomInteger;
- string FirstName;
مثال خوب:
- int randomInteger;
- string firstName;
روش پاسکال کیس
در اینجا حروف اول تمام کلمات باید با حروف بزرگ باشد. ما برای نام گذاری متدها و کلاس ها از این نوع علامت گذاری استفاده می کنیم.
مثال بد:
- class program
- {
- static void main(string[] args)
- {
- Console.WriteLine(“Hello World!”);
- }
- }
مثال خوب:
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine(“Hello World!”);
- }
- }
۴-به قالب بندی توجه کنید
قالب بندی کد، خوانایی کد را بهبود می بخشد. زبانه ها بر روی فضاها ، به یاد می آورید؟
- class Program
- {static void Main(string[] args)
- {Console.WriteLine(“Hello World!”);
- }
- }
کد بالا چطور است؟ خیلی آزار دهنده، آره؟ اکنون، Visual Studio یک ویژگی داخلی دارد تا کد شما را کاملاً قالب بندی کند. برای انجام این کار، به کلاس مربوطه رفته و CTRL + K و CTRL + D را فشار دهید. تغییرات را مشاهده می کنید؟
۵-هر زمان لازم شد نظرات را اضافه کنید
این چیزی است که همه سازندگان از آن متنفر هستند، مگر نه؟ با این حال، اضافه کردن چند خط نظر / شرح آنچه این روش انجام می دهد، در طولانی مدت به شما و سایر توسعه دهندگان کمک می کند. Visual Studio کار را برای شما بسیار آسان می کند. نگران نباشید، از متد مربوطه بالاتر رفته و /// را تایپ کنید، VS به طور خودکار یک الگوی نظر یا کامنت برای شما ایجاد می کند از جمله آرگومان های متد.
هر وقت این متد را صدا بزنید (از هرجای دیگر) ، Visual Studio نظر شما را نیز نشان می دهد.
فقط در مواقعی که شرایط از شما می خواهد، نظرات را اضافه کنید. به عنوان مثال، هنگامی که یک متد خاص بیش از حد پیچیده است و نیاز به توضیح زیاد دارد. این یکی از مواردی است که شما باید نظرات خود را اضافه کنید. به یاد داشته باشید که حفظ نظرات نیز به یک وظیفه تبدیل می شود، بنابراین از نظرات مختصر استفاده کنید.
۶-استفاده مجدد از کد
نوشتن کدی که قابل استفاده مجدد باشد بسیار حیاتی است. این کار خطوط کلی کد را در پروژه شما کاهش می دهد و آن را بسیار کارآمد می کند. شما نمی خواهید یک تابع را از طریق چندین کلاس کپی کنید. در عوض کاری که می توانید انجام دهید این است که، یک Shared Library Project ایجاد کنید و آن را در هر یک از پروژه های مورد نیاز مرجع قرار دهید. به این ترتیب، توابع قابل استفاده مجدد ایجاد می کنیم. در صورت نیاز به اصلاح، فقط باید کد موجود در کتابخانه مشترک را تغییر دهید، نه در همه جا.
۷-اندازه کلاس را کوچک نگه دارید
طبق اصول SOLID، شما باید کلاس ها را به بلوک های کوچک تفکیک کنید که فقط یک وظیفه واحد دارند. این به ما کمک می کند تا کدی بهم پیوسته داشته باشیم. مطمئن شوید که هنگام مشاهده یک کلاس نیازی به بارها و بارها پیمایش ندارید. این یک قانون کلی است.
۸-از الگوهای طراحی استفاده کنید
این کاری برای یک توسعه دهنده معماری است. برای تعیین اینکه چه نوع الگوهای طراحی را برای کدام سناریو به کار ببریم، تجربه زیادی لازم است. الگوهای طراحی در اصل الگوهایی هستند که می توانند ضمن معماری راه حل ها، یک راه حل قابل استفاده مجدد ارائه دهند.
۹-راه حل خود را به خوبی ساختار دهید
آیا شما راه حل های ساختاری می سازید؟ در تصویر زیر یکی از راه حل های در حال انجام که از معماری پیازی پیروی می کند را مشاهده می کنید.
هنوز هم می توان همه کارها را در یک پروژه انجام داد. اما به منظور مقیاس پذیری و پیوند آزادانه راه حل ها، آن ها را به لایه های مختلفی مانند Application ، Domain ، Infrastructure و غیره تقسیم می کنیم.
مزیت های دیگر:
برنامه نویسی سی شارپ رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی با ساخت اپلیکیشن، توسعه وب ... دانلود:
۱- قابلیت استفاده مجدد – اگر می خواهید از همان پروژه برای راه حل دیگری استفاده کنید، می توانید این کار را انجام دهید.
۲- امنیت بهتر
۳- قابلیت نگهداری بالا
۴- مقیاس پذیری
۵- وارون کردن کنترل ها و غیره
۱۰-از رشته ها / اعداد جادویی خودداری کنید
رشته های جادویی چیست؟ آنها رشته هایی هستند که مستقیماً در کد برنامه مشخص شده اند و تأثیر مستقیمی بر رفتار برنامه دارند. به عبارت دیگر، از رشته ها یا مقادیر سخت کدگذاری شده در برنامه استفاده نکنید. پیگیری چنین رشته هایی هنگام رشد برنامه بسیار دشوار است. همچنین این رشته ها می توانند با نوعی ارجاع خارجی مانند نام فایل، مسیر فایل، URL و غیره همراه شوند. در چنین مواردی، هنگامی که مکان منابع تغییر می کند، همه این رشته های جادویی باید به روز شوند یا در غیر این صورت برنامه خراب می شود. به مثال زیر توجه کنید:
- if(userRole == “Admin”)
- {
- //logic here
- }
به جای این ، می توانید موارد زیر را بنویسید:
- const string ADMIN_ROLE = “Admin”
- if(userRole == ADMIN_ROLE )
- {
- //logic here
- }
همچنین می توانید یک Enum برای User Roles ایجاد کنید و به راحتی از آن استفاده کنید. این یک روش تمیزتر برای نوشتن کد است.
۱۱-کد استفاده نشده را حذف کنید
غالباً روشی برای اظهارنظر درباره کد استفاده نشده وجود دارد. در نهایت هنگام کامپایل شدن برنامه، خطوط کد را افزایش می دهد. اگر نمی خواهید این اتفاق بیفتد، از کنترل های منبع مانند Git استفاده کنید تا مطمئن شوید در هر زمان می توانید به عقب برگردید. استفاده از Git را به کد توضیح دادن ترجیح دهید.
۱۲-از متد زنجیره ای استفاده کنید
این یک روش معمول است که به طور گسترده ای در کدهای پیش فرض تولید شده توسط مایکروسافت استفاده می شود. در اینجا، هر متد یک شی را برمی گرداند و این توابع در یک خط با هم زنجیر می شوند. آن را تشخیص می دهید؟ مثال زیر نمونه خوبی از متد زنجیره ای است.
- services.AddHealthChecks().AddSqlServer(_configuration.GetConnectionString(“DefaultConnection”));
در زیر یک مثال دقیق آورده شده است. ما یک کلاس student و یک متد تصادفی دیگر داریم که یک شی student با تعدادی داده را ایجاد و برمی گرداند.
- public class Student
- {
- public string Name { get; set; }
- public int Age { get; set; }
- }
- public Student SomeMethod()
- {
- Student testStudent = new Student();
- testStudent.Name = “Jay Krishna Reddy”;
- testStudent.Age = ۲۵;
- return testStudent;
- }
تنظیم مقادیر بر روی شی Student ممکن است برای ما توسعه دهندگان مسئله ای نباشد. شما می خواهید با ساده سازی کل این فرایند مشتری خود را راضی کنید. این همان جایی است که Fluent Interfaces وارد می شود. یک کلاس Fluent جدید ایجاد کنید همانطور که در زیر نشان داده شده است:
- public class StudentFluent
- {
- private Student student = new Student();
- public StudentFluent AddName(string name)
- {
- student.Name = name;
- return this;
- }
- public StudentFluent AddAge(int age)
- {
- student.Age = age;
- return this;
- }
- }
- public StudentFluent SomeMethod()
- {
- return new StudentFluent().AddName(“Jay Krishna Reddy”).AddAge(25);
- }
این بسیار منطقی است و خوانایی را در سطح کاملا جدیدی بهبود می بخشد، درست است؟ مثال ساده دیگر متد زنجیره ای به شرح زیر است:
- public string AnotherMethod()
- {
- string name = “Jay Krishna”;
- return name.Replace(“J”, “A”).Replace(“A”, “J”).Replace(“.”, string.Empty);
- }
۱۳-از Async / Await استفاده کنید
برنامه نویسی ناهمزمان راهی است که باید طی شود! برنامه نویسی ناهمزمان ضمن برخورد با تابع هایی که ممکن است مدتی طول بکشد تا محاسبات انجام شود، به بهبود کارایی کلی کمک می کند. به نظر می رسد در حین اجرای چنین تابع هایی، برنامه کامل برای کاربر نهایی مسدود شده باشد. این منجر به تجربه بد برای کاربر می شود. در چنین مواردی، ما از متد های async برای آزاد کردن نخ اصلی استفاده می کنیم.
۱۴-از ‘throw ex’ در بلوک catch استفاده نکنید
اگر نمی خواهید پس از گرفتن این استثنا، “throw ex” کنید و داده های ردیابی پشته را از دست دهید، فقط از ‘ throw’ استفاده کنید. با استفاده از این می توانید ردیابی پشته را نیز ذخیره کنید، که به نوعی برای اهداف تشخیص حیاتی است.
مثال بد:
- try
- {
- // Do something..
- }
- catch (Exception ex)
- {
- throw ex;
- }
مثال خوب:
- try
- {
- // Do something..
- }
- catch (Exception ex)
- {
- throw;
- }
۱۵-از اپراتور سه تایی استفاده کنید
مثال زیر را در نظر بگیرید. مطمئن هستیم که خیلی از شما هنوز هم این عمل را دنبال می کنید.
- public string SomeMethod(int value)
- {
- if(value == ۱۰)
- {
- return “Value is ۱۰”;
- }
- else
- {
- return “Value is not ۱۰”;
- }
- }
اما اگر راهی بهتر و تمیزتر وجود داشته باشد چه؟
اکنون چندین خط کد که قبلا نوشتیم می توانند با استفاده از عملگرهای سه گانه تبدیل به یک خط شوند.
- public string SomeMethod(int value)
- {
- return value == ۱۰ ? “Value is ۱۰” : “Value is not ۱۰”;
- }
۱۶-از Null Coalescing Operator استفاده کنید
به همین ترتیب، ما یک اپراتور دیگر نیز داریم که برای زمانی که شما مقدار null را چک می کنید، مفید است. ?? این اپراتور در # C با نام Null Coalescing Operator شناخته می شود.
مثال دیگری را در نظر بگیرید. در اینجا یک تابع کوچک وجود دارد که یک شی Student را به عنوان یک پارامتر در نظر می گیرد و شی null را بررسی می کند. اگر null است، یک شی جدید را با داده بر می گرداند، در غیر اینصورت همان شی را برمی گرداند.
- public Student SomeMethod(Student student)
- {
- if (student != null)
- {
- return student;
- }
- else
- {
- return new Student() { Name = “Jay Krishna Reddy” };
- }
- }
بیایید اپراتور را اضافه کنیم و تابع را نیز کوچک کنیم!
- public Student SomeMethod(Student student)
- {
- return student ?? new Student() { Name = “Jay Krishna Reddy” };
- }
۱۷-String Interpolation را ترجیح دهید
هر بار که می خواهیم مقادیر پویا را به رشته ها اضافه کنیم، قالب بندی ترکیبی را ترجیح می دهیم یا این که آن ها را با یک عملگر بعلاوه اضافه می کنیم.
- public string SomeMethod(Student student)
- {
- return “Student Name is ” + student.Name + “. Age is ” + student.Age;
- }
با شروع C # 6 ، ویژگی String Interpolation معرفی شد که یک نحو خوانا و جالب تر برای ایجاد رشته های قالب بندی شده فراهم می کند. در کد زیر نحوه استفاده از String Interpolation آورده شده است.
- public string SomeMethod(Student student)
- {
- return $”Student Name is {student.Name}. Age is {student.Age}”;
- }
۱۸-از Expression Bodied Method استفاده کنید
از این روش ها در سناریوهایی استفاده می شود که بدنه متد بسیار کوچکتر از حتی خود تعریف متد باشد. چرا باید براکت ها و خطوط کد را هدر دهیم؟ در اینجا نحوه نوشتن یک Expression Bodied Method آورده شده است.
public string Message() => “Hello World!”;
۱۹-از پارامترهای زیاد خودداری کنید
پارامترهای بسیار زیاد همیشه مانند کابوس هستند. اگر تمایل دارید که بیش از ۳ پارامتر ورودی به هر متدی داشته باشید، چرا آن را در یک شی یا چیز دیگری قرار نمی دهید؟ بیایید یک مثال کوچک را ببینیم.
- public Student SomeMethod(string name, string city, int age, string section, DateTime dateOfBirth)
- {
- return new Student()
- {
- Age = age,
- Name = name,
- //Other parameters too
- };
- }
احتمالاً دوست دارید مانند کد زیر باشد. ایده را دریافت کردید؟
- public Student SomeMethod(Student student)
- {
- return student;
- }
۲۰-Caught Errors را نادیده نگیرید
این کاری است که ما مرتباً انجام می دادیم. این احتمال وجود دارد که بسیاری از شما نیز این کار را انجام دهید. ما یک بلوک try-catch اضافه می کنیم و فقط از کنترل خطا چشم پوشی می کنیم، درست است؟ این یک روش خوب است که چنین خطاهایی را کنترل کنید و آن ها را در یک جدول یا دیسک وارد کنید.
- public void SomeMethod()
- {
- try
- {
- DoSomething();
- }
- catch
- {
- }
- }
- public void SomeMethod()
- {
- try
- {
- DoSomething();
- }
- catch (Exception ex)
- {
- LogItSomewhere(ex);
- }
- }
اگر این آموزش برایتان مفید بود به یادگیری ادامه دهید!
wow!!!
پاسخاین مقاله خیلی خوب بود! من کلی مقاله دیگه در باره این موضوع خوندم ولی از این خیلی بیشتر نکته یاد گرفتم.
واقعا ممنوم.