لرن بلاگ

تصویر بنر مقاله کدنویسی تمیز در جاوا اسکریپت

کدنویسی تمیز در جاوا اسکریپت چیست؟ راهکارها و نکات

مقدمه

گرچه دلیل اصلی کدنویسی آن است که ارتباط ما (به عنوان انسان) با کامپیوتر را برقرار کرده و به عبارتی زبان رابط ما و کامپیوتر باشد، ولی معمولاً کدهای نوشته شده تنها برای کامپیوترها کاربرد ندارند. در پروژه‌های بزرگ گاهی دیده می‌شود که در کارهای تیمی هر فرد مسئولیت بخشی از پروژه را بر عهده می‌گیرد و کدهای نوشته شده توسط وی، باید توسط سایر اعضای تیم استفاده شود. حتی ممکن است برای خود شما نیز پیش آمده باشد که کدی را نوشته باشید و بعد از چند ماه که به آن مراجعه می‌کنید، باید مدت زمانی (حتی طولانی) را صرف کنید تا به خوبی به یاد بیاورید که هر قسمت از کد چه کاربردی داشته و به چه منظور نوشته شده است. لذا هدف از کدنویسی تنها این نیست که کد ما اجرا شود. بلکه باید کدنویسی تمیز و مرتبی داشته باشیم که برای دیگران (یا خود ما در آینده) قابل فهم باشد. در این مقاله قصد داریم به برخی نکات جهت بهتر شدن و مرتب شدن کدهای خودمان اشاره کنیم تا از این پس در کدنویسی بیشتر به آنها توجه داشته باشیم. زبان برنامه‌نویسی که در اینجا انتخاب شده، زبان جاوا اسکریپت است (از این رو عنوان مقاله را کدنویسی تمیز در جاوا اسکریپت نام نهاده‌ایم)، ولی به طور کلی برخی نکات اشاره شده قابل استفاده و الگوبرداری در سایر زبان‌های برنامه‌نویسی نیز هستند.

نکته اول: استفاده از === به جای ==

در جاوا اسکریپت برای چک کردن برابری دو مقدار می‌توان از علامت == و یا === استفاده کرد. مورد اول فقط مقدار دو طرف را مقایسه می‌کند، در حالی که مورد دوم، هم مقدار و هم نوع متغیر دو طرف را مورد بررسی قرار می‌دهد:

استفاده از متغیر برابری به شکل صحیح برای کدنویسی تمیز در جاوا اسکریپت

در مثال فوق متغیر number1 از نوع عددی است. ولی متغیر boolean1 از نوع منطقی (صحیح یا غلط) است. وقتی از علامت == استفاده کنیم، نوع دو متغیر بررسی نمی‌شود و این مسئله خلاف اصول کدنویسی تمیز در جاوا اسکریپت است. بلکه تنها مقدار آنها بررسی می‌شود و از آنجائیکه مقدار صفر در برنامه‌نویسی جاوا اسکریپت معادل با غلط1false است، کد مربوطه اجرا می‌شود. ولی اگر از === استفاده شود، علاوه بر مقدار، نوع متغیرها نیز بررسی می‌شود و لذا کد مورد نظر اجرا نمی‌شود. برای اینکه کدنویسی تمیز داشته باشیم، بهتر است از علامت === استفاده نماییم تا مفهوم کد ما به درستی القا شود.

نکته دوم کدنویسی تمیز در جاوا اسکریپت: کوتاه‌نویسی توابع

در نوشتن توابع در جاوا اسکریپت در پروژه خود سعی کنیم کدهای هر عملیاتی را که قرار است انجام شود، تفکیک کنیم و برای هر تابع تنها یک مسئولیت در نظر بگیریم. به عنوان مثال فرض کنید که بخواهیم یک تگ <p> در داخل المان موجود در HTML ایجاد نماییم و سپس استایل‌های خاصی را نیز به آن بدهیم:

کدنویسی تمیز در توابع در جاوا اسکریپت که رعایت نشده است.

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

رعایت صحیح کدنویسی تمیز در جاوا اسکریپت

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

