结构类命名
除了基本的数据结构,如数组、链表、队列、栈等,其他更高一层的常见抽象类,能够大量减少大家的交流,并能封装常见的变化。
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,大家仔细感受下其中的区别就可以了。
命名是编码中非常重要的一环,希望大家找到其中的规律,让你的代码功能上强大,颜值上好看;祝大家的薪资水涨船高,配得上你的这份专业和工匠精神。