۱۲ کنوانسیون برای نوشتن کد تمیز

09 مرداد 1400, خواندن در 6 دقیقه

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

مزایای پیروی از کنوانسیون‌ها

  • کد تمیز
  • کیفیت کد
  • خوانایی کد
  • نگهداری از کد را آسان‌تر می‌کند

Robert C.Martin گفته است:« یک کد تمیز، ساده و صریح است. کد تمیز مثل یک نثرِ خوب خوانده می‌شود. کد تمیز هرگز هدف طراح را مخفی نمی‌کند بلکه پر از انتزاعات واضح و خطوط کنترل مستقیم است.»

۱. اعداد جادویی

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

//Bad practice
for(let i = 0; i < 50; i++){
    //do something
}
//Good practice
let NUMBER_OF_STUDENTS= 50
for(let i = 0; i < NUMBER_OF_STUDENTS; i++){
    //do something
}

۲. Nesting عمیق

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

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

// bad practice
const array = [ [ ['Shoaib Mehedi'] ] ]
array.forEach((firstArr) =>{
    firstArr.forEach((secondArr) => {
        secondArr.forEach((element) => {
            console.log(element);
        })
    })
})

// good practice
const array = [ [ ['Shoaib Mehedi'] ] ]
const getValuesOfNestedArray = (element) => {
    if(Array.isArray(element)){
        return getValuesOfNestedArray(element[0])
    }
    return element
}
getValuesOfNestedArray(array)

3. کامنت‌ها

این مورد مثل حمله کردن به یک شخص است. کامنت‌ها به مردم کمک می‌کند تا مطالب را بعداً درک کنند. همچنین به برنامه‌نویسان دیگر نیز کمک می‌کند تا روی همان پروژه مشغول به کار شوند. وجود کامنت در کد بدین معناست که کدهای نوشته شده توسط شما نمی‌توانند به خوبی خودشان را تعریف کنند.

Jeff Atwood در مورد کامنت نوشتن گفته است:« اصولاً کامنت‌ها به طور ذاتی خوب یا بد نیستند، اما اغلب به عنوان یک کمک استفاده می‌شوند. همیشه باید با این طرز فکر کد نویسی کنید که انگار کامنت‌ها وجود ندارند. این کار شما را مجبور می‌کند تا کد های خود را به ساده‌ترین، واضح‌ترین و مستندترین روش ممکن ارائه دهید.»

کامنت‌ها باید خوب باشند، اما کد های شما باید این توانایی را داشته باشند که به تنهایی خودشان را توضیح دهند.

۴. از توابع بزرگ خودداری کنید

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

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

// bad practice
const addSub = (a,b) => {
    // add
    const addition = a+b
    // sub
    const sub = a-b
    // returning as a string
    return `${addition}${sub}`
}

// good practice
// add
const add = (a,b) => {
    return a+b
}
// sub
const sub = (a,b) => {
    return a-b
}

۵. تکرار کد

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

در اینجا مثالی آورده شده که قبلا در مورد ۲ نیز از آن استفاده کرده‌ایم. به بخش اول نگاه کنید: ما همین کار را ۳ بار تکرار کرده‌ایم. روش بهتر این است که یک تابع واحد را خلق کنیم که همان کار را انجام می‌دهد. همچنین اینگونه دارای قابلیت استفاده ی مجدد نیز خواهد بود.

// bad practice
const array = [ [ ['Shoaib Mehedi'] ] ]
array.forEach((firstArr) =>{
    firstArr.forEach((secondArr) => {
        secondArr.forEach((element) => {
            console.log(element);
        })
    })
})

// good practice
const array = [ [ ['Shoaib Mehedi'] ] ]
const getValuesOfNestedArray = (element) => {
    if(Array.isArray(element)){
        return getValuesOfNestedArray(element[0])
    }
    return element
}
getValuesOfNestedArray(array)

۶. نامگذاری متغیر

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

let camelCase = ''
const thisIsCamelCase = () => {
    //so something
}

۷. نام‌های پرمعنا

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

۸. توصیف را به خلاصه ترجیح دهید

برای نامگذاری‌ها از جزئیات استفاده کنید. تصور کنید به تابعی نیاز داریم که به وسیله‌ی گوشی کاربر بتواند او را پیدا کند. در اینجا می‌توانیم از اسامی پرمعنا استفاده کنیم، اما در صورت وجود توابع مشابه، احتمال اشتباه بسیار زیاد است.

ما باید از یک نام مفصل و پرمعنا استفاده کنیم که معنای آن را به طور خلاصه بیان کند.

//We want a function for search user against phone no
//Bad practice
const searchUser = (phone) => {
//Do something
}
//Good practice
const searchUserByPhoneNo = (phone) => {
//Do something
}

۹. از افعال سازگار در هر مفهوم استفاده کنید

این مورد یکی از مهمترین کنوانسیون‌های نامگذاری است. اگر به تابع CRUD نیاز داریم، از create، get، update و نام مورد نظر استفاده می‌کنیم.

اگر به اطلاعات کاربر از دیتابیس احتیاج داشته باشیم، نام تابع می‌تواند userInfo، user یا fetchUser باشد اما این قراردادی نیست. ما باید از getUser استفاده کنیم.

//Good pranctice
function getUser(){
//do something
}

۱۰. از اسم‌ها برای نام کلاس استفاده کنید و استفاده از نگارش پاسکالی را نیز فراموش نکنید

کلاس به طور عمده برای چیزی طراحی می‌شود. از فعل در نام کلاس استفاده نکنید. همچنین یک کلاس باید دارای نگارش پاسکالی باشد. از نگارش شتری برای آبجکتیوها استفاده می‌شود. بنابراین درست نیست که از نگارش شتری برای کلاس‌ها استفاده کنید.

//bad practice
class MakeCar = {
    //...
}
//Good practice
class Car = {
    //...
}
 

۱۱. مقادیر ثابت را بزرگ بنویسید (نگارش بزرگ ماری)

این یکی دیگر از کنوانسیون‌هایی است که باید از آن پیروی کنیم. همیشه برای مقادیر ثابت از نام‌های کاملاً بزرگ استفاده کنید.

نگارش بزرگ ماری بدین معناست که تمام حروف بزرگ هستند و با یک خط در زیر تمام کلمات از یکدیگر جدا می‌شوند.

const DAYS_IN_A_YEAR = 365;

۱۲. از نام‌های متغیر تک حرفی پرهیز کنید

استفاده از متغیرهای تک حرف خیلی بد است. از آن‌ها برای نام متغیرها استفاده نکنید. اما در یک حلقه از برخی متغیرهای تک حرف استفاده می‌کنیم که استفاده از آن‌ها درست است.

//bad practice
const q = () => {
    //....
}
//good practice
const query = () => {
    //....
}
//this is also okay
for(let i = 0;i < 10; i++){
    //...
}

نتیجه‌گیری

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

منبع

چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

آفلاین
user-avatar
علیرضا داداشی @Pemi.razmi
دنبال کردن

گفتگو‌ برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن وارد شو