نوشتن کد تمیز یک مهارت اساسی برای هر توسعه دهنده نرم افزار است. کد تمیز نه تنها پایگاه کد شما را قابل نگهداری تر و درک آن را آسان تر می کند، بلکه همکاری بین اعضای تیم را نیز تقویت می کند. در این مقاله جامع، بررسی می کنیم کد تمیز چیست، چرا مهم است و مجموعهای از بهترین روشها و اصول را در اختیار شما قرار میدهیم تا به شما در نوشتن کد تمیز و قابل نگهداری کمک کند.

Clean Code یا کد تمیز چیست؟
کد تمیز کدی است که به راحتی خوانده می شود، به راحتی قابل درک است و به راحتی قابل تغییر است. کدی است که عاری از پیچیدگی، افزونگی و سردرگمی غیر ضروری است. کد تمیز از مجموعهای از قراردادها و بهترین روشها پیروی میکند که آن را سازگارتر میکند و کار یکپارچه روی یک پروژه را برای چندین برنامهنویس آسانتر میکند.
چرا Clean Code مهم است؟
- خوانایی: خواندن کد تمیز آسان است، به این معنی که هر کسی - از جمله خود شما در آینده - می تواند آن را به سرعت درک کند. این امر زمان لازم برای درک عملکرد کد را کاهش می دهد و منجر به توسعه سریعتر و اشکال زدایی راحت تر می شود.
- قابلیت نگهداری: کد بیشتر از آنچه نوشته شده خوانده می شود. هنگامی که کد تمیز می نویسید، به مرور زمان نگهداری و گسترش برنامه آسان تر می شود. این در چرخه عمر توسعه نرم افزار، جایی که پروژه ها اغلب تکامل می یابند و رشد می کنند، بسیار مهم است.
- همکاری: کد تمیز همکاری را تشویق می کند. وقتی کد شما تمیز و منظم باشد، سایر اعضای تیم می توانند به طور موثر روی آن کار کنند. این کار تقسیم وظایف و کار بر روی بخش های مختلف پایگاه کد را به طور همزمان آسان تر می کند.
- کاهش باگ: کد تمیز احتمال معرفی باگ ها را کاهش می دهد. کدهایی که درک آن دشوار است، بیشتر در معرض خطا در هنگام اصلاحات یا بهبود هستند.
- کارایی: کد تمیز کد کارآمد است. معمولاً سریعتر اجرا می شود و از منابع کمتری استفاده می کند زیرا از عملیات غیر ضروری و پیچیدگی جلوگیری می کند.
اکنون که متوجه شدیم چرا کد تمیز مهم است، اجازه دهید برخی از بهترین شیوه ها و اصول را بررسی کنیم تا به شما در نوشتن کد پاک کمک کنند.
بهترین روش ها و اصول برای نوشتن کد تمیز
1- نام های معنی دار متغیرها و توابع
از نام های توصیفی برای متغیرها، توابع، کلاس ها و سایر شناسه ها استفاده کنید. یک نام خوب انتخاب شده می تواند هدف موجودیت را بیان کند و کد را قابل درک تر کند. از نام متغیرهای تک حرفی یا اختصارات مرموز خودداری کنید.
# Bad variable name
x = 5
# Good variable name
total_score = 5
2- توابع و روش ها را کوتاه نگه دارید
توابع و روش ها باید مختصر و متمرکز بر یک کار واحد باشند. اصل مسئولیت واحد (SRP) بیان می کند که یک تابع باید یک کار را انجام دهد و آن را به خوبی انجام دهد. درک، آزمایش و نگهداری توابع کوتاهتر آسانتر است. اگر یک تابع خیلی طولانی یا پیچیده شد، آن را به توابع کوچکتر و قابل مدیریت تقسیم کنید.
// Long and complex function
function processUserData(user) {
// Many lines of code...
}
// Refactored into smaller functions
function validateUserInput(userInput) {
// Validation logic...
}
function saveUserToDatabase(user) {
// Database operation...
}
3- توضیحات و مستندات
از توضیحات به اندازه کافی استفاده کنید و زمانی که این کار را کردید، آنها را معنادار کنید. کد باید تا حد امکان خود توضیحی باشد. اسناد، مانند توضیحات درون خطی و فایلهای README، به توسعهدهندگان دیگر کمک میکنند تا هدف و کاربرد کد شما را درک کنند. الگوریتم های پیچیده، تصمیمات پیچیده و API های عمومی را مستند کنید.
# Bad comment
x = x + 1 # Increment x
# Good comment
# Calculate the total score by incrementing x
total_score = x + 1
4- قالب بندی و تورفتگی سازگار
به سبک کدنویسی و تورفتگی ثابت پایبند باشید. این امر باعث می شود که پایگاه کد تمیز و منظم به نظر برسد. اکثر زبان های برنامه نویسی دارای استانداردهای کدنویسی پذیرفته شده توسط جامعه خود هستند (به عنوان مثال، PEP 8 برای پایتون، eslint برای جاوا اسکریپت) که باید از آنها پیروی کنید. سازگاری همچنین قراردادهای نامگذاری، فاصله گذاری و ساختار کد را شامل می شود.
// Inconsistent formatting
if(condition){
doSomething();
} else {
doSomethingElse();
}
// Consistent formatting
if (condition) {
doSomething();
} else {
doSomethingElse();
}
function calculateBookPrice(quantity, price) {
return quantity * price;
}
function calculateLaptopPrice(quantity, price) {
return quantity * price;
}
در حالی که این توابع کار می کنند، آنها اصل DRY را نقض می کنند زیرا منطق محاسبه قیمت کل برای انواع مختلف اقلام تکرار می شود. اگر انواع آیتم های بیشتری برای محاسبه دارید، در نهایت این منطق را تکرار خواهید کرد. برای پیروی از اصل DRY و بهبود قابلیت نگهداری کد، می توانید کد را به صورت زیر تغییر دهید:
function calculateItemPrice(quantity, price) {
return quantity * price;
}
const bookQuantity = 3;
const bookPrice = 25;
const laptopQuantity = 2;
const laptopPrice = 800;
const bookTotalPrice = calculateItemPrice(bookQuantity, bookPrice);
const laptopTotalPrice = calculateItemPrice(laptopQuantity, laptopPrice);
در این کد refactored، ما یک تابع accountItemPrice داریم که قیمت کل را برای هر نوع کالا بر اساس مقدار و قیمت ارائه شده به عنوان آرگومان محاسبه میکند. این به اصل DRY پایبند است زیرا منطق محاسبه دیگر تکراری نیست.
اکنون می توانید به راحتی با فراخوانی CalculItemPrice با مقدار و مقادیر مناسب قیمت کل کتاب، لپ تاپ یا هر نوع کالای دیگری را محاسبه کنید. این رویکرد قابلیت استفاده مجدد، خوانایی و نگهداری کد را ارتقا می دهد و در عین حال خطر خطاهای ناشی از کدهای تکراری را کاهش می دهد.
6- از فضای خالی معنی دار استفاده کنید
کد خود را به درستی با فاصله و خطوط شکسته فرمت کنید. این خوانایی را افزایش می دهد. از فضای خالی برای جداسازی بخش های منطقی کد خود استفاده کنید. کدهای با فرمت مناسب اسکن کد را آسان تر و بار شناختی خوانندگان را کاهش می دهد.
// Poor use of whitespace
const sum=function(a,b){return a+b;}
// Improved use of whitespace
const sum = function (a, b) {
return a + b;
}
// Inadequate error handling
try {
result = divide(x, y);
} catch (error) {
console.error("An error occurred");
}
// Proper error handling
try {
result = divide(x, y);
} catch (error) {
if (error instanceof ZeroDivisionError) {
console.error("Division by zero error:", error.message);
} else if (error instanceof ValueError) {
console.error("Invalid input:", error.message);
} else {
console.error("An unexpected error occurred:", error.message);
}
}
8- تست کردن
تست های واحد را بنویسید تا صحت کد خود را تأیید کنید. توسعه تست محور (TDD) می تواند با وادار کردن شما به در نظر گرفتن موارد لبه و رفتار مورد انتظار از قبل، به شما کمک کند تا کد تمیزتری بنویسید. کدهایی که به خوبی آزمایش شده اند قابل اعتمادتر هستند و بازنویسی آن آسان تر است.
// Example using JavaScript and the Jest testing framework
test('addition works correctly', () => {
expect(add(2, 3)).toBe(5);
expect(add(-1, 1)).toBe(0);
expect(add(0, 0)).toBe(0);
});
9- بازسازی
کد خود را به طور مرتب اصلاح کنید. همانطور که الزامات تغییر می کند و درک شما از دامنه مشکل عمیق تر می شود، کد خود را مطابق با آن تنظیم کنید. Refactoring به حفظ کد تمیز در حین تکامل پروژه کمک می کند. از بازدید مجدد و بهبود کد موجود در صورت لزوم نترسید.
فرض کنید تابعی دارید که قیمت کل اقلام در سبد خرید را با درصد تخفیف ثابت محاسبه می کند:
function calculateTotalPrice(cartItems) {
let totalPrice = 0;
for (const item of cartItems) {
totalPrice += item.price;
}
return totalPrice - (totalPrice * 0.1); // Apply a 10% discount
}
در ابتدا، این تابع قیمت کل را محاسبه می کند و یک تخفیف ثابت 10٪ اعمال می کند. با این حال، با پیشرفت پروژه، متوجه می شوید که باید از تخفیف های متغیر پشتیبانی کنید. برای اصلاح کد به منظور انعطاف پذیری بیشتر، می توانید یک پارامتر تخفیف را معرفی کنید:
function calculateTotalPrice(cartItems, discountPercentage) {
if (discountPercentage < 0 || discountPercentage > 100) {
throw new Error("Discount percentage must be between 0 and 100.");
}
let totalPrice = 0;
for (const item of cartItems) {
totalPrice += item.price;
}
const discountAmount = (totalPrice * discountPercentage) / 100;
return totalPrice - discountAmount;
}
در این کد بازسازی شده:
- ما یک پارامتر discountPercentage به تابع accountTotalPrice اضافه کرده ایم که به شما امکان می دهد درصد تخفیف را هنگام فراخوانی تابع مشخص کنید.
- ما اعتبارسنجی را روی پارامتر discountPercentage انجام میدهیم تا مطمئن شویم که در محدوده معتبر (0 تا 100%) قرار میگیرد. اگر در محدوده نباشد، خطا می دهیم.
- محاسبه تخفیف اکنون بر اساس درصد تخفیف ارائه شده است، که عملکرد را انعطافپذیرتر و سازگارتر با نیازهای متغیر میکند.
با بازسازی کد به این روش، انعطاف پذیری و قابلیت نگهداری آن را بهبود بخشیده اید. شما به راحتی می توانید عملکرد را برای رسیدگی به سناریوهای تخفیف مختلف بدون نیاز به بازنویسی کل منطق تطبیق دهید.
10- کنترل نسخه
از سیستم های کنترل نسخه مانند Git برای ردیابی تغییرات کد خود استفاده کنید. این به شما این امکان را می دهد که به طور موثر با اعضای تیم همکاری کنید، در صورت لزوم به نسخه های قبلی برگردید و تاریخچه ای تمیز از توسعه پروژه خود را حفظ کنید. Git ابزارهایی را برای بررسی کد، انشعاب و ادغام، تسهیل همکاری و تمیزی کد ارائه می دهد.
منبع:dev.to