/naming-cheatsheet

Naming rules for functions and variables in JavaScript | قواعد نام گذاری توابع و متغیر‌ها در جاوااسکریپت

MIT LicenseMIT

Naming cheatsheet

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


انتخاب نام کار پیچیده ای است و این راهنما قرار است کار را ساده تر کند.

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

از زبان انگلیسی استفاده کنید

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

/* Bad */
const primerNombre = 'Gustavo'
const amigos = ['Kate', 'John']

/* Good */
const firstName = 'Gustavo'
const friends = ['Kate', 'John']

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

قاعده نام گذاری مشخص داشته باشید

یگی از قواعد نام گذاری را برای خود انتخاب کنید و طبق آن پیش بروید. از بین قواعدی مثل camelCase, PascalCase, snake_case و ... یکی را انتخاب کنید.

/* Bad */
const page_count = 5
const shouldUpdate = true

/* Good */
const pageCount = 5
const shouldUpdate = true

/* Good as well */
const page_count = 5
const should_update = true

از قانون S-I-D پیروی کنید

یک نام باید کوتاه، بصری و توصیفی باشد:

  • کوتاه یا Short. نام باید کوتاه باشد تا در طولانی مدت به خاطر بماند
  • بصری یا Intuitive. یک نام باید به صورت طبیعی قابل خواندن باشد و این موضوع باید برای همه این طور باشد
  • توصیفی یا Descriptive. یک نام باید به کارآمد ترین روش با کاری که انجام می دهد مشخص شده باشد
/* Bad */
const a = 5 // "a" could mean anything
const isPaginatable = a > 10 // "Paginatable" sounds extremely unnatural
const shouldPaginatize = a > 10 // Made up verbs are so much fun!

/* Good */
const postCount = 5
const hasPagination = postCount > 10
const shouldPaginate = postCount > 10 // alternatively

خلاصه نکنید

از خلاصه کردن پرهیز کنید دلیل این موضوع هم این است که خلاصه کردن باعث کاهش خوانایی متن خواهد شد پس حتما در ارتباط با این موضوع پرهیز کنید.

/* Bad */
const onItmClk = () => {}

/* Good */
const onItemClick = () => {}

از تکرار دوری کنید

از تکرار جلوگیری کنید. مثلا مثل مثال زیر نام کلاس را در نام اعضا آن کلاس نبرید و استفاده نکنید.

class MenuItem {
  /* Method name duplicates the context (which is "MenuItem") */
  handleMenuItemClick = (event) => { ... }

  /* Reads nicely as `MenuItem.handleClick()` */
  handleClick = (event) => { ... }
}

از طریق نام نتیجه را معلوم کنید

یک نام باید نتیجه ای که بر می گرداند را دقیقا مشخص کند

/* Bad */
const isEnabled = itemCount > 3
return <Button disabled={!isEnabled} />

/* Good */
const isDisabled = itemCount <= 3
return <Button disabled={isDisabled} />

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

الگوی A / HC / LC

یک الگوی مفید برای نام گذاری تابع ها وجود دارد:

prefix? + action (A) + high context (HC) + low context? (LC)

نحوه ی استفاده ی این الگو در جدول زیر آمده است.

Name Prefix Action (A) High context (HC) Low context (LC)
getUser get User
getUserMessages get User Messages
handleClickOutside handle Click Outside
shouldDisplayMessage should Display Message

یادداشت:
ترتیب انجام کارها بسیار مهم است مثلا shouldUpdateComponent در جایی استفاده می شود که به صورت دائمی آپدیت می شود ولی shouldComponentUpdate در جایی استفاده می شود که باید آپدیت کنید و این آپدیت توسط شما باید انجام شود. همیشه High context بر معنی نام یک متغیر تاثیر می گذارد.


در نام از فعل استفاده کنید

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

get

داده هایی که در همان لحظه خروجی خواهید گرفت.

function getFruitCount() {
  return this.fruits.length
}

همچنین compose را مشاهده کنید.

set

برای اعلان یک متغیر استفاده می شود

let fruits = 0

function setFruits(nextFruits) {
  fruits = nextFruits
}

setFruits(5)
console.log(fruits) // 5

reset

یک متغیر را به مقدار یا حالت اولیه خود بر می گرداند.

const initialFruits = 5
let fruits = initialFruits
setFruits(10)
console.log(fruits) // 10

