代码名命规范浅析

news2024/9/28 19:27:05

日常开发编码中,代码的名命是个大学问,能快速的看懂开源代码的结构和意图,也是一项必备的能力。在java项目的代码结构中,采用长名命的方式来规范类的名命,能够自己表达其主要意图,配合高级IDE,可以减少编码攻城狮的记忆负担,靠模糊匹配就能找到所需的资源。

借鉴最流行的java开源软件的源码,如netty、spring,guava等,以不同类的方式进行分析和归纳,希望能帮助搭建更好的理解名命的套路。
在这里插入图片描述

1、管理类名命

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

Bootstrap、Starter

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

AbstractBootstrap
ServerBootstrap
MacosXApplicationStarter

Processor

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

MappingProcessor

Manager

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

TransactionManager

Holder

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

ViewHolder

Factory

工厂模式的命名,尤其是在Spring中,多不胜数。

SessionFactory

Provider

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

AuthenticationProvider

Registrar

注册并管理一系列资源。

CryptoServicesRegistrar

Engine

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

StandardEngine

Service

某个服务,数不胜数。

PersistenceService

Task

某个任务,通常是个runnable。

ForkJoinTask

2、传播类名命

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

Context

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

ApplicationContext

Propagator

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

TransactionPropagator

3、回调类名命

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

Handler、Callback、Trigger、Listener

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

ChannelHandler
SuccessCallback
CronTrigger
EventListener

Aware

Aware是感知的意思,一般以该单词结尾的类,都实现了Aware接口。拿spring来说,Aware 的目的是为了让bean获取spring容器的服务。具体回调方法由子类实现,比如ApplicationContextAware。

ApplicationContextAware

4、监控类名命

Metric

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

HistogramMetric

Estimator

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

ConditionalDensityEstimator

Accumulator

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

AbstractAccumulator

Tracker

一般用于记录日志或者监控值。

PerformanceTracker

5、内存管理类名命

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

Allocator

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

ArrayAllocator

Pool

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

ConnectionPool

6、过滤监测类名命

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

Pipeline、Chain

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

Pipeline

Filter

过滤器,用来筛选某些满足条件的数据集,或者在满足某些条件的时候执行一部分逻辑。如果和责任链连接起来,则通常能够实现多级的过滤。

CorsFilter

Interceptor

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

HttpRequestInterceptor

Evaluator

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

ArithmeticExpressionEvaluator

Detector

探测器,用来管理一系列探测性事件,并在发生的时候能够进行捕获和响应。

XMLVersionDetector
FileTypeDetector

7、结构类名命

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

Cache

缓存。

EhCacheCache

Buffer

buffer是缓冲,不同于缓存,它一般用在数据写入阶段。

ByteBuffer

Wrapper

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

ResponseWrapper

Option、Param、Attribute

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

SelectOption

Aggregator

聚合器,可以做一些聚合计算。比如分库分表中的sum,max,min等聚合函数的汇集。

PipelineAggregator

Iterator

迭代器,可以实现java的迭代器接口,也可以有自己的迭代方式。

StringCharacterIterator

Batch

某些可以批量执行的请求或者对象。

BatchRequest

Limiter

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

RateLimiter

8、设计模式类名命

Strategy

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

BufferStrategy

Adapter

将一个类的接口转换为客户希望的另一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类一起工作。

AuthorizationServerConfigurerAdapter

Event

表示一系列事件。

KeyEvent

Delegate

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

MenuDelegate

Builder

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

JsonBuilder

Template

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

JDBCTemplate

Proxy

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

ProxyFactory 

9、解析类命名

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

Converter、Resolver

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

DataSetToListConverter
InitRefResolver

Parser

用来表示非常复杂的解析器。

JSONParser

Customizer

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

ContextCustomizer

Formatter

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

SimpleDateFormat

10、网络类命名

Packet

通常用于网络编程中的数据包。

DatagramPacket

Protocol

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

HttpProtocol

Encoder、Decoder、Codec

编码解码器

RedisEncoder
RedisDecoder
RedisCodec

Request、Response

一般用于网络请求的进和出。如果你用在非网络请求的方法上,会显得很怪异。

Util、Helper

都表示工具类,Util一般是无状态的,Helper以便需要创建实例才能使用。

HttpUtil
TestKeyFieldHelper

