اصول طراحی کد و 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» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصلهای بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم میکند.