ویرگول
ورودثبت نام
Hedieh
Hediehفرانت‌اند دولوپر | کد تمیز، طراحی دقیق
Hedieh
Hedieh
خواندن ۳ دقیقه·۳ ماه پیش

فصل ۵ – نام‌گذاری سخته

یه جمله معروف توی دنیای برنامه‌نویسی هست که می‌گه: «دو تا چیز سخته — invalidate کردن cache و نام‌گذاری.» این فصل درباره دومیشه.

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


یه اسم خوب چه ویژگی‌هایی داره؟

سه تا ویژگی اصلی داره:

هدف (Purpose): اسم باید بگه این چیز چیکار می‌کنه یا چیه. توابع معمولاً فعلی نام‌گذاری می‌شن مثل getUser یا createAccount، و متغیرها اسمی مثل account یا button. اگه یه اسم نیاز به کامنت داشته باشه که توضیح بده چیه، احتمالاً اسم خوبی نیست.

یه نکته مهم اینه که هدف اسم به context هم بستگی داره. مثلاً توی کلاس TenancyAgreement، آرگومان documentId کافیه — نیازی نیست بشه tenancyAgreementSignedDocumentID. context کلاس بقیه رو توضیح می‌ده.

مفهوم (Concept): اسم باید ایده پشت چیزی که داری می‌سازی رو هم منتقل کنه. مثلاً وقتی اسم‌های rejectedDeal، acceptedDeal، pendingDeal رو کنار هم می‌بینیم، بدون خوندن یه خط کد می‌فهمیم که یه deal می‌تونه چند حالت مختلف داشته باشه. این قدرت نام‌گذاریه.

قرارداد (Contract): هر اسم یه سری انتظار ضمنی با خودش می‌آره. مثلاً:

  • متغیری که با is شروع می‌شه انتظار داریم Boolean باشه

  • متغیر با حروف بزرگ انتظار داریم constant باشه: DEFAULT_USER_EXPIRY

  • اسم جمع انتظار داریم یه آرایه باشه: elements در مقابل element

  • تابعی که با get یا find شروع می‌شه انتظار داریم چیزی برگردونه

  • اسمی که با _ شروع می‌شه انتظار داریم private باشه

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


آنتی‌پترن‌های نام‌گذاری

اسم‌های بی‌دلیل کوتاه

کوتاه بودن به خودی خود بد نیست — مشکل اینه که اسم کوتاه اغلب یه چیزی رو پیش‌فرض می‌گیره که همه بدونن. کدی مثل این:

برای کسی که این کدبیس رو نمی‌شناسه کاملاً بی‌معنیه. incId، f، x — هیچ‌کدوم چیزی نمی‌گن.

اسم‌های بی‌دلیل عجیب

بعضی وقت‌ها برنامه‌نویس‌ها اسم‌هایی انتخاب می‌کنن که خلاقانه به نظر می‌رسه ولی فقط گیج‌کننده‌ست. مثلاً navigateMeToMountainTop به‌جای redirectToHomePage. اسم عجیب توجه رو از هدف اصلی منحرف می‌کنه.

اسم‌های بی‌دلیل طولانی

اسم طولانی معمولاً نشونه یه انتزاع گیج‌شده‌ست. مثلاً:

اگه اسمت داره خیلی بلند می‌شه، احتمالاً انتزاعت نیاز به بازنگری داره.


سلسله‌مراتب و ثبات

یکی از بهترین راه‌ها برای نام‌گذاری خوب، استفاده از سلسله‌مراتب (hierarchy) و ثباته.

فرض کنید این ساختار فایل رو دارید:

└── app/ ├── deepClone.js ├── getParamsFromURL.js ├── openModal.js ├── openModalWithTemplate.js ├── setupAppWithCustomConfig.js └── setURL.js

هیچ سلسله‌مراتبی نیست و هر فایل باید همه context رو توی اسمش حمل کنه. با اضافه کردن ساختار:

└── app/ ├── setup/ │ ├── defaultConfig.js │ └── setup.js ├── modal/ │ ├── open.js │ └── openWithTemplate.js └── utils/ ├── url/ │ ├── getParams.js │ ├── get.js │ └── set.js └── obj/ └── deepClone.js

ناگهان اسم‌ها ساده‌تر می‌شن چون context از ساختار می‌آد، نه از اسم فایل.

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

ثبات هم به همون اندازه مهمه. اگه داری یه interface می‌سازی، برای یه مفهوم فقط از یه کلمه استفاده کن:

تکنیک‌ها و ملاحظات

قراردادهای پایه جاوااسکریپت

چند تا قرارداد وجود داره که تقریباً همه قبول دارن:

  • ثابت‌ها: DEFAULT_COMPONENT_COLOR

  • کلاس‌ها و constructor ها: MyComponent

  • بقیه چیزها: myComponentInstance

Hungarian Notation

چون جاوااسکریپت dynamically typed است، بعضی‌ها نوع متغیر رو توی اسمش می‌ذارن. مثلاً elButton به‌جای button، یا nAge به‌جای age.

مزایاش: قرارداد و certainty بیشتر. معایبش: اگه نوع متغیر تغییر کنه اسم گمراه‌کننده می‌شه. توصیه کتاب اینه که فقط وقتی واقعاً ابهام وجود داره ازش استفاده کنید — نه همه‌جا.

نام‌گذاری توابع

اسم تابع باید حالت امری (imperative) داشته باشه — مثل دستور دادن:

  • displayPrompt(y)

  • removeElements(x)

  • generateRandomNumber(x, y)

اگه داری qualifier اضافه می‌کنی، اون رو به argument منتقل کن نه به اسم:

تکنیک سه اسم بد

اگه موندی چی اسم بذاری، این تکنیک رو امتحان کن: سه تا اسم بد برای چیزی که داری می‌سازی بنویس — هر چیزی که به ذهنت می‌رسه. بعد اون‌ها رو با هم مقایسه کن و بهترین المان‌ها رو ترکیب کن.

مثلاً برای تابعی که username رو در برابر کلمات ممنوعه چک می‌کنه:

  • matchUsernameAgainstForbiddenWords

  • checkForForbiddenWordConflicts

  • isUsernameReservedWord

از ترکیب این‌ها می‌رسیم به: isUsernameForbiddenWord — که خیلی بهتره از هر سه‌تاشون.


جمع‌بندی

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

دنیای برنامه‌نویسیjavascript
۰
۰
Hedieh
Hedieh
فرانت‌اند دولوپر | کد تمیز، طراحی دقیق
شاید از این پست‌ها خوشتان بیاید