【搬运】编程中命名的一些参考

简单用百度翻译了一些内容,没有全部翻译。
有不认识的用百度翻译 翻译一下看看吧 QAQ
原作者GitHub链接

Naming cheatsheet


Naming things is hard. This sheet attempts to make it easier.

编程中命名是一件困难的事情 这份表的目的是让命名变得简单起来

Although these suggestions can be applied to any programming language, I will use JavaScript to illustrate them in practice.

以下命名建议可以应用到任何编程语言上,在这里使用JavaScript语言来作为说明

English language

Use English language when naming your variables and functions.

用英语来进行命名

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

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

Like it or not, English is the dominant language in programming: the syntax of all programming languages is written in English, as well as countless documentations and educational materials. By writing your code in English you dramatically increase its cohesiveness.

不管你喜不喜欢,英语是编程的主导语言:所有编程语言的语法都是用英语写的,还有无数的文档和教材。通过用英语编写代码,可以显著提高代码的内聚性。

Naming convention

Pick one naming convention and follow it. It may be camelCase, PascalCase, snake_case, or anything else, as long as it remains consistent. Many programming languages have their own traditions regarding naming conventions; check the documentation for your language or study some popular repositories on Github!

选择命名约定并遵循它。它可以是“camelCase”、“PascalCase”、“snake\u case”或其他任何东西,只要它保持一致。许多编程语言在命名约定方面有自己的传统;查看您的语言文档或研究Github上一些流行的存储库!

/* 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

A name must be short, intuitive and descriptive:

名称必须是简短的、直观的和描述性的:

  • Short. A name must not take long to type and, therefore, remember;
  • Intuitive. A name must read naturally, as close to the common speech as possible;
  • Descriptive. A name must reflect what it does/possesses in the most efficient way.
/* 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

Avoid contractions

避免缩写

Do not use contractions. They contribute to nothing but decreased readability of the code. Finding a short, descriptive name may be hard, but contraction is not an excuse for not doing so.

避免缩略语不要使用缩略语。它们只会降低代码的可读性。找到一个简短的,描述性的名字可能很难,但缩写不是不这样做的借口。

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

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

Avoid context duplication

避免上下文重复

A name should not duplicate the context in which it is defined. Always remove the context from a name if that doesn’t decrease its readability.

名称不应与定义它的上下文重复。如果不降低名称的可读性,请始终从名称中删除上下文。

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

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

Reflect the expected result

反映预期结果

A name should reflect the expected result.

名称应反映预期结果。

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

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

Naming functions

A/HC/LC Pattern

There is a useful pattern to follow when naming functions:

命名函数时有一个实用的句式:

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

Take a look at how this pattern may be applied in the table below.

让我们看看下表中如何应用此句式。

Name(名字)Prefix(前缀)Action (A)(动作)High context (HC)()Low context (LC)
getUsergetUser
getUserMessagesgetUserMessages
handleClickOutsidehandleClickOutside
shouldDisplayMessageshouldDisplayMessage

Note: The order of context affects the meaning of a variable. For example, shouldUpdateComponent means you are about to update a component, while shouldComponentUpdate tells you that component will update on itself, and you are but controlling when it should be updated.
In other words, high context emphasizes the meaning of a variable.

**注:**上下文顺序影响变量的含义。例如,shouldcomponentupdatecomponent表示您将要更新一个组件,而shouldComponentUpdate则告诉您组件将在自身上更新,您只能控制何时应该更新它。
换句话说,高语境强调变量的含义。


Actions

The verb part of your function name. The most important part responsible for describing what the function does.

函数名的动词部分。最重要的部分是描述函数的作用。

get

Accesses data immediately (i.e. shorthand getter of internal data).

以声明方式设置变量,将值“a”设置为值“B”。

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

See also compose.

set

Sets a variable in a declarative way, with value A to value B.

let fruits = 0

function setFruits(nextFruits) {
  fruits = nextFruits
}

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

reset

Sets a variable back to its initial value or state.

将变量设置回其初始值或状态。(复位)

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

function resetFruits() {
  fruits = initialFruits
}

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

fetch

Request for some data, which takes some indeterminate time (i.e. async request).

请求一些数据,这需要一些不确定的时间(即异步请求)。

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

remove

Removes something from somewhere.

For example, if you have a collection of selected filters on a search page, removing one of them from the collection is removeFilter, not deleteFilter (and this is how you would naturally say it in English as well):

从某处移除某物。
例如,如果您在搜索页上有一个选定筛选器的集合,则从集合中删除其中一个筛选器的方法是“removeFilter”,而不是“deleteFilter”(这也是您用英语自然表达的方式):

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

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

See also delete.

delete

Completely erases something from the realms of existence.

Imagine you are a content editor, and there is that notorious post you wish to get rid of. Once you clicked a shiny “Delete post” button, the CMS performed a deletePost action, not removePost.

完全从存在的领域中抹去某些东西。
假设你是一个内容编辑,有一个臭名昭著的职位,你想摆脱。一旦你点击一个闪亮的“deletePost”按钮,CMS就会执行一个“deletePost”操作,而不是“removePost”。

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

See also remove.

compose

Creates new data from the existing one. Mostly applicable to strings, objects, or functions.

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

See also get.

handle

Handles an action. Often used when naming a callback method.

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

link.addEventListener('click', handleLinkClick)

Context

A domain that a function operates on.

A function is often an action on something. It is important to state what its operable domain is, or at least an expected data type.

/* 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())
}

Some language-specific assumptions may allow omitting the context. For example, in JavaScript, it’s common that filter operates on Array. Adding explicit filterArray would be unnecessary.

Prefixes

Prefix enhances the meaning of a variable. It is rarely used in function names.

前缀增强了变量的含义。它很少用于函数名。

is

Describes a characteristic or state of the current context (usually boolean).

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

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

has

Describes whether the current context possesses a certain value or state (usually boolean).

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

/* Good */
const hasProducts = productsCount > 0

should

Reflects a positive conditional statement (usually boolean) coupled with a certain action.

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

min/max

Represents a minimum or maximum value. Used when describing boundaries or limits.

/**
 * 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

Indicate the previous or the next state of a variable in the current context. Used when describing state transitions.

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

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

  this.setState({ posts: nextPosts })
}

Singular and Plurals

Like a prefix, variable names can be made singular or plural depending on whether they hold a single value or multiple values.

与前缀一样,变量名可以是单数的,也可以是复数的,这取决于它们是包含一个值还是多个值。

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

/* Good */
const friend = 'Bob'
const friends = ['Bob', 'Tony', 'Tanya']
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值