function resetFruits() {
  fruits = initialFruits
}

resetFruits()
console.log(fruits) // 5

fetch

درخواست برای برخی از داده هایی، که یک مدتی طول می کشد تا پاسخ داده شود (به عنوان مثال درخواست همگام سازی یا sync کردن).

function fetchPosts(postCount) {
  return fetch('https://api.dev/posts', {...})
}

remove

چیزی را از جایی حذف می کند.

به عنوان مثال ، اگر مجموعه ای از فیلترهای انتخاب شده در صفحه جستجو داشته باشید ، حذف یکی از این مجموعه ها با "removeFilter" است و "deleteFilter" اتفاق نمی افتد

function removeFilter(filterName, filters) {
  return filters.filter((name) => name !== filterName)
}

const selectedFilters = ['price', 'availability', 'size']
removeFilter('price', selectedFilters)

همچنین delete را مشاهده کنید.

delete

چیزی که می خواهید کاملا پاک کنید.

فکر کنید یک سیستم مدیریت محتوا دارید وقتی روی کلید حذف پست می زنید عملیات deletePost انجام می شود و از removePost استفاده نمی شود.

function deletePost(id) {
  return database.find({ id }).delete()
}

همچنین remove را مشاهده کنید.

compose

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

function composePageUrl(pageName, pageId) {
  return (pageName.toLowerCase() + '-' + pageId)
}

همچنین get را مشاهده کنید.

handle

Handles برای عمل ها به کار می رود. اغلب هنگام نام گذاری برای یک روش پاسخ گویی قابل استفاده است.

function handleLinkClick() {
  console.log('Clicked a link!')
}

link.addEventListener('click', handleLinkClick)

نام باید عملکرد را مشخص کند

نام یک تابع باید کار آن تابع را مشخص کند یا حداقل کاری را که قرار است انجام دهد را مشخص کند.

/* A pure function operating with primitives */
function filter(list, predicate) {
  return list.filter(predicate)
}

/* Function operating exactly on posts */
function getRecentPosts(posts) {
  return filter(posts, (post) => post.date === Date.now())
}

برخی از موارد در زبان های مختلف متفاوت است مثلا در جاوااسکریپت اپراتور filter روی آرایه ها عمل می کنند و نیازی به اضافه کردن fitlterArray ندارید.

--

پیشوندها

پیشوندها به نام متغیرها معنای بهتری می دهند و معمولا در نام توابع استفاده نخواهند شد

is

مشخصه یا حالتی از زمینه فعلی را توصیف می کند (معمولاً به صورت بولین).

const color = 'blue'
const isBlue = color === 'blue' // characteristic
const isPresent = true // state

if (isBlue && isPresent) {
  console.log('Blue is present!')
}

has

توصیف می کند که آیا این مقدار فعلی مقدار یا حالت خاصی می باشد یا نه (معمولاً به صورت بولین).

/* Bad */
const isProductsExist = productsCount > 0
const areProductsPresent = productsCount > 0

/* Good */
const hasProducts = productsCount > 0

should

یک جمله شرطی مثبت را همراه با یک عمل خاص منعکس می کند (معمولاً به صورت بولین).

function shouldUpdateUrl(url, expectedUrl) {
  return url !== expectedUrl
}

min/max

مقدار حداقل و حداکثر را مشخص کند هنگام توصیفات محدوده حتما محدودیت ها را مشخص کنید.

/**
 * Renders a random amount of posts within
 * the given min/max boundaries.
 */
function renderPosts(posts, minPosts, maxPosts) {
  return posts.slice(0, randomBetween(minPosts, maxPosts))
}

prev/next

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

function fetchPosts() {
  const prevPosts = this.state.posts

  const fetchedPosts = fetch('...')
  const nextPosts = concat(prevPosts, fetchedPosts)

  this.setState({ posts: nextPosts })
}

از کلمات مفرد و جمع در نام استفاده کنید

مانند پیشوندها نام متغیرها بسته به اینکه یک متغیر باشند و یک داده را بگیرند یا آرایه باشند و چندین داده را بگیرند باید جمع یا مفرد استفاده شود

/* Bad */
const friends = 'Bob'
const friend = ['Bob', 'Tony', 'Tanya']

/* Good */
const friend = 'Bob'
const friends = ['Bob', 'Tony', 'Tanya']