类命名规范 - 图1

管理类命名

写代码,少不了对资源的统一管理,清晰的启动过程可以有效的组织代码。

Bootstrap、Starter

一般作为程序启动器使用,或者作为启动器的基类,可以认为是main函数入口

AbstractBootstrap、ServerBootstrap、MacosXApplicationStarter、DNSTaskStarter

Processor

某一类功能的处理器,用来标识某个处理过程,是一系列代码片段的集合。

CompoundProcessor、BinaryComparisonProcessor、DefaultDefaultValueProcessor

Manager

对有生命状态的对象进行管理、通常作为某一类资源的管理入口

AccountManager、DevicePolicyManager、TransactionManager

Holder

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

QueryHolder、InstructionHolder、ViewHolder

Factory

毫无疑问,工厂模式的命名。

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传递

AppContext、ServletContext、ApplicationContext

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

TextMapPropagator、FilePropagator、TransactionPropagator

回调类命名

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

Handler、Callback、Trigger、Listener

handler通常表示只有真正消息处理逻辑的对象,是状态的。
callback通常是一个接口,用于响应某类消息,进行后续处理。
trigger触发器代表某类事件的处理,属于handler,通常不会出现在类的命名中
listener的应用更加局限,通常在观察者模式中用来标识特定的含义

ChannelHandler、SuccessCallback、CronTrigger、EventListener

Aware

感知的意思;在Spring中,Aware的目的是为了让bean获取Spring容器的服务。具体回调方法由子类实现,比如ApplicationContextAware,有一点回调的意思。

ApplicationContextAware、ApplicationStartupAware、ApplicationEventPublisherAware

监控类命名

Metric

表示监控数据

TimelineMetric、HistogramMetric、Metric

Estimator

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

ConditionalDensityEstimator、FixedFrameRateEstimator、NestableLoadProfileEstimator

Accumulator

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

AbstractAccumulator、StatsAccumulator、TopFrequencyAccumulator

Tracker

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

VelocityTracker、RocketTracker、MediaTracker

内存管理类命名

Allocator

与存储相关,通常表示内存分配器或者管理器。

AbstractByteBufAllocator、ArrayAllocator、RecyclingIntBlockAlloctor

Chunk

表示一块内存

EncryptedChunk、ChunkFactory、MultiChunk

Pool

表示池子,内存池,线程池,连接池等

ConnectionPool、ObjectPool、MemoryPool

过滤检测类命名

Pipeline、Chain

一般用于责任链模式中。Netty、Spring、Tomcat都有大量应用。通过将某个处理过程加入到责任链的某个位置中,就可以接收前面处理过程的结果、强制添加或改变某些功能。

Pipeline、ChildPipeline、DefaultResourceTransformerChain、FilterChain

Filter

过滤器,用来筛选某些满足条件的数据集,或者在满足某些条件的时候执行 一部分逻辑。

FilenameFilter、AfterFirstEventTimeFilter、ScanFilter

Interceptor

和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

其他

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

Future、Promise

它们都是用在多线程之间的,进行数据传递。
Future相当于一个占位符,代表一个操作将来的结果。一般通过get可以直接阻塞得到结果,或者让它异步执行然后通过callback回调结果。
但如果回调中嵌入了回调呢?如果层次很深,就是回调地狱。Java中的CompletableFuture其实就是Promise,用来解决回调地狱问题。Promise是为了让代码变得优美而存在的。

Selector

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

X509CertSelector、NodeSelector