代码命名
2024-05-12 20:18:56 29 举报
AI智能生成
转自[Java日知录公众号](https://mp.weixin.qq.com/s/_0r5UkQ915ckiZJHtuP1Ag)的开发规范整理
作者其他创作
大纲/内容
管理类命名
Bootstrap、Starter
一般作为程序启动器使用,或者作为启动器的基类。通俗来说,可以认为是main函数的入口
Processor
某一类功能的处理器,用来标识某个处理过程,是一系列代码片段的集合。
Manager
对有生命状态的对象进行管理,通常作为某一类资源的管理入口。
Holder
表示持有某个或者某类对象的引用,并可以对其进行统一管理。多见于不好回收的内存统一处理,或者一些全局集合容器的缓存,如QueryHolder、InstructionHolder、ViewHolder
Factory
工厂模式的命名
Provider
Provider=Strategy+Factory Method。它更高级一些,把策略模式和方法工厂揉在了一块,让人用起来很顺手。Provider一般是接口或抽象类,以便能够完成子类实现,如AccountFeatureProvider、ApplicationFeatureProviderImpl、CollatorProvider
Registrar
注册并管理一些列资源,如ImportServiceRegistrar、IKryoRegistrar、PipelineOptionsRegistrar
Engine
一般是核心模块,用来处理一类功能。引擎是个非常高级的名词,一般的类是没有资格用它的,如ScriptEngine、DataQLScriptEngine、C2DEngine
Service
某个服务
Task
某个任务,通常是个Runnable
传播类命名
Context
程序执行时,有一些变量,需要从函数的入口开始,一直传到大量子函数执行完毕之后。这些变量或者集合,如果以参数的形式传递,将会让代码变得冗长无比。这个时候,就可以把变量统一塞到context里面,以单个对象的形式进行传递。而在Java中,由于ThreadLocal的存在,Context甚至可以不用再参数之间进行传递
Propagator
传播,繁殖。用来将Context中传递的值进行复制,添加,清除,重置,检索,恢复等动作。通常,它会提供一个叫做propagate的方法,实现真正的变量管理。如TextMapPropagator、FilePropagator、TransactionPropagator
回调类命名
Handler、Callback、Trigger、Listener
callback通常是一个接口,用于响应某类消息,进行后续处理;Handler通常表示持有真正消息处理逻辑的对象,它是有状态的;trigger触发器代表某类事件的处理,属于Handler,通常不会出现在类的命名中;Listener的应用更加局限,通常在观察者模式中用来表示特定的含义。如ChannelHandler、SuccessCallback、CronTrigger、EventListener
Aware
Aware就是感知的意思,一般以该单词结尾的类,都实现了Aware接口。拿Spring来说,Aware的目的就是为了让Bean获取Spring容器的服务。具体回调方法由子类实现,比如ApplicationContextAware
监控类命名
Metric
表示监控数据,不要用Monitor,如TimelineMetric、HistogramMetric
Estimator
估计,统计。用于计算某一类统计数值的计算器,如ConditionalDensityEstimator、FixedFrameRateEstimator、NestableLoadProfileEstimator
Accumulator
累加器的意思。用来缓存累加的中间计算结果,并提供读取通道,如AbstractAccumulator、StatsAccumulator、TopFrequencyAccumulator
Tracker
一般用于记录日志或者监控值,通常用于apm中,如VelocityTracker、RocketTracker、MediaTracker
内存管理类命名
Allocator
与存储相关,通常表示内存分配器或者管理器。如果你的程序需要申请有规律的大块内存,allocator是你的不二选择。如AbstractByteBufAllocator、ArrayAllocator、RecyclingIntBlockAllocator
Chunk
表示一块内存。如果需要对一类存储资源进行抽象,并统一管理,可以采用它来命名。如EncryptedChunk、ChunkFactory、MultiChunk
Arena
英文是舞台、竞技场的意思。由于Linux把它用在内存管理上,它普遍用于各种存储资源的申请、释放与管理。为不同规则的存储chunk提供舞台,好像也是非常形象的表示。关键是,这个词很美,作为后缀让类名显得很漂亮。如BookingArena、StandaloneArena、PoolArena
Pool
表示池子。内存池、连接池、线程池
过滤检测类命名
Pipeline、Chain
一般用在责任链模式中。Netty、SpringMVC、Tomcat等都有大量应用。通过将某个处理过程假如到责任链的某个位置中,就可以接收前面处理过程的结果,强制添加或者改变某些功能。就像Linux的管道操作一样,最终构造出想要的结果。如Pipeline、ChildPipeline、DefaultResourceTransformerChain、FilterChain
Filter
过滤器,用来筛选某些满足条件的数据集,或者在满足某些条件的时候执行一部分逻辑。如果和责任链连接起来,则通常能够实现多级的过滤。
Interceptor
拦截器,其实和Filter差不多。不过Interceptor可以拿到controller对象,但是filter不行。拦截器是被包裹在过滤器中的。
Evaluator
英文里是评估器的意思。可用于判断某些条件是否成立,一般内部方法evaluate会返回bool类型。比如传进去一个非常复杂的对象,或者字符串,进行正常与否的判断。如ScriptEvaluator、SubtractionExpressionEvaluator、StreamEvaluator
Detector
探测器。用来管理一系列探测新事件,并在发生的时候能够进行捕获和响应。比如Android的手势检测,温度检测等。如FileHandlerReloadingDetector、TransformGestureDetector 、ScaleGestureDetector
结构类命名
Cache
缓存。大块的缓存。常见的缓存算法有LRU、LFU、FIFO等
Buffer
缓冲,不同于缓存,一般用在数据写入阶段。
Composite
将相似的组件进行组合,并以相同的接口或者功能进行暴露,使用者不知道这到底是一个组合体还是其他个体。如CompositeData、CompositeMap、ScrolledComposite
Wrapper
用来包装某个对象,做一些额外的处理,以便增加或者去掉某些功能。
Option、Param、Attribute
用来标识配置信息。与Properties区别并不大,但由于Option通常是一个类,所以功能可以扩展的更强大一些。它通常比Config的级别更小,关注的也是单个属性的值。Param一般是作为参数存在,对象生成的速度要更快一些。
Tuple
元组的概念。由于Java中缺乏元组结构,我们通常会自定义这样的类。
Aggregator
聚合器,可以做一些聚合计算。比如分库分表中的sum,max,min等聚合函数的汇集。如BigDecimalMaxAggregator、PipelineAggregator、TotalAggregator
Iterator
迭代器。可以实现Java的迭代器接口,也可以有自己的迭代方式。在数据集河大的时候,需要进行深度遍历,迭代器可以说是必备的。使用迭代器还可以在迭代过程中安全的删除某些元素。
Batch
某些可以批量执行的请求或者对象。
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是个另类。这也说明了,规则是人定的,人也可以破坏。
Template
模板方法类的命名。定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Proxy
代理模式。为其他对象提供一种代理以控制对这个对象的访问。
解析类命名
Converter、Resolver
转换和解析。一般用于不同对象之间的格式转换,把一类对象转换成另一类。注意他们在语义上的区别,一般特别复杂的转换或者有加载过程的需求,可以使用Resolver。如DataSetToListConverter、LayoutCommandLineConverter、InitRefResolver、MustacheViewResolver
Parser
用来表示非常复杂的解析器,比如解析DSL
Customizer
用来表示对某个对象进行特别的配置。由于这些配置过程特别的复杂,值得单独提取出来进行自定义设置。如ContextCustomizer、DeviceFieldCustomizer
Formatter
格式化类。主要用于字符串、数字或者日期的格式化处理工作
网络类命名
Packet
通常用于网络编程中的数据包。如DhcpPacket、PacketBuffer
Protocol
表示某个协议。如RedisProtocol、HttpProtocol
Encoder、Decoder、Codec
编码解码器
Request、Response
一般用于网络请求的出和进。如果用在非网络请求上,会显得很怪异
其他
Util、Helper
都表示工具类,Util一般是无状态的,Helper以便需要创建实例才能使用。但是一般没有使用Tool作为后缀的。
Mode、Type
看到mode这个后缀,就能猜到这个类大概率是枚举。它通常把常见的可能性都列到枚举类里面,其他地方就可以引用这个Mode
Invoker、Invocation
invoker是一类接口,通常会以反射或者出发的方法,执行一些具体的业务逻辑。通过抽象出invoke方法,可以在invoke执行之前对入参进行记录或者处理;在invoke执行之后对结果和异常进行处理,是AOP中常见的操作方式。如MethodInvoker、Invoker、ConstructorInvocation
Initializer
如果你的应用程序,需要经过大量的初始化操作才能启动,那就需要把它独立出来,专门处理初始化动作。如MultiBackgroundInitialize、ApplicationContextInitializer
Feture、Promise
它们都是用在多线程之间的,进行数据传递。
Feture相当于一个占位符,代表一个操作将来的结果。一般通过get可以直接阻塞得到结果,或者让它异步执行然后通过callback回调结果。
但是如果回调中嵌入了回调,如果层次很深,那就是回调地狱。Java中的CompletableFuture其实就是Promise,用来解决回调地狱问题。Promise是为了让代码变得优美而存在的。
Feture相当于一个占位符,代表一个操作将来的结果。一般通过get可以直接阻塞得到结果,或者让它异步执行然后通过callback回调结果。
但是如果回调中嵌入了回调,如果层次很深,那就是回调地狱。Java中的CompletableFuture其实就是Promise,用来解决回调地狱问题。Promise是为了让代码变得优美而存在的。
Selector
根据一系列条件,获得响应的同类资源。它比较像Factory,但只处理单项资源。
Reporter
用来汇报某些执行结果。如ExtentHtmlReporter、MetricReporter
Constants
一般用于常量列表
Accessor
封装了一系列get和set方法的类。像lombok就有Accessors注解,生成这些方法。但是Accessor类一般是要通过计算来完成get和set,而不是直接操作变量。这适合比较复杂的对象存取服务。如ComponentAccessor、StompHeaderAccessor
Generator
生成器,一般用于生成代码,生成Id等
0 条评论
下一页