Invoker、Invocation

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

MethodInvoker
ConstructorInvocation

注:名命是编码中非常重要的一环,希望大家能够找到其中的规律,让你的代码功能强大且优雅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/366515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

万字长文带你实战 Elasticsearch 搜索

ES 高级实战 前言 上篇我们讲到了 Elasticsearch 全文检索的原理《别只会搜日志了,求你懂点原理吧》,通过在本地搭建一套 ES 服务,以多个案例来分析了 ES 的原理以及基础使用。这次我们来讲下 Spring Boot 中如何整合 ES,以及如何在 Spring Cloud 微服务项目中使用 ES 来…

考研复试机试 | C++ | 王道机试课程笔记

目录Zero-complexity (上交复试题)题目&#xff1a;代码&#xff1a;括号匹配问题题目&#xff1a;代码&#xff1a;表达式解析问题 &#xff08;浙大机试题&#xff09;题目&#xff1a;代码&#xff1a;标准库里提供了栈 stack<typename> myStack .size() 栈的大小 .pu…

互斥信号+任务临界创建+任务锁

普通信号量 1、信号量概念 2、创建信号量函数 3、互斥信号量 创建互斥信号量函数 等待信号量函数 释放互斥信号量 4、创建任务临界区 5、任务锁 任务上锁函数 ​编辑 任务结束函数 效果 普通信号量 1、信号量概念 信号量像是一种上锁机制&#xff0c;代码必须获…

Java性能-回收算法-Throughout回收算法

垃圾回收算法 理解Throughput回收器 回收器三个基本操作——回收 找到不使用的对象 释放内存 压缩堆碎片 Minor GC和Full GC&#xff0c;每个操作都会标记&#xff0c;释放和压缩对应的目标分代 [63.205s][info][gc,start ] GC(13) Pause Full (Ergonomics) [63.205s][info][…

Odoo丨Odoo框架源码研读三:异常处理与定制化开发

Odoo丨Odoo框架源码研读三&#xff1a;异常处理与定制化开发 Odoo源码研读的第三期内容&#xff1a;异常处理与定制化开发。 *异常处理* Odoo中的Exception是对Python内置异常做了继承和封装&#xff0c;设定了自己核心的几个Exception。 而对异常的处理和Python内置异常的…

【趋势分析方法三】MATLAB代码实现TFPW-MK检验

目前水文时间序列趋势分析的方法很多&#xff0c;主要分为参数检验和非参数检验两大类&#xff1a; 参数检验中常用的有线性回归法、滑动平均法、累积距平法等非参数检验则主要包括Mann-Kendal&#xff08;MK&#xff09;法和 Spearman 秩次相关法等 虽然从理论上讲&#xff…

2023年,什么行业更有发展前景?

关于有前景有发展的行业推荐&#xff0c;小课今天还是推荐咱们IT互联网行业。 很多人会说现在懂电脑的那么多,这个行业都饱和了,很多学电脑的找不到工作都改行了。但事实是现在每个行各业都需要互联网&#xff0c;需要懂电脑的技术人才&#xff0c;尤其是在云计算、大数据到来…

了解一下TCP/IP协议族

在《简单说说OSI网络七层模型》中讲到&#xff0c;目前实际使用的网络模型是 TCP/IP 模型&#xff0c;它对 OSI 模型进行了简化&#xff0c;只包含了四层&#xff0c;从上到下分别是应用层、传输层、网络层和链路层&#xff08;网络接口层&#xff09;&#xff0c;每一层都包含…

《安富莱嵌入式周报》第304期:开源硬件耳机设计,AI单片机STM32N6已确定为M55内核,另外还有新品STM32H5, H50X, H7R, H7S发布

往期周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程&#xff1a; 第6期ThreadX视频教程&#xff1a;图文并茂吃透RTOS运行机制&#xff0c;任务管理&…

微信小程序的全局弹窗以及全局实例

全局组件 微信小程序组件关系中&#xff0c;父组件使用子组件需要在父组件index.json中引入子组件&#xff0c;然后在父组件页面中使用&#xff0c;这种组件的对应状态是一对一的&#xff0c;一个组件对应一个页面。如果有一个全局弹窗&#xff08;登录&#xff09;&#xff0…

