优秀开源软件的类,都是怎么命名的?

⚠️本文为掘金社区首发签约文章,未获受权禁止转载算法

平常编码中,代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图,也是一项必备的能力。那它们有什么规律呢?spring

Java项目的代码结构,可以体现它的设计理念。Java采用长命名的方式来规范类的命名,可以本身表达它的主要意图。配合高级的IDE,能够减小编码人员的记忆负担,靠模糊的匹配就能找到本身所须要的资源。编程

为了让你们更好的理解命名的套路,我借鉴了最流行的Java接开源软件(spring系列,netty,libgdx,guava,logback等等),总结了10类常见的类命名。大多数是之后缀形式存在的,也有很多能够组合使用,用来表达多重的意义。json

image-20210810135355862.png

这些单词很简单,但可让你的类命名看起来更加清爽和专业。接下来,我将带你们游览一遍。为了方便理解,每种类型,我都配备了相应的 示例。后端

管理类命名

写代码,少不了对统一资源的管理,清晰的启动过程能够有效的组织代码。为了让程序运行起来,少不了各类资源的注册、调度,少不了公共集合资源的管理。设计模式

Bootstrap,Starter

通常做为程序启动器使用,或者做为启动器的基类。通俗来讲,能够认为是main函数的入口。api

AbstractBootstrap
ServerBootstrap
MacosXApplicationStarter
DNSTaskStarter
复制代码

Processor

某一类功能的处理器,用来表示某个处理过程,是一系列代码片断的集合。若是你不知道一些顺序类的代码怎么命名,就可使用它,显得高大上一些。数组

CompoundProcessor
BinaryComparisonProcessor
DefaultDefaultValueProcessor
复制代码

Manager

对有生命状态的对象进行管理,一般做为某一类资源的管理入口。缓存

AccountManager
DevicePolicyManager
TransactionManager
复制代码

Holder

表示持有某个或者某类对象的引用,并能够对其进行统一管理。多见于很差回收的内存统一处理,或者一些全局集合容器的缓存。安全

QueryHolder
InstructionHolder
ViewHolder
复制代码

Factory

毫无疑问,工厂模式的命名,耳熟能详。尤为是Spring中,多不胜数。

SessionFactory
ScriptEngineFactory
LiveCaptureFactory
复制代码

Provider

Provider = Strategy + Factory Method。它更高级一些,把策略模式和方法工厂揉在了一块,让人用起来很顺手。Provider通常是接口或者抽象类,以便可以完成子实现。

AccountFeatureProvider
ApplicationFeatureProviderImpl
CollatorProvider
复制代码

Registrar

注册并管理一系列资源。

ImportServiceRegistrar
IKryoRegistrar
PipelineOptionsRegistrar
复制代码

Engine

通常是核心模块,用来处理一类功能。引擎是个很是高级的名词,通常的类是没有资格用它的。

ScriptEngine
DataQLScriptEngine
C2DEngine
复制代码

Service

某个服务。太简单,不忍举例。范围太广,不要滥用哦。

IntegratorServiceImpl
ISelectionService
PersistenceService
复制代码

Task

某个任务。一般是个runnable

WorkflowTask
FutureTask
ForkJoinTask
复制代码

传播类命名

为了完成一些统计类或者全局类的功能,有些参数须要一传到底。传播类的对象就能够经过统一封装的方式进行传递,并在合适的地方进行拷贝或者更新。

Context

若是你的程序执行,有一些变量,须要从函数执行的入口开始,一直传到大量子函数执行完毕以后。这些变量或者集合,若是以参数的形式传递,将会让代码变得冗长无比。这个时候,你就能够把变量统一塞到Context里面,以单个对象的形式进行传递。

在Java中,因为ThreadLocal的存在,Context甚至能够不用在参数之间进行传递。

AppContext
ServletContext
ApplicationContext
复制代码

Propagator

传播,繁殖。用来将context中传递的值进行复制,添加,清除,重置,检索,恢复等动做。一般,它会提供一个叫作propagate的方法,实现真正的变量管理。

TextMapPropagator
FilePropagator
TransactionPropagator
复制代码

回调类命名

使用多核能够增长程序运行的效率,不可避免的引入异步化。咱们须要有必定的手段,获取异步任务执行的结果,对任务执行过程当中的关键点进行检查。回调类API能够经过监听、通知等形式,获取这些事件。

Handler,Callback,Trigger,Listener

