اولین چیزی که یک برنامهنویس هنگام باز کردن یک پروژه با آن مواجه میشود، نام متغیرها و ساختار توابع است. کدنویسی تمیز (Clean Code) با این هدف ابداع شده که کد شما مثل یک داستان جذاب، خوانا و بدون ابهام باشد.
در این مقاله که بخش اول از سری مقالات «اصول کدنویسی تمیز» است، به بررسی دو رکن اساسی یعنی انتخاب نامهای معنادار و نوشتن توابع بهینه میپردازیم.
بخش اول: نامگذاری؛ اولین قدم برای شفافیت
نامها در برنامه باید خوانا، شفاف و بیابهام باشند. یک نام خوب باید به این سوال پاسخ دهد: چرا این متغیر وجود دارد؟ چه کاری انجام میدهد؟ و چگونه از آن استفاده میشود؟
اشتباه رایج: استفاده از نامهای بیشازحد توضیحی یا نامهای تکحرفی نامفهوم.
// روش اشتباه
var d; // تعداد روزهای گذشته
var saveAllUsersToDatabaseAndSendEmail;
// روش Clean Code
var daysElapsed;
var save; // اگر در کلاس UserRepository باشد، نام save به تنهایی کافی است
نکته کلیدی: اگر نامی برای درک شدن نیاز به کامنت دارد، یعنی آن نام هنوز به اندازه کافی تمیز نیست.
بخش دوم: توابع کوتاه و هدفمند
طبق اصول Clean Code، توابع باید دو ویژگی طلایی داشته باشند: 1. باید کوچک باشند. 2. باید فقط یک کار را انجام دهند.
وقتی یک تابع بیش از حد بزرگ میشود، نگهداری و تست آن به یک کابوس تبدیل میگردد. اگر تابعی دارید که چندین کار (مثل اعتبارسنجی، ذخیره و ارسال پیام) را انجام میدهد، باید آن را به توابع کوچکتر تقسیم کنید.
مثال از یک تابع شلوغ و اصلاح آن:
// قبل از اصلاح: تابعی که چند مسئولیت دارد
public async Task ProcessOrder(Order order)
{
if (order.IsValid) // اعتبارسنجی
{
_context.Orders.Add(order); // ذخیره
await _context.SaveChangesAsync();
SendConfirmationEmail(order.UserEmail); // ارسال ایمیل
}
}
// بعد از اصلاح: تقسیم به متدهای کوچک و شفاف
public async Task ProcessOrder(Order order)
{
ValidateOrder(order);
await SaveOrderAsync(order);
SendNotification(order);
}
این تغییر باعث میشود کد شما تستپذیرتر شده و در صورت بروز خطا، دقیقاً بدانید مشکل در کدام مرحله رخ داده است.
بخش سوم: اجتناب از عوارض جانبی (Side Effects)
یک تابع تمیز نباید وضعیت بخشهای دیگر برنامه را به صورت پنهانی تغییر دهد. تابع باید دقیقاً همان کاری را انجام دهد که نامش میگوید. اگر نام تابع CheckPassword است، این تابع نباید در کنار چک کردن، سشن کاربر را هم ریست کند!
«سادگی مقیاسپذیر است، پیچیدگی نه! کدی که به سادگی خوانده شود، به سادگی هم توسعه مییابد.»
نتیجهگیری بخش اول
نامگذاری درست و نوشتن توابع کوچک، هزینه نگهداری پروژه را به شدت کاهش میدهد. در معماریهای بزرگ، این جزئیات کوچک هستند که تفاوت بین یک پروژه موفق و یک “Legacy Code” غیرقابل تغییر را رقم میزنند.
در بخش بعدی، به سراغ اصول کامنتگذاری مؤثر خواهیم رفت تا ببینیم کجا باید بنویسیم و کجا باید سکوت کنیم.