برنامه‌نویسی

کد تمیز (Clean Code) چیست؟

کد تمیز (clean code) چیست؟

این سوال‌هایی است که اغلب مبتدیان می‌پرسند، clean code یا همان کد تمیز چیست؟ چگونه کدهای تمیزی بنویسیم؟ آیا نوشتن comment برای داشتن کدهای تمیز الزامی است؟
برای پاسخ به سوال‌ها سعی داریم در این مقاله توضیح دهیم که کد تمیز (clean code) چیست و چگونه می‌توانیم کدهای تمیزی داشته باشیم. همچنین خوب است بدانیم اولین بار در کتاب clean code با نویسندگی Robert C. Martin به کدهای تمیز اشاره شد و از آن به بعد کدهای تمیز به‌عنوان یکی از اصول مهندسی نرم‌افزار شناخته می‌شود.

کد تمیز چیست؟

کد تمیز آن کدی است که قابلیت خوانایی بالایی دارد، مقیاس‌پذیر و قابل بازسازی است و همچنین می‌تواند عملکرد خودش را توضیح دهد. البته به‌طور کلی، کدهای تمیز را می‌توانیم کدهایی بدانیم که برای همه، حتی برای مبتدیان قابل درک هستند.

اهمیت نوشتن کدهای تمیز

مزیت‌های زیادی در نوشتن کدهای تمیز وجود دارد، برای مثال:

۱) زمانی که با یک تیم کار می‌کنید

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

۲) ساخت پروژه‌های متن‌باز

نوشتن کدهای تمیز به مشارکت دیگر افراد در توسعه‌ و پایداری پروژه‌ی متن‌باز شما کمک شایانی خواهد کرد.

۳) زمانی‌که می‌خواهید کدهای خود را ریفکتور (refactor) کنید

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

چگونه کدهای تمیزی بنویسیم؟

حال‌ که می‌دانید کد تمیز چیست و از مزایای آن مطلع شده‌اید، به نحوه‌ی نوشتن کدهای تمیز می‌پردازیم. بیشتر افراد فکر می‌کنند نوشتن comment در سرتاسر کد باعث می‌شود تا کدهای تمیزی داشته باشند اما این غلط است. شما برای داشتن کدهای تمیز به commentهای کمی نیاز دارید و حتی در برخی مواقع بدون وجود آن‌ها نیز می‌توانید کدهای تمیزی داشته باشید. بله، درست شنیده‌اید. شما بدون داشتن comment می‌توانید کدهای تمیزی داشته باشید زیرا کدهای تمیز به‌راحتی قابل درک هستند.

توجه داشته باشید مواردی که در ادامه‌ی مقاله از آن‌ها صحبت می‌شود، فقط توصیه هستند و به‌عنوان استاندارد کدنویسی محسوب نمی‌شوند.

نام‌گذاری معنادار متغیرها

یکی از مواردی که باید به آن‌ها دقت داشته باشید، نام‌گذاری متغیرها است. از نام‌های معنی‌دار استفاده کنید تا هر متغیر توصیف‌کننده‌ی مقادیر درون خود باشد، برای مثال:

let yydd=new Date().getFullYear();

مشخص نیست که متغیر فوق، چه مقداری را درون خود جای داده است و هر کسی در هر جایی از کد با این متغیر روبرو شود، نمی‌تواند تشخیص دهد که مقدار درون آن چیست و برای چه‌کاری از آن استفاده می‌شود. اما با استفاده از نام صحیح می‌توانید بدون اینکه به چیزی فکر کنید، تشخیص دهید که مقدار این متغیر چیست:

let fullYear=new Date().getFullYear();

استفاده از camelCase و حروف بزرگ برای جداسازی متغیرها از ثابت‌ها

یکی دیگر از نمونه‌های معمول در کدهای تمیز، variable structuring یا همان استفاده از یک استاندارد برای تعریف متغیرها است که به ساده شدن خوانایی کدها کمک می‌کند. برای مثال:

let dayofmonth=new Date().getDate();

const time=new Date().getTime();