چنانچه متغیری که در عبارات شرطی ارزیابی می‌شود، از نوع منطقی (true یا false) است، می‌توان از حالت‌های مخفف شده‌ای در شرط‌ها استفاده نمود. مثلاً چنانچه یک عبارت ()if داشته باشیم، حالت صحیح کدنویسی به شکل زیر است:

تصویر نحوه صحیح استفاده از دستور if

تا آنکه به این شکل کدنویسی انجام شود:

تصویر نحوه استفاده نادرست از دستور if در جاوا اسکریپت

همچنین چنانچه یک ساختار if-else در کد خود داشته باشیم، حالت‌های بهینه و غیر بهینه به شکل‌های زیر خواهند بود.

حالت بهینه (کدنویسی تمیز در جاوا اسکریپت):

isAccept ? doSomthing() : doSomeElse();

حالت غیربهینه:

if (isAccept) {
  doSomthing();
} else {
  doSomeElse();
}

نکته چهارم: فاصله گذاری مناسب در بلاک‌های کد

در ساختارهای توابع یا عبارات شرطی که مجموعه‌ای از کدها در داخل کروشه مربوط به تابع یا عبارت شرطی (بلاک کد) نوشته می‌شوند، بهتر است برای خوانایی کد از فاصله‌گذاری2Indentation برای تمایز قائل شدن در مورد بلاک‌های کد استفاده نماییم. این مسئله به خصوص در شرایطی که چندین بلاک در داخل یکدیگر قرار می‌گیرند، به خوانایی کد ما کمک می‌کند و از اصول کدنویسی تمیز در جاوا اسکریپت محسوب می‌گردد.

کد زیر روش صحیح بکارگیری این تکنیک را نشان می‌دهد:

function testFunc() {
  let testLessons = ["PHP", "JS", "HTML"];
  for (let i = 0; i<testLessons.length; i++) {
    let strLesson = testLessons[i].length;
    function checkStr(strLesson) {
      // do somthing
      console.log(strLesson);
    }
    checkStr(strLesson);
  }
}
testFunc();

در مقابل روش غلط یا به عبارتی نامرتب در این خصوص آن است که به این شکل عمل کنیم:

function testFunc() {
let testLessons = ["PHP", "JS", "HTML"];
for (let i = 0; i<testLessons.length; i++) {
let strLesson = testLessons[i].length;
function checkStr(strLesson) {
// do somthing
console.log(strLesson);
}
checkStr(strLesson);
}
}
testFunc();

در ابزارهای کدنویسی امروزی (IDE ها) معمولاً این فاصله گذاری به صورت پیش‌فرض انجام می‌شود. اما چنانچه از ویرایشگری استفاده می‌کنید که چنین قابلیتی ندارد، ابزارهایی مانند ESLint یا JSLint می‌توانند در این راستا کمک‌کننده باشند.

نکته پنجم کدنویسی تمیز در جاوا اسکریپت: نام‌گذاری مناسب

معمولاً ما در فرآیند کدنویسی، متغیرها و توابع گوناگونی تعریف می‌کنیم. نکته‌ای که می‌تواند به خوانایی کد ما کمک کند آن است که در نام‌گذاری این توابع و متغیرها دقت کنیم. نام متغیرها و توابع باید متناسب با عملکرد و هدف آنها انتخاب شده باشد و از نام‌گذاری‌های مختصر و گاهاً بی معنا پرهیز شود. مثلاً اگر تابعی مسئولیت بررسی کاربرانی را که در سایت ثبت نام نموده‌اند، دارد بهتر است آن را ()loginUsers نام‌گذاری کنیم. همچنین از طولانی کردن بی‌جهت نام متغیرها در جایی که مفهوم آن مشخص است، بپرهیزیم.

مثال نام‌گذاری صحیح:

function loginUsers() {
  /* is used for login users */
}
let bookNumbers = 5;
let horizontalDistance = 140.25; // the variable for distance from a city
let age = 25; // age of person

مثال نام‌گذاری نامناسب:

function lgu() {
  /* is used for login users */
}
let bNum = 5; // variable for the counts of book
let x = 140.25; // the variable for distance from a city
let theAge = 25; // age of person

نکته ششم: کامنت گذاری

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

کدنویسی تمیز در جاوا اسکریپت: کامنت گذاری

