فصل 36 از 40 درس 1 از 1

اصول طراحی کد و Clean Code

اصول طراحی کد و Clean Code

بخشی از آموزش جامع C# و .NET 10

محتوای درس اصول طراحی کد و Clean Code

کد تمیز صرفاً کد کوتاه نیست؛ باید قصد را روشن بیان کند، تغییرپذیر باشد و هزینه فهم و نگهداری را کاهش دهد. نام‌گذاری، اندازه متد و مرزبندی مسئولیت‌ها نقش اصلی دارند.

۱. Naming

نام باید معنای دامنه‌ای و نقش عضو را منتقل کند. اختصارهای مبهم و نام‌های عمومی مانند data و manager هزینه فهم را افزایش می‌دهند.

مثال

int maximumRetryCount=3;
         static decimal CalculateTotal(decimal price,int qty)=>price*qty;

در این مثال، مفهوم «Naming» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۲. Single Responsibility در سطح کد

هر Method و Class باید دلیل مشخصی برای تغییر داشته باشد و چند نگرانی مستقل را مخلوط نکند.

مثال

class Calculator{public decimal Total(decimal p,int q)=>p*q;}
         class Printer{public void Print(decimal t)=>Console.WriteLine(t);}

در این مثال، مفهوم «Single Responsibility در سطح کد» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۳. کاهش Duplication

تکرار معنی‌دار باید با Abstraction مناسب حذف شود، اما حذف زودهنگام شباهت‌های تصادفی می‌تواند طراحی بدتری بسازد.

مثال

static decimal AddTax(decimal x)=>x*1.10m;

در این مثال، مفهوم «کاهش Duplication» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۴. Guard Clause

بررسی زودهنگام وضعیت نامعتبر عمق Nested Code را کاهش می‌دهد.

مثال

static decimal Pay(decimal amount){ if(amount<=0) throw new ArgumentOutOfRangeException(); return amount; }
         Console.WriteLine(Pay(100));

در این مثال، مفهوم «Guard Clause» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۵. Refactoring

Refactoring تغییر ساختار داخلی بدون تغییر رفتار بیرونی است و باید با تست یا روش اطمینان مناسب همراه باشد.

مثال

static decimal Total(decimal p,int q){decimal subtotal=p*q;return subtotal;}

در این مثال، مفهوم «Refactoring» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۶. مثال‌های عملی

// Prefer intention-revealing names
         decimal CalculateOrderTotal(IEnumerable<OrderItem> items)
         {
             return items.Sum(item => item.UnitPrice * item.Quantity);
         }

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

۷. خطاهای رایج

• متدهای چندصدخطی

• Classهایی با نام Helper یا Manager و مسئولیت نامشخص

• کامنت برای توضیح منطق پیچیده به‌جای ساده‌سازی خود کد

۸. نکات اجرایی

• نام‌ها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.

• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.

• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.

۹. تمرین عملی

یک متد طولانی محاسبه سفارش را به چند متد کوچک برای Validation، Subtotal، Discount و Tax بازآرایی کنید.

۱۰. جمع‌بندی

در این فصل، مبانی «اصول طراحی کد و Clean Code» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.