callback一般是一个接口,用于响应某类消息,进行后续处理;Handler一般表示持有真正消息处理逻辑的对象,它是有状态的;tigger触发器表明某类事件的处理,属于Handler,一般不会出如今类的命名中;Listener的应用更加局限,一般在观察者模式中用来表示特定的含义。

ChannelHandler
SuccessCallback
CronTrigger
EventListener
复制代码

Aware

Aware就是感知的意思,通常以该单词结尾的类,都实现了Aware接口。拿spring来讲,Aware 的目的是为了让bean获取spring容器的服务。具体回调方法由子类实现,好比ApplicationContextAware。它有点回调的意思。

ApplicationContextAware
ApplicationStartupAware
ApplicationEventPublisherAware
复制代码

监控类命名

如今的程序都比较复杂,运行状态监控已经成为居家必备之良品。监控数据的收集每每须要侵入到程序的边边角角,如何有效的与正常业务进行区分,是很是有必要的。

Metric

表示监控数据。不要用Monitor了,比较丑。

TimelineMetric
HistogramMetric
Metric
复制代码

Estimator

估计,统计。用于计算某一类统计数值的计算器。

ConditionalDensityEstimator
FixedFrameRateEstimator
NestableLoadProfileEstimator
复制代码

Accumulator

累加器的意思。用来缓存累加的中间计算结果,并提供读取通道。

AbstractAccumulator
StatsAccumulator
TopFrequencyAccumulator
复制代码

Tracker

通常用于记录日志或者监控值,一般用于apm中。

VelocityTracker
RocketTracker
MediaTracker
复制代码

内存管理类命名

若是你的应用用到了自定义的内存管理,那么下面这些名词是绕不开的。好比Netty,就实现了本身的内存管理机制。

Allocator

与存储相关,一般表示内存分配器或者管理器。若是你得程序须要申请有规律得大块内存,allocator是你得不二选择。

AbstractByteBufAllocator
ArrayAllocator
RecyclingIntBlockAllocator
复制代码

Chunk

表示一块内存。若是你想要对一类存储资源进行抽象,并统一管理,能够采用它。

EncryptedChunk
ChunkFactory
MultiChunk
复制代码

Arena

英文是舞台、竞技场的意思。因为Linux把它用在内存管理上发扬光大,它广泛用于各类存储资源的申请、释放与管理。为不一样规格的存储chunk提供舞台,好像也是很是形象的表示。

关键是,这个词很美,做为后缀让类名显得很漂亮。

BookingArena
StandaloneArena
PoolArena
复制代码

Pool

表示池子。内存池,线程池,链接池,池池可用。

ConnectionPool
ObjectPool
MemoryPool
复制代码

过滤检测类命名

程序收到的事件和信息是很是多的,有些是合法的,有些须要过滤扔掉。根据不一样的使用范围和功能性差异,过滤操做也有多种形式。你会在框架类代码中发现大量这样的名词。

Pipeline,Chain

通常用在责任链模式中。Netty,Spring MVC,Tomcat等都有大量应用。经过将某个处理过程加入到责任链的某个位置中,就能够接收前面处理过程的结果,强制添加或者改变某些功能。就像Linux的管道操做同样,最终构造出想要的结果。

Pipeline
ChildPipeline
DefaultResourceTransformerChain
FilterChain
复制代码

Filter

过滤器,用来筛选某些知足条件的数据集,或者在知足某些条件的时候执行一部分逻辑。若是和责任链链接起来,则一般可以实现多级的过滤。

FilenameFilter
AfterFirstEventTimeFilter
ScanFilter
复制代码

Interceptor

拦截器,其实和Filter差很少。不过在Tomcat中,Interceptor能够拿到controller对象,但filter不行。拦截器是被包裹在过滤器中。

HttpRequestInterceptor
复制代码

Evaluator

英文里是评估器的意思。可用于判断某些条件是否成立,通常内部方法evaluate会返回bool类型。好比你传递进去一个很是复杂的对象,或者字符串,进行正确与否的判断。

ScriptEvaluator
SubtractionExpressionEvaluator
StreamEvaluator
复制代码

Detector

探测器。用来管理一系列探测性事件,并在发生的时候可以进行捕获和响应。好比Android的手势检测,温度检测等。

FileHandlerReloadingDetector
TransformGestureDetector 
ScaleGestureDetector
复制代码

结构类命名

除了基本的数据结构,如数组、链表、队列、栈等,其余更高一层的常见抽象类,可以大量减小你们的交流,并能封装常见的变化。

Cache

这个没啥好说的,就是缓存。大块的缓存。常见的缓存算法有LRU、LFU、FIFO等。

LoadingCache
EhCacheCache
复制代码

Buffer