از موارد دیگری که کامنت گذاری ضروری و مناسب به نظر می‌آید، در انتهای بلاک‌های کد است. معمولاً برنامه‌نویس‌ها می‌توانند با قرار دادن کامنت‌هایی در انتهای هر بلاک به خواناتر شدن کد خود کمک کنند.

کامنت گذاری در انتهای بلاک کد در جاوا اسکریپت

از جمله کاربردهای دیگر کامنت‌ها در ابتدای کدها است. مثلا وقتی فایل خاصی را برای عملیات مشخصی در وب‌سایت خود تعریف می‌کنیم، مناسب است که در ابتدای فایل توضیحاتی را در خصوص کاربرد آن فایل ذکر کنیم. برای مثال فرض کنید قرار است که مجموعه اعتبارسنجی‌های مربوط به فرم‌ها3form validations را در یک فایل جاوا اسکریپت انجام دهیم.

تصویر کد مربوط به اعتبارسنجی فرم در جاوا اسکریپت

نکته هفتم: تعداد ورودی توابع

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

تعداد ورودی توابع باید در کدنویسی تمیز در جاوا اسکریپت اندک باشد.

در مقابل نحوه «مخالف با اصول کدنویسی تمیز در جاوا اسکریپت» به شکل زیر است:

کدنویسی ناصحیح در مورد ورودی توابع در جاوا اسکریپت

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

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

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

کدهای بی استفاده در جاوا اسکریپت

در مثال فوق تابع ()registerProcess هیچ جا فراخوانی نمی‌شود (استفاده نمی‌شود)، اما در کد ما باقی گذاشته شده است.

نکته نهم: محدود کردن استفاده از ساختارهای شرطی

شاید عنوان بالا کمی عجیب به نظر بیاید، ولی وقتی هدف ما کدنویسی تمیز و با‌کیفیت‌تر باشد باید به این‌گونه مسائل هم توجه نماییم. منظور از استفاده نکردن یا محدود نمودن استفاده از ساختارهای شرطی آن است که تا حد امکان از روش‌های دیگر استفاده کنیم. مثلا به جای آنکه درون یک کلاس از ()if استفاده کنیم، از ساختار ارث بردن کلاس‌ها در جاوا اسکریپت بهره ببریم.

در ادامه نحوه استفاده صحیح و درست در این حالت را مشاهده می کنید:

class User {
  /* some general codes for all users */
}
class RegisteredUser extends User {
  /* some special codes for registered users only */
}
let user1 = new User();
let user2 = new RegisteredUser();

حالت غیربهینه و مخالف با اصول کدنویسی تمیز در جاوا اسکریپت به شکل زیر است:

class UserOperate {
  constructor(regUser) {
    this.regUser = regUser;
    if (this.regUser) {
      /* some codes for registered users */
    } else {
      /* some codes for not registered users */
    }
  }
}
let user1 = new UserOperate(false);
let user2 = new UserOperate(true);

در مثال فوق مشاهده می‌شود که در حالت بهینه از کلاس User برای نوشتن کدهای مرتبط با تمامی کاربران سایت استفاده کرده‌ایم و برای کاربرانی که در سایت ثبت‌نام کرده باشند، از کلاس RegisteredUser استفاده شده است. این کلاس همان ویژگی‌های کلاس User را به ارث می‌برد و به طور ویژه برای کاربران ثبت نام شده، کدهای اضافه‌تری را اعمال می‌کند.

حالت نادرست (غیر بهینه) نوشتن چنین کدی آن است که از یک کلاس UserOperate استفاده کنیم و با یک ساختار شرطی کاربران ثبت‌نام شده را از ثبت‌نام نشده تفکیک نماییم. در چنین حالتی علاوه بر اینکه مجبور هستیم کدهای مشترک بین این دو دسته را به نوعی تکرار کنیم، در حقیقت کلاس مورد نظر ما همزمان دو کار را در درون خود به انجام می‌رساند و این امر با نکته دوم که ذکر کرده‌ایم متناقض است. چرا که در کدنویسی بهینه و تمیز هدف ما این است که هر تابع (یا کلاس) تنها یک مسئولیت بر عهده داشته باشد.

جمع‌بندی

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

پاورقی:

  • 1
    false
  • 2
    Indentation
  • 3
    form validations

دیدگاهتان را بنویسید

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