هر زمان که فرد دیگری با این متغیرها روبرو شود، احتمالا نمی‌تواند variable یا constant بودن مقادیر را تشخیص دهد و در نتیجه درک کدهای شما دشوار می‌شود اما راه حل به این شکل است:

let dayOfMonth=new Date().getDate();

const TIME=new Date().getTime();

حال با کدهای بالا می‌توانید متوجه شوید که کدام یک variable و کدام constant است و به این شکل درک کدها آسان می‌شود. همچنین می‌توانید توضیحی را در ابتدای کدهای خود برای ساده‌تر کردن موضوع قرار دهید:

// standard variables are in camelCase, e.g ourTest;
// while constant variables are in uppercase e.g TEST

let dayOfMonth=new Date().getDate();

const TIME=new Date().getTime();

از پیچیدگی‌ها پرهیز کنید

ریفکتور کدهایی که API URL و API KEY را در برمی‌گیرند می‌تواند دشوار باشد اما می‌توانید این مقادیر را در متغیرهای مختلفی تعریف و در طول برنامه‌ی خود از آن‌ها استفاده کنید، مثلا به‌جای کد زیر:

async function fetchPexelsImages(){
let fetchImages=await fetch('https://api.pexels.com/v1/curated/',{
method:"GET",
headers:{
Authorization:xxxxxxxxxxxxxxxxxxxxxxxxx
}
});

}

از این کد استفاده کنید:

//declare variables
const PEXELSAPIURL="https://api.pexels.com/v1/curated/";
const PEXELSAPITOKEN="xxxxxxxxxxxxxxxxx";
async function fetchPexelsImages(){
let fetchImages=await fetch(`${PEXELSAPIURL}`,{
method:'GET',
headers:{
Authorization: PEXELSAPITOKEN
}
});
}

در کدهای بالا به‌راحتی می‌توانید API URL و API KEY را تغییر دهید و برنامه‌ی شما نیز بدون مشکل به کار خود ادامه دهد.

عملکردهای زیادی را در یک function قرار ندهید

مطمئنا توانسته‌اید حدس بزنید که منظورمان استفاده نکردن از یک تابع برای انجام بیشتر از یک کار است. در نوشتن کدهای تمیز باید فانکشن خود را به یک عملکرد محدود کنید و به این صورت ریفکتور کدهای شما آسان‌تر می‌شود.
برای مثال به‌جای کدهای زیر:

function getUsersInfo(usersInfo){
usersInfo.forEach(userInfo => {
let checkedUserInfo=database.lookup(userInfo);
if(checkedUserInfo.isComplete()){
showUser(userInfo)
}
});
}

می‌توانید از این کدها استفاده کنید:

function getUsersInfo(usersInfo){
usersInfo.filter(isUserInfoComplete).forEach(showUser);

}
function isUserInfoComplete(userInfo){
let checkedUserInfo=database.lookup(userInfo);
return checkedUserInfo.isComplete();
}

اجتناب از موارد غیر ضروری

اجتناب از موارد غیرضروری، کد یا کدهای شما را به یک کد تمیز تبدیل می‌کند، اگر نام آبجکت یا کلاس شما معرف کارایی خود باشد پس لازم نیست تا از آن‌ها برای فراخوانی متغییر‌ها استفاده کنیم، برای مثال:

const PHONE={
phoneMake:"iphone",
phoneModel:"6s",
phoneColor:"gold"
};
function buildPhone(phone){
phone.phoneModel="7plus"
}

شما می‌توانید از کدهای زیر استفاده کنید:

const PHONE={
make:"iphone",
model:"6s",
color:"gold"
};
function buildPhone(phone){
phone.model="7plus"
}

امیدواریم این مقاله به شما در نوشتن کدهای تمیز کمک کند. اگر می‌خواهید اطلاعات بیشتری از نوشتن کدهای تمیز کسب کنید، توصیه می‌شود این ریپازیتوری را مطالعه کنید.

منبع: https://stevecodes.hashnode.dev/what-is-clean-code-do-you-need-comments-to-write-clean-codes