拒绝select *,Navicat快捷查询表中所有字段以,隔开两种方式【附带阿里开发手册】

一、前言 今天公司规定了不要使用SELECT *进行查询&#xff0c;让我想到阿里的《Java 开发手册》 中的ORM 映射规范也是这样的&#xff0c;于是翻出来看看&#xff0c;刚刚好重温一下&#xff01; 规范看了一定要实践&#xff0c;严格规范自己的代码风格&#xff0c;做一个优…

TEMU联盟计划用意何在?做推广达人真的能收入满满吗?

据东哥近期了解&#xff0c;Temu在北美市场表现十分火爆&#xff0c;甚至冲上了AppStore下载榜第一名。Temu在美国市场上采用了类似PDD的病毒式传播策略&#xff0c;以实惠的产品和折扣吸引消费者并动员普通人大量传播链接和App下载&#xff0c;所以有了TEMU联盟计划&#xff0…

Sprng依赖注入(三):构造方法注入是如何工作的?

前言这是Spring依赖注入系列的第三篇&#xff0c;前两篇主要分析了Spring bean依赖属性注入的两种方式&#xff0c;是字段注入和setter方法注入&#xff0c;单独比较这两种方式&#xff0c;会发现其过程和工作原理非常类似&#xff0c;那么构造方法注入会不会也和前两种比较类似…

搭建个人博客保姆级教程(二)

文章目录一. Springboot项目打包成jar包二. mySql部署三. UI 项目部署一. Springboot项目打包成jar包 使用IDEA进行打包&#xff0c;当然也有其他部署方式&#xff0c;如使用maven进行打包&#xff0c;可自行查询资料。 1.打开项目&#xff0c;右击项目选中Open Module Settin…

【C++的OpenCV】第五课-OpenCV图像常用操作(二):OpenCV的基本绘图、平滑滤波(模糊)处理

让我们继续一、OpenCV基本绘图1.1 OpenCV关于绘图的操作1.1.1 cv::Point()1.1.2 cv::Scalar()1.1.3 cv::line()画线1.1.4 cv::rectangle()画矩形1.1.5 cv::circle()画圆二、图像的平滑滤波处理2.1 概念2.2 OpenCV关于图像模糊的操作2.2.1 常用滤波器的分类2.2.2 各种滤波方法具…

【4】linux命令每日分享——cd切换路径

大家好&#xff0c;这里是sdust-vrlab&#xff0c;Linux是一种免费使用和自由传播的 类UNIX操作系统&#xff0c;Linux的基本思想有两点&#xff1a;一切都是文件&#xff1b;每个文件都有确定的用途&#xff1b;linux涉及到IT行业的方方面面&#xff0c;在我们日常的学习中&am…

云计算学习课程——越来越重要的云安全

2023&#xff0c;越来越多的企业和组织正在或即将把核心系统和数据迁移上云端&#xff0c;其中以公有云和服务居多&#xff0c;那么就意味着在数据迁移的过程中会出现安全问题的几率更大。企业也越来越注重云安全体系&#xff0c;对我们云计算运维工程师来说&#xff0c;也是一…

Linux 日志讲解

目录 日志系统的分类 常见日志文件 日志等级 journalctl查看指定日志信息 日志系统的分类 系统日志 记录系统的运行情况和内核信息 用户日志 记录用户的访问信息 程序日志 记录程序运行的各种时间&#xff08;每个服务程序都有自己独立的日志文件&#x…

UE4 手把手教你做插件(4)做一个可以拖入场景的小方块插件

0&#xff0c;前言 学习一下如何编写一个有actor的插件&#xff0c;能够将它拖入场景里面。 1&#xff0c;创建插件 &#xff08;1&#xff09;创建一个空白插件 添加之后vs里面就会多出一个目录&#xff1a; &#xff08;2&#xff09;给插件添加一个actor 创建完actor之后&am…

渗透测试之交换式网络嗅探实验

渗透测试之交换式网络嗅探实验实验目的一、实验原理1.1 网络嗅探器Sniffer的工作原理1.2 网络嗅探器的分类1.3 网络嗅探器Sniffer的作用二、实验环境2.1 操作机器2.2 实验工具Sniffer2.3 安装工具Sniffer三、实验步骤1. 熟悉Sniffer工具的启动2. 进行监听3. 熟悉Sniffer工具的介…