نکته اول: استفاده از === به جای ==
در جاوا اسکریپت برای چک کردن برابری دو مقدار میتوان از علامت == و یا === استفاده کرد. مورد اول فقط مقدار دو طرف را مقایسه میکند، در حالی که مورد دوم، هم مقدار و هم نوع متغیر دو طرف را مورد بررسی قرار میدهد:
در مثال فوق متغیر number1 از نوع عددی است. ولی متغیر boolean1 از نوع منطقی (صحیح یا غلط) است. وقتی از علامت == استفاده کنیم، نوع دو متغیر بررسی نمیشود و این مسئله خلاف اصول کدنویسی تمیز در جاوا اسکریپت است. بلکه تنها مقدار آنها بررسی میشود و از آنجائیکه مقدار صفر در برنامهنویسی جاوا اسکریپت معادل با غلط1false است، کد مربوطه اجرا میشود. ولی اگر از === استفاده شود، علاوه بر مقدار، نوع متغیرها نیز بررسی میشود و لذا کد مورد نظر اجرا نمیشود. برای اینکه کدنویسی تمیز داشته باشیم، بهتر است از علامت === استفاده نماییم تا مفهوم کد ما به درستی القا شود.
نکته دوم کدنویسی تمیز در جاوا اسکریپت: کوتاهنویسی توابع
در نوشتن توابع در جاوا اسکریپت در پروژه خود سعی کنیم کدهای هر عملیاتی را که قرار است انجام شود، تفکیک کنیم و برای هر تابع تنها یک مسئولیت در نظر بگیریم. به عنوان مثال فرض کنید که بخواهیم یک تگ <p>
در داخل المان موجود در HTML ایجاد نماییم و سپس استایلهای خاصی را نیز به آن بدهیم:
در کد بالا تمامی عملیات در یک تابع انجام شده است که باعث طولانی شدن غیر ضروری تابع میشود. اما روش صحیحتر و کدنویسی تمیز، آن است که کد خود را به دو تابع به شکل زیر تفکیک کنیم:
نکته سوم: استفاده از حالتهای کوتاه شده در عبارات شرطی
چنانچه متغیری که در عبارات شرطی ارزیابی میشود، از نوع منطقی (true یا false) است، میتوان از حالتهای مخفف شدهای در شرطها استفاده نمود. مثلاً چنانچه یک عبارت ()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 استفاده کنیم و با یک ساختار شرطی کاربران ثبتنام شده را از ثبتنام نشده تفکیک نماییم. در چنین حالتی علاوه بر اینکه مجبور هستیم کدهای مشترک بین این دو دسته را به نوعی تکرار کنیم، در حقیقت کلاس مورد نظر ما همزمان دو کار را در درون خود به انجام میرساند و این امر با نکته دوم که ذکر کردهایم متناقض است. چرا که در کدنویسی بهینه و تمیز هدف ما این است که هر تابع (یا کلاس) تنها یک مسئولیت بر عهده داشته باشد.
جمعبندی
در این مقاله سعی کردیم به برخی نکات در راستای بهتر و تمیزتر کد نوشتن اشاره کنیم. رعایت اینگونه نکات به خصوص برای پروژههایی که به صورت تیمی انجام میشوند، میتواند بسیار مؤثر باشد. در هر صورت برنامهنویسها باید همواره مد نظر داشته باشند که کدهایی که مینویسند به گونهای باشد که بعدها برای خودشان یا دیگران قابلیت بازخوانی و استفاده داشته باشد و تنها برای حل یک مسئله خاص در یک زمان مشخص نباشد.
پاورقی:
- 1false
- 2Indentation
- 3form validations