- از زبان انگلیسی استفاده کنید
- قاعده نام گذاری مشخص داشته باشید
- از قانون 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
یک نام باید کوتاه، بصری و توصیفی باشد:
- کوتاه یا 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} />
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 بر معنی نام یک متغیر تاثیر می گذارد.
مهم ترین بخشی را که تابع انجام می دهد را به عنوان فعل به کار ببرید و نام آن را نام تابع استفاده کنید.
داده هایی که در همان لحظه خروجی خواهید گرفت.
function getFruitCount() {
return this.fruits.length
}
let fruits = 0
function setFruits(nextFruits) {
fruits = nextFruits
}
setFruits(5)
console.log(fruits) // 5
const initialFruits = 5
let fruits = initialFruits
setFruits(10)
console.log(fruits) // 10
function resetFruits() {
fruits = initialFruits
}
resetFruits()
console.log(fruits) // 5
درخواست برای برخی از داده هایی، که یک مدتی طول می کشد تا پاسخ داده شود (به عنوان مثال درخواست همگام سازی یا sync کردن).
function fetchPosts(postCount) {
return fetch('https://api.dev/posts', {...})
}
چیزی را از جایی حذف می کند.
به عنوان مثال ، اگر مجموعه ای از فیلترهای انتخاب شده در صفحه جستجو داشته باشید ، حذف یکی از این مجموعه ها با "removeFilter" است و "deleteFilter" اتفاق نمی افتد
function removeFilter(filterName, filters) {
return filters.filter((name) => name !== filterName)
}
const selectedFilters = ['price', 'availability', 'size']
removeFilter('price', selectedFilters)
همچنین delete را مشاهده کنید.
چیزی که می خواهید کاملا پاک کنید.
فکر کنید یک سیستم مدیریت محتوا دارید وقتی روی کلید حذف پست می زنید عملیات deletePost
انجام می شود و از removePost
استفاده نمی شود.
function deletePost(id) {
return database.find({ id }).delete()
}
همچنین remove را مشاهده کنید.
داده های جدیدی را از داده های موجود ایجاد می کند. بیشتر در رشته ها، شی ها یا تابع ها کاربرد دارد.
function composePageUrl(pageName, pageId) {
return (pageName.toLowerCase() + '-' + pageId)
}
همچنین get را مشاهده کنید.
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 ندارید.
--
پیشوندها به نام متغیرها معنای بهتری می دهند و معمولا در نام توابع استفاده نخواهند شد
مشخصه یا حالتی از زمینه فعلی را توصیف می کند (معمولاً به صورت بولین).
const color = 'blue'
const isBlue = color === 'blue' // characteristic
const isPresent = true // state
if (isBlue && isPresent) {
console.log('Blue is present!')
}
/* Bad */
const isProductsExist = productsCount > 0
const areProductsPresent = productsCount > 0
/* Good */
const hasProducts = productsCount > 0
function shouldUpdateUrl(url, expectedUrl) {
return url !== expectedUrl
}
/**
* Renders a random amount of posts within
* the given min/max boundaries.
*/
function renderPosts(posts, minPosts, maxPosts) {
return posts.slice(0, randomBetween(minPosts, maxPosts))
}
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']