قواعد نام گذاری توابع و متغیرها
- از زبان انگلیسی استفاده کنید
- قاعده نام گذاری مشخص داشته باشید
- از قانون S-I-D پیروی کنید
- خلاصه نکنید
- از تکرار دوری کنید
- از طریق نام نتیجه را معلوم کنید
- نام گذاری توابع
- از کلمات مفرد و جمع در نام استفاده کنید
انتخاب نام کار پیچیده ای است و این راهنما قرار است کار را ساده تر کند.
دقت کنید ممکن است در زبان های مختلف این موضوع متفاوت باشد اما در این صفحه مثال ها با جاوااسکریپت نمایش داده شده است.
از زبان انگلیسی استفاده کنید
از زبان انگلیسی برای نام گذاری متغیرها و تابع ها استفاده کنید.
/* 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
}
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']