Skip to content
Go back

常见的命名前缀

Edit page

常见的命名前缀

在编程中, 命名是一件非常重要的事情, 好的命名能够让代码更加易读, 也能够让代码更加易于维护.
通常我们在阅读第三方库的代码时, 会发现很多方法的命名都是以一些固定的命名前缀开头的.
本文主要总结目前我所了解的一些常见的命名前缀的含义. 并对其进行分类, 大致的分类主要如下.

对于每种命名规则, 我都会给出自定义的例子, 同时也会附带第三方库中的现有案例以便于更好的理解.
代码以kotlin实现, 但是大部分的命名规则都是通用的, 也适用于其他的语言.

对象创建

这些命名前缀用于表示对象的创建

new

创建新的对象实例, 该方法通常是一个静态方法, 用于创建一个新的对象实例.

案例

class Account(
	val name: String,
	val createdAt: ZonedDateTime,
) {

	companion object {

		fun newAccount(name: String, createdAt: ZonedDateTime): Account =
			TODO("DO SOMETHING")

	}

}

现有案例

valueOf

该方法通常用于将基本类型值转换为相应的包装类对象, 一般适用于底层库中.
该方法在业务代码中的使用场景并不多, 但是在底层库中, 该方法的使用场景还是比较多的.

现有案例

getInstance

该方法通常用于获取单例对象.
kotlin中, 通常使用companion object来声明单例对象

案例

class AccountService {

	companion object {

		fun getInstance(): AccountService =
			TODO("DO SOMETHING")

	}

}

现有案例

create

该方法通常用于创建新的对象实例, 但是它与new方法的区别在于, 它通常用于工厂方法模式中.

案例

interface SessionRepository {

	fun getSession(requestId: String): Session

}

interface SessionRepositoryFactory {

	fun createInMemorySessionRepository(): SessionRepository

	fun createDatabaseSessionRepository(): SessionRepository

}

现有案例

from

该方法通常用于将对象从一种类型转换为另一种类型.

案例

class Account {

	companion object {


		fun fromDto(dto: AccountDto): Account =
			TODO("DO SOMETHING")

		fun fromEntity(entity: AccountEntity): Account =
			TODO("DO SOMETHING")

	}

}

现有案例

copy

该方法用于复制对象, 返回新的副本.
kotlincopydata class自带的方法, 该方法用于复制一个不可变对象.

案例

data class Person(val name: String, val age: Int)

val person = Person("Tom", 18)
val copiedPerson = person.copy(age = 20)

现有案例

clone

该方法用于复制对象, 返回新的副本.
java中, cloneObject类中的方法, 该方法用于复制一个对象.
copyclone之间的区别在于, copy方法是对一个不可变对象的复制, 而clone方法则没有这个限制.

现有案例

案例

public class Person implements Cloneable {

	private String name;

	private int age;

	@Override
	public Person clone() {
		try {
			return (Person) super.clone();
		} catch (CloneNotSupportedException e) {
			throw new AssertionError();
		}
	}

}

with

该方法通常用于复制对象并修改其特定属性.
一般被复制的对象为不可变对象.
和copy的区别在于, 调用copy时, 可以选择性的修改对象的某些属性, 而调用with时, 通常是修改对象的单个属性.

它们之间的区别类似于函数式编程中curringpartial apply的区别.
主要相似点在于, 参数传入的数量不同, 另外返回的都是一个新的对象/函数.

curring: 每次只能传入一个参数, 返回一个函数, 该函数接收剩余的参数.
partial apply: 每次可以传入多个参数, 返回一个函数, 该函数接收剩余的参数.

lombok中, 通过@With注解来实现with方法.

案例

val person = Person()
person.withName("John").withAge(30)

现有案例

parse

该方法通常用于将字符串解析为对象.

案例

val date = Date.parse("2020-01-01")

现有案例

of

该方法通常用于将多个参数组合为一个对象.

案例

val list = List.of(1, 2, 3)

现有案例

属性和状态

这些命名前缀用于表示对象的属性和状态

get

该方法通常用于获取对象的属性.

案例

person.getName()

现有案例

set or put

该方法通常用于设置对象的属性.

案例

person.setName(name = "Jack")

现有案例

is

该方法通常用于判断对象的状态.

案例

person.isAdult()

现有案例

对象的元素操作

这些命名前缀用于表示含有一些元素的对象的操作, 通常在具有一对多的关系的对象中比较常见

has

该方法通常用于判断对象是否包含某个元素.

案例

现有案例

user.hasRole(role = "ADMIN")

add

该方法通常用于向对象中添加元素.

案例

user.addRole(role = "ADMIN")

现有案例

remove

该方法通常用于从对象中移除元素.

案例

user.removeRole(role = "ADMIN")

现有案例

其他

这些命名前缀没有特定的含义, 但是在一些特定的场景中, 会有特定的含义.

to

该方法通常用于将对象转换为另一种类型.

案例

account.toDto()
account.toEntity()

现有案例

do

该方法通常用于执行某个操作.
该方法在spring中比较常见, 通常表示在执行完某些前置工作, 例如输入验证, 然后开始执行真正的操作.

案例

public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {

	protected <T> T doGetBean(
		String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
		throws BeansException {

	}

}
public class DispatcherServlet extends FrameworkServlet {

	@Override
	protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// DO SOMETHING
	}

}
public abstract class AbstractPlatformTransactionManager implements PlatformTransactionManager {

	protected void doBegin(Object transaction, TransactionDefinition definition) {
		// DO SOMETHING
	}

}

参考


Edit page
Share this post on:

Previous Post
启用SSH密码验证
Next Post
springdoc-v2中在不配置@ParameterObject的情况下实现Pageable以及Sort对象到API参数的转换