buffer是缓冲,不一样于缓存,它通常用在数据写入阶段。

ByteBuffer
RingBuffer
DirectByteBuffer
复制代码

Composite

将类似的组件进行组合,并以相同的接口或者功能进行暴露,使用者不知道这究竟是一个组合体仍是其余个体。

CompositeData
CompositeMap
ScrolledComposite
复制代码

Wrapper

用来包装某个对象,作一些额外的处理,以便增长或者去掉某些功能。

IsoBufferWrapper
ResponseWrapper
MavenWrapperDownloader 
复制代码

Option, Param,Attribute

用来表示配置信息。说实话,它和Properties的区别并不大,但因为Option一般是一个类,因此功能能够扩展的更强大一些。它一般比Config的级别更小,关注的也是单个属性的值。Param通常是做为参数存在,对象生成的速度要快一些。

SpecificationOption
SelectOption
AlarmParam
ModelParam
复制代码

Tuple

元组的概念。因为Java中缺少元组结构,咱们一般会自定义这样的类。

Tuple2
Tuple3
复制代码

Aggregator

聚合器,能够作一些聚合计算。好比分库分表中的sum,max,min等聚合函数的聚集。

BigDecimalMaxAggregator
PipelineAggregator
TotalAggregator
复制代码

Iterator

迭代器。能够实现Java的迭代器接口,也能够有本身的迭代方式。在数据集很大的时候,须要进行深度遍历,迭代器能够说是必备的。使用迭代器还能够在迭代过程当中安全的删除某些元素。

BreakIterator
StringCharacterIterator
复制代码

Batch

某些能够批量执行的请求或者对象。

SavedObjectBatch
BatchRequest
复制代码

Limiter

限流器,使用漏桶算法或者令牌桶来完成平滑的限流。

DefaultTimepointLimiter
RateLimiter
TimeBasedLimiter
复制代码

常见设计模式命名

设计模式是名词的重灾区,这里只列出最常使用的几个。

Strategy

将抽象部分与它的实现部分分离,使它们均可以独立地变化。策略模式。相同接口,不一样实现类,同一方法结果不一样,实现策略不一样。好比一个配置文件,是放在xml里,仍是放在json文件里,均可以使用不一样的provider去命名。

RemoteAddressStrategy
StrategyRegistration
AppStrategy
复制代码

Adapter

将一个类的接口转换为客户但愿的另外一个接口,Adapter模式使得本来因为接口不兼容而不能一块儿工做的那些类一块儿工做。

不过,相对于传统的适配器进行api转接,若是你的某个Handler里面方法特别的多,可使用Adapter实现一些默认的方法进行0适配。那么其余类使用的时候,只须要继承Adapter,而后重写他想要重写的方法就能够了。这也是Adapter的常见用法。

ExtendedPropertiesAdapter
ArrayObjectAdapter
CardGridCursorAdapter
复制代码

Action,Command

将一个请求封装为一个对象,从而使你可用不一样的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操做。

用来表示一系列动做指令,用来实现命令模式,封装一系列动做或者功能。Action通常用在UI操做上,后端框架能够无差异的使用。

在DDD的概念中,CQRS的Command的C,既为Command。

DeleteAction
BoardCommand
复制代码

Event

表示一系列事件。通常的,在语义上,Action,Command等,来自于主动触发;Event来自于被动触发。

ObservesProtectedEvent
KeyEvent
复制代码

Delegate

代理或者委托模式。委托模式是将一件属于委托者作的事情,交给另一个被委托者来处理。

LayoutlibDelegate
FragmentDelegate
复制代码

Builder

将一个复杂对象的构建与它的表示分离,使得一样的构建过程能够建立不一样的表示。

构建者模式的标准命名。好比StringBuilder。固然StringBuffer是个另类。这也说明了,规则是人定的,人也能够破坏。

JsonBuilder
RequestBuilder
复制代码

Template

模板方法类的命名。定义一个操做中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤。

JDBCTemplate
复制代码

Proxy

代理模式。为其余对象提供一种代理以控制对这个对象的访问。

ProxyFactory 
SlowQueryProxy
复制代码

解析类命名

写代码要涉及到大量的字符串解析、日期解析、对象转换等。根据语义和使用场合的区别,它们也分为多种。

Converter,Resolver

转换和解析。通常用于不一样对象之间的格式转换,把一类对象转换成另外一类。注意它们语义上的区别,通常特别复杂的转换或者有加载过程的需求,可使用Resolver。

DataSetToListConverter
LayoutCommandLineConverter
InitRefResolver
MustacheViewResolver
复制代码

Parser

用来表示很是复杂的解析器,好比解析DSL。

SQLParser
JSONParser
复制代码

Customizer

用来表示对某个对象进行特别的配置。因为这些配置过程特别的复杂,值得单独提取出来进行自定义设置。

ContextCustomizer
DeviceFieldCustomizer
复制代码

Formatter

格式化类。主要用于字符串、数字或者日期的格式化处理工做。

DateFormatter
StringFormatter
复制代码

网络类命名

网络编程的同窗,永远绕不过去的几个名词。

Packet

一般用于网络编程中的数据包。

DhcpPacket
PacketBuffer
复制代码

Protocol

一样用户网络编程中,用来表示某个协议。

RedisProtocol
HttpProtocol
复制代码

Encoder、Decoder、Codec

编码解码器

RedisEncoder
RedisDecoder
RedisCodec
复制代码

Request,Response

通常用于网络请求的进和出。若是你用在非网络请求的方法上,会显得很怪异。

CRUD命名

这个就有意思多了,统一的Controller,Service,Repository,没什么好说的。但你一旦用了DDD,那就得按照DDD那一套的命名来。

因为DDD不属于通用编程范畴,它的名词就很少作介绍了。

其余

Util,Helper

都表示工具类,Util通常是无状态的,Helper以便须要建立实例才能使用。可是通常没有使用Tool做为后缀的。

HttpUtil
TestKeyFieldHelper
CreationHelper
复制代码

Mode,Type

看到mode这个后缀,就能猜到这个类大几率是枚举。它一般把常见的可能性都列到枚举类里面,其余地方就能够引用这个Mode。

OperationMode
BridgeMode
ActionType
复制代码

Invoker,Invocation

invoker是一类接口,一般会以反射或者触发的方式,执行一些具体的业务逻辑。经过抽象出invoke方法,能够在invoke执行以前对入参进行记录或者处理;在invoke执行以后对结果和异常进行处理,是AOP中常见的操做方式。

MethodInvoker
Invoker
ConstructorInvocation
复制代码

Initializer

若是你的应用程序,须要通过大量的初始化操做才能启动,那就须要把它独立出来,专门处理初始化动做。

MultiBackgroundInitialize
ApplicationContextInitializer
复制代码

Feture,Promise

它们都是用在多线程之间的,进行数据传递。

Feture至关于一个占位符,表明一个操做未来的结果。通常经过get能够直接阻塞获得结果,或者让它异步执行而后经过callback回调结果。

但若是回调中嵌入了回调呢?若是层次很深,就是回调地狱。Java中的CompletableFuture其实就是Promise,用来解决回调地狱问题。Promise是为了让代码变得优美而存在的。

Selector

根据一系列条件,得到相应的同类资源。它比较像Factory,但只处理单项资源。

X509CertSelector
NodeSelector
复制代码

Reporter

用来汇报某些执行结果。

ExtentHtmlReporter
MetricReporter
复制代码

Constants

通常用于常量列表。

Accessor

封装了一系列get和set方法的类。像lombok就有Accessors注解,生成这些方法。但Accessor类通常是要经过计算来完成get和set,而不是直接操做变量。这适合比较复杂的对象存取服务。

ComponentAccessor
StompHeaderAccessor
复制代码

Generator

生成器,通常用于生成代码,生成id等。

CodeGenerator
CipherKeyGenerator
复制代码

End

写代码,看源码,怎么少得了意会和神通?代码要带感,命名也风骚。命名起的好,代码会看起来很爽,你们也都喜欢。

说不清楚的事情,给一段代码,咱就能懂!就是这么神奇!

其实,写专业牛b的代码,并不须要了解太多的英文单词,大多数时候用不着英文4级这么了不得的水平。只须要有限的单词,就能玩出代码界好莱坞的感受。

看完本文以后,翻一翻开源软件的代码们,看看是否是这个理?

上面这些命名,高频率存在于各类框架中。你要是搞懂了这些名词,阅读大部分源代码能够说是一点障碍都没有了。在同一个场景下,优先使用这些名词,已是你们心领神会的规范。

有不少名词来自于设计模式,但又在特定场合使用了比较特殊的单词,好比Provider,你们仔细感觉下其中的区别就能够了。

命名是编码中很是重要的一环,但愿你们找到其中的规律,让你的代码功能上强大,颜值上好看;祝你们的薪资水涨船高,配得上你的这份专业和工匠精神。

⚠️本文为掘金社区首发签约文章,未获受权禁止转载

相关文章
相关标签/搜索