代码命名规范是一种责任也是一种精神(工匠精神)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
代码命名规范之美
规范概述
代码命名规范是编程中非常重要的一个方面它直接关系到代码的可读性、可维护性和可扩展性。下面是一些代码命名规范的美
可读性良好的代码命名规范可以使代码更易于阅读和理解这可以帮助其他开发人员更快地理解代码并且减少错误和调试的时间。
可维护性良好的命名规范可以使代码更容易维护因为更好的命名可以帮助开发人员更快地找到需要修改的代码块同时减少了修改代码时出现的错误。
可扩展性好的命名规范可以帮助代码更容易扩展因为它们可以使添加新功能和修改代码更加容易。
一致性命名规范应该是一致的这可以使整个代码库的代码更具可读性并且使开发人员更容易理解代码的结构。
可理解性良好的代码命名规范可以帮助开发人员更好地理解代码的含义和目的这可以减少代码中的歧义和混淆。
总之良好的命名规范是代码的一项关键方面可以帮助提高代码的质量和可维护性同时也可以减少错误和调试的时间。
命名规范
管理类命名
写代码少不了对统一资源的管理清晰的启动过程可以有效的组织代码。为了让程序运行起来少不了各种资源的注册、调度少不了公共集合资源的管理。
Bootstrap
一般作为程序启动器使用或者作为启动器的基类。通俗来说可以认为是main函数的入口。如SpringBoot中的监听器BootstrapApplicationListener
org.springframework.cloud.bootstrap.BootstrapApplicationListener
Processor
某一类功能的处理器用来表示某个处理过程是一系列代码片段的集合。如果你不知道一些顺序类的代码怎么命名就可以使用它显得高大上一些。举例我们可以参考Spring提供的BeanFactoryPostProcessor 后置处理器
org.springframework.beans.factory.config.BeanFactoryPostProcessorinterface
org.springframework.context.annotation.CommonAnnotationBeanPostProcessor impl
Manager
对有生命状态的对象进行管理通常作为某一类资源的管理入口。
AccountManagerDevicePolicyManagerTransactionManager
Holder
表示持有某个或者某类对象的引用并可以对其进行统一管理。多见于不好回收的内存统一处理或者一些全局集合容器的缓存。具体如Spring里面的BeanDefinitionHolder通用构建器等
org.springframework.beans.factory.config.BeanDefinitionHolder用于快速创建BeanDefinition对象
Factory
毫无疑问工厂模式的命名耳熟能详。尤其是Spring中多不胜数举例DefaultListableBeanFactory是唯一实现BeanFactory工厂类。
org.springframework.beans.factory.support.DefaultListableBeanFactory
Provider
Provider = Strategy + Factory Method。它更高级一些把策略模式和方法工厂揉在了一块让人用起来很顺手。Provider一般是接口或者抽象类以便能够完成子实现。举例在SpringMVC提供了请求路径匹配提供接口同时我们在Java的spi也体现了很多provider接口大家可以阅读阅读提高对这个类的认识以便后续可以写出更高效的代码。
org.springframework.boot.autoconfigure.security.servlet.RequestMatcherProvider (interface)
java.util.spi.ResourceBundleProvider (interface)
Registrar
注册并管理一系列资源。在Spring也提供了类似接口如Bean注册(BeanDefinitionRegistry)Bean别名注册(AliasRegistry)等
org.springframework.beans.factory.support.BeanDefinitionRegistry
org.springframework.core.AliasRegistry
org.springframework.context.annotation.ImportBeanDefinitionRegistrar
Engine
一般是核心模块用来处理一类功能。引擎是个非常高级的名词一般的类是没有资格用它的。比如Nacos源码提供了一个抽象任务执行引擎AbstractNacosTaskExecuteEngine
com.alibaba.nacos.common.task.engine.AbstractNacosTaskExecuteEngine
Service
某个服务。范围太广在业务体现在某个业务Service某个服务Service等等
bizService
moduleService
Task
某个任务。通常是个runnable
WorkflowTask
FutureTask
ForkJoinTask
传播类命名
为了完成一些统计类或者全局类的功能有些参数需要一传到底。传播类的对象就可以通过统一封装的方式进行传递并在合适的地方进行拷贝或者更新。
为了完成一些统计类或者全局类的功能有些参数需要一传到底。传播类的对象就可以通过统一封装的方式进行传递并在合适的地方进行拷贝或者更新。
Context
如果你的程序执行有一些变量需要从函数执行的入口开始一直传到大量子函数执行完毕之后。这些变量或者集合如果以参数的形式传递将会让代码变得冗长无比。这个时候你就可以把变量统一塞到Context里面以单个对象的形式进行传递。
在Java中由于ThreadLocal的存在Context甚至可以不用在参数之间进行传递。
AppContextServletContext
ApplicationContext
Propagator
传播繁殖。用来将context中传递的值进行复制添加清除重置检索恢复等动作。通常它会提供一个叫做propagate的方法实现真正的变量管理。
TextMapPropagator
FilePropagator
TransactionPropagator
回调类命名
使用多核可以增加程序运行的效率不可避免的引入异步化。我们需要有一定的手段获取异步任务执行的结果对任务执行过程中的关键点进行检查。回调类API可以通过监听、通知等形式获取这些事件。
Handler CallbackTriggerListener
callback通常是一个接口用于响应某类消息进行后续处理Handler通常表示持有真正消息处理逻辑的对象它是有状态的tigger触发器代表某类事件的处理属于Handler通常不会出现在类的命名中Listener的应用更加局限通常在观察者模式中用来表示特定的含义。
ChannelHandler
SuccessCallback
CronTrigger
EventListener
Aware
Aware就是感知的意思一般以该单词结尾的类都实现了Aware接口。拿spring来说Aware 的目的是为了让bean获取spring容器的服务。具体回调方法由子类实现比如ApplicationContextAware。它有点回调的意思。
ApplicationContextAware
ApplicationStartupAware
ApplicationEventPublisherAware
监控类命名
现在的程序都比较复杂运行状态监控已经成为居家必备之良品。监控数据的收集往往需要侵入到程序的边边角角如何有效的与正常业务进行区分是非常有必要的。
Metrics
表示监控数据比如Spring提供很多类似监控类如DataSourcePoolMetricss
org.springframework.boot.actuate.metrics.jdbc.DataSourcePoolMetric
Estimator
估计统计。用于计算某一类统计数值的计算器。
ConditionalDensityEstimator
FixedFrameRateEstimator
NestableLoadProfileEstimator
Accumulator
累加器的意思。用来缓存累加的中间计算结果并提供读取通道。
AbstractAccumulator
StatsAccumulator
TopFrequencyAccumulator
Tracker
一般用于记录日志或者监控值通常用于apm中。
VelocityTracker
RocketTracker
MediaTracker
内存管理类命名
如果你的应用用到了自定义的内存管理那么下面这些名词是绕不开的。比如Netty就实现了自己的内存管理机制。
Allocator
与存储相关通常表示内存分配器或者管理器。如果你得程序需要申请有规律得大块内存allocator是你得不二选择。
AbstractByteBufAllocator
ArrayAllocator
RecyclingIntBlockAllocator
Chunk
表示一块内存。如果你想要对一类存储资源进行抽象并统一管理可以采用它。
EncryptedChunk
ChunkFactoryMultiChunk
Arena
英文是舞台、竞技场的意思。由于Linux把它用在内存管理上发扬光大它普遍用于各种存储资源的申请、释放与管理。为不同规格的存储chunk提供舞台好像也是非常形象的表示。
关键是这个词很美作为后缀让类名显得很漂亮。
BookingArena
StandaloneArena
PoolArena
Pool
表示池子。内存池线程池连接池池池可用。
ConnectionPool
ObjectPoolMemoryPool
过滤检测类命名
程序收到的事件和信息是非常多的有些是合法的有些需要过滤扔掉。根据不同的使用范围和功能性差别过滤操作也有多种形式。你会在框架类代码中发现大量这样的名词。
PipelineChain
一般用在责任链模式中。NettySpring MVCTomcat等都有大量应用。通过将某个处理过程加入到责任链的某个位置中就可以接收前面处理过程的结果强制添加或者改变某些功能。就像Linux的管道操作一样最终构造出想要的结果。
PipelineChildPipeline
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
将相似的组件进行组合并以相同的接口或者功能进行暴露使用者不知道这到底是一个组合体还是其他个体。
CompositeDataComposite
MapScrolledComposite
Wrapper
用来包装某个对象做一些额外的处理以便增加或者去掉某些功能。
IsoBufferWrapper
ResponseWrapper
Option, Param,Attribute
用来表示配置信息。说实话它和Properties的区别并不大但由于Option通常是一个类所以功能可以扩展的更强大一些。它通常比Config的级别更小关注的也是单个属性的值。Param一般是作为参数存在对象生成的速度要快一些。
SpecificationOption
SelectOption
AlarmParam
ModelParam
Tuple
元组的概念。由于Java中缺乏元组结构我们通常会自定义这样的类。
Tuple2
Tuple3
Aggregator
聚合器可以做一些聚合计算。比如分库分表中的summaxmin等聚合函数的汇集。
BigDecimalMaxAggregator
PipelineAggregator
TotalAggregator
Iterator
迭代器。可以实现Java的迭代器接口也可以有自己的迭代方式。在数据集很大的时候需要进行深度遍历迭代器可以说是必备的。使用迭代器还可以在迭代过程中安全的删除某些元素。
BreakIteratorStringCharacterIterator
Batch
某些可以批量执行的请求或者对象。
SavedObjectBatch
BatchRequest
Limiter
限流器使用漏桶算法或者令牌桶来完成平滑的限流。
DefaultTimepointLimiter
RateLimiter
TimeBasedLimiter
常见设计模式命名
设计模式是名词的重灾区这里只列出最常使用的几个。
Strategy
将抽象部分与它的实现部分分离使它们都可以独立地变化。策略模式。相同接口不同实现类同一方法结果不同实现策略不同。比如一个配置文件是放在xml里还是放在json文件里都可以使用不同的provider去命名。
RemoteAddressStrategy
RegistrationAppStrategy
Adapter
将一个类的接口转换为客户希望的另一个接口Adapter模式使得原本由于接口不兼容而不能一起工作的那些类一起工作。
不过相对于传统的适配器进行api转接如果你的某个Handler里面方法特别的多可以使用Adapter实现一些默认的方法进行0适配。那么其他类使用的时候只需要继承Adapter然后重写他想要重写的方法就可以了。这也是Adapter的常见用法。
ExtendedPropertiesAdapter
ArrayObjectAdapter
CardGridCursorAdapter
ActionCommand
将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化对请求排队或记录请求日志以及支持可撤销的操作。
用来表示一系列动作指令用来实现命令模式封装一系列动作或者功能。Action一般用在UI操作上后端框架可以无差别的使用。
在DDD的概念中CQRS的Command的C既为Command。
DeleteAction
BoardCommand
Event
表示一系列事件。一般的在语义上ActionCommand等来自于主动触发Event来自于被动触发。
ObservesProtectedEvent
KeyEvent
Delegate
代理或者委托模式。委托模式是将一件属于委托者做的事情交给另外一个被委托者来处理。
LayoutlibDelegateFragmentDelegate
Builder
将一个复杂对象的构建与它的表示分离使得同样的构建过程可以创建不同的表示。
构建者模式的标准命名。比如StringBuilder。当然StringBuffer是个另类。这也说明了规则是人定的人也可以破坏。
JsonBuilder
RequestBuilder
Template
模板方法类的命名。定义一个操作中的算法的骨架而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
JDBCTemplate
Proxy
代理模式。为其他对象提供一种代理以控制对这个对象的访问。
ProxyFactory
SlowQueryProxy
解析类命名
写代码要涉及到大量的字符串解析、日期解析、对象转换等。根据语义和使用场合的区别它们也分为多种。
ConverterResolver
转换和解析。一般用于不同对象之间的格式转换把一类对象转换成另一类。注意它们语义上的区别一般特别复杂的转换或者有加载过程的需求可以使用Resolver。
DataSetToListConverter
LayoutCommandLineConverter
InitRefResolver
MustacheViewResolver
Parser
用来表示非常复杂的解析器比如解析DSL。
SQLParserJSONParser
Customizer
用来表示对某个对象进行特别的配置。由于这些配置过程特别的复杂值得单独提取出来进行自定义设置。
ContextCustomizer
DeviceFieldCustomizer
Formatter
格式化类。主要用于字符串、数字或者日期的格式化处理工作。
DateFormatter
StringFormatter
网络类命名
网络编程的同学永远绕不过去的几个名词。
Packet
通常用于网络编程中的数据包。
DhcpPacket
PacketBuffer
Protocol
同样用户网络编程中用来表示某个协议。
RedisProtocol
HttpProtocol
Encoder、Decoder、Codec
编码解码器
RedisEncoderRedisDecoderRedisCodec
RequestResponse
一般用于网络请求的进和出。如果你用在非网络请求的方法上会显得很怪异。
其他
UtilHelper
都表示工具类Util一般是无状态的Helper以便需要创建实例才能使用。但是一般没有使用Tool作为后缀的。
HttpUtil
TestKeyFieldHelper
CreationHelper
ModeType
看到mode这个后缀就能猜到这个类大概率是枚举。它通常把常见的可能性都列到枚举类里面其他地方就可以引用这个Mode。
OperationMode
BridgeMode
ActionType
InvokerInvocation
invoker是一类接口通常会以反射或者触发的方式执行一些具体的业务逻辑。通过抽象出invoke方法可以在invoke执行之前对入参进行记录或者处理在invoke执行之后对结果和异常进行处理是AOP中常见的操作方式。
MethodInvoker
ConstructorInvocation
Initializer
如果你的应用程序需要经过大量的初始化操作才能启动那就需要把它独立出来专门处理初始化动作。
MultiBackgroundInitialize
ApplicationContextInitializer
FeturePromise
它们都是用在多线程之间的进行数据传递。
Feture相当于一个占位符代表一个操作将来的结果。一般通过get可以直接阻塞得到结果或者让它异步执行然后通过callback回调结果。
但如果回调中嵌入了回调呢如果层次很深就是回调地狱。Java中的CompletableFuture其实就是Promise用来解决回调地狱问题。Promise是为了让代码变得优美而存在的。
Selector
根据一系列条件获得相应的同类资源。它比较像Factory但只处理单项资源。
X509CertSelectorNodeSelector
Reporter
用来汇报某些执行结果。
ExtentHtmlReporter
MetricReporter
Constants
一般用于常量列表。
Accessor
封装了一系列get和set方法的类。像lombok就有Accessors注解生成这些方法。但Accessor类一般是要通过计算来完成get和set而不是直接操作变量。这适合比较复杂的对象存取服务。
ComponentAccessor
StompHeaderAccessor
Generator
生成器一般用于生成代码生成id等。
CodeGeneratorCipherKeyGenerator
总结
当你以上列举的命名规范熟记于心后你在尝试去看开源项目如SpringMybatisNetty你都会有一种莫名的熟悉和亲戚因为上面命名规则会高频率出现在各大框架中这样你阅读起来就容易多了见名知意是对代码尊重和负责。我们作为开发工程师应该遵循合理的命名规范才能体现自己的工匠精神。