[代码规范]1_良好的命名规范能减轻工作负担
欢迎来到啾啾的博客🐱,一个致力于构建完善的Java程序员知识体系的博客📚,记录学习的点滴,分享工作的思考、实用的技巧,偶尔分享一些杂谈💬。
欢迎评论交流,感谢您的阅读😄。
目录
引言
命名——提炼含义减少注释
类名命名
接口与实现类的命名
方法命名的最佳实践
1. 方法名的结构
2. 参数与返回值的隐含
3. 避免缩写
4. 逻辑与副作用的体现
5. 条件判断方法
长命名处理——实战答疑
处理方法
1. 利用上下文环境简化名称
2. 使用领域术语或缩写
3. 拆分复杂逻辑为小模块
4. 使用组合命名结构
5. 保留核心信息,舍弃冗余修饰词
注意事项
总结原则
引言
从在大学机房里敲下Hello World那刻起,我踏入了编程的世界。
工作以来,不同的项目、不同的团队都带来有不同的编程规范,关于规范的注意事项是在太多太多,最后留在脑海里的只余下“可读性、可拓展性、设计原则”,让具体阐释一时间也说不出个所以然来。
哦,脑海里还余下了阅读、改动那些没遵守规范的代码时头疼的感觉。
为了消除这“头疼的感觉”,今天便系统整理一下代码规范,什么样的规范才是好的规范呢?
良好的命名规范能减轻工作负担。 —— 啾啾
先从命名开始。
命名——提炼含义减少注释
好的命名再怎么强调也不为过。
我们可能见过一些程序员,他们会为代码写上一大堆注释来说明这个方法做了什么。
可是事实上,“注释往往是最短命的代码”,注释本身有着不确定的一致性。
正确的做法是,提炼含义,使用描述明确的代码类、函数方法命名,好的代码注释应该解释“为什么”,而非“是什么”。(代码本身应该尽量自解释)
下面以一些Java基础类为例。
类名命名
先看一些Java源码示例。
| 类名 | 含义解析 |
|---|---|
ArrayList | 基于数组(Array)的List实现 |
LinkedList | 基于链表(Linked)的List实现 |
TreeSet | 基于红黑树(Tree结构)的Set实现 |
SimpleDateFormat | 简单的日期格式化工具(Simple修饰核心功能DateFormat) |
FileInputStream | 基于文件(File)的输入流(InputStream)实现 |
类的命名上,要含义明确得体现实现方式或功能,避免模糊命名。
还有一种情况,即项目结构是Service、DAO、BO、VO这些,命名需要使用后缀体现层级关系。
| 类名 | 含义解析 |
|---|---|
UserServiceImpl | 实现UserService接口的业务逻辑类 |
OrderDAO | 数据访问层(DAO)的订单操作类 |
ProductBO | 业务对象(Business Object),封装业务逻辑 |
CartVO | 视图对象(View Object),用于前端展示的数据模型 |
接口与实现类的命名
| 接口/抽象类 | 实现类 | 含义解析 |
|---|---|---|
List | ArrayList, LinkedList | 实现类通过后缀明确具体实现方式 |
Map | HashMap, TreeMap, LinkedHashMap | 实现类通过后缀明确具体实现方式 |
Collection | ArrayList, HashSet, PriorityQueue | 通过具体实现类名体现数据结构 |
方法命名的最佳实践
方法命名的核心原则是意图明确、参数隐含、无歧义。以下是具体示例和规则:
1. 方法名的结构
- 动词 + 对象/动作:方法名以动词开头,描述操作内容。
- ✅
addElement()(添加元素) - ✅
calculateTotalPrice()(计算总价) - ✅
saveToFile()(保存到文件) - ❌
process()(模糊,应具体化为processPayment()或processRequest())
- ✅
2. 参数与返回值的隐含
- 通过方法名暗示参数和返回值的类型:
- ✅
findUserById(String id)(隐含返回User对象) - ✅
getMaxValue(int[] numbers)(隐含返回最大值) - ❌
getSomething()(不明确返回值类型或用途)
- ✅
3. 避免缩写
- ❌ 缩写:
calc()(不明确) - ✅ 完整命名:
calculate()(清晰)
4. 逻辑与副作用的体现
- 副作用:若方法有副作用(如修改状态),应在名称中体现:
- ✅
updateCache()(明确修改缓存) - ✅
resetSettings()(明确重置设置) - ❌
doAction()(不明确副作用)
- ✅
5. 条件判断方法
- 布尔方法以
is、has、can开头:- ✅
isConnected()(判断是否连接) - ✅
hasPermission()(判断是否有权限) - ✅
canExecute()(判断是否可执行)
- ✅
长命名处理——实战答疑
在命名时,偶尔会有业务复杂命名难以提炼的情况。
处理方法
可以通过以下策略在保持清晰性和可维护性的同时缩短名称:
1. 利用上下文环境简化名称
-
类/模块上下文:在类或模块名中已体现的业务范围,方法名/变量名可省略重复信息。
- 示例:
// 类名已包含 "Transaction",方法名无需重复
public class TransactionProcessor {private void validateTransaction() { ... } // 可简化为 validate()private void calculateTotal() { ... } // 上下文已明确是交易总金额
}
-
参数/返回值隐含:通过参数名或返回值类型暗示功能,减少名称冗余。
- 示例:
// 参数已明确是 "User",方法名无需重复
public void sendVerificationEmailToUser(User user) { ... }
// 可简化为
public void sendVerificationEmail(User user) { ... }
2. 使用领域术语或缩写
-
领域术语:使用业务领域中的通用术语,减少冗余描述。
- 示例:
// 业务术语 "SubscriptionTier" 可直接使用
public double calculateDiscount(SubscriptionTier tier) { ... }
-
合理缩写:
- 通用缩写:如
Tx(Transaction)、Svc(Service)、Mgr(Manager)。 - 团队约定:确保团队对缩写达成一致(如
User代替UserAccount)。 - 示例:
- 通用缩写:如
// 原名称:calculateCustomerDiscountBasedOnSubscriptionTier
// 简化后:calculateDiscountByTier(假设Tier是业务术语)
public double calculateDiscountByTier(SubscriptionTier tier) { ... }
3. 拆分复杂逻辑为小模块
-
方法拆分:将长方法拆分为多个职责单一的小方法,每个方法命名清晰。
- 示例:
// 原长方法:processOrderWithPaymentAndDelivery()
// 拆分后:
public void processOrder(Order order) {validateOrder(order);applyPayment(order);scheduleDelivery(order);
}
-
类拆分:将复杂类拆分为多个子类或辅助类,通过组合提升可读性。
- 示例:
// 原类:OrderProcessorWithPaymentAndDelivery
// 拆分后:
public class OrderProcessor {private final PaymentProcessor paymentProcessor;private final DeliveryScheduler deliveryScheduler;// ...
}
4. 使用组合命名结构
-
Builder模式:通过链式调用或构建器减少参数名称的冗余。
- 示例:
// 原名称:createOrderWithCustomerAndItemsAndDiscount()
// 使用Builder模式:
Order order = new Order.Builder().setCustomer(customer).addItems(items).applyDiscount(discount).build();
-
前缀/后缀模式:通过通用前缀或后缀表达功能,减少重复描述。
- 示例:
// 原名称:convertUserToUserDTO()
// 简化为:toDTO()
public UserDTO toDTO(User user) { ... }
5. 保留核心信息,舍弃冗余修饰词
-
去除冗余动词:如
get、process、handle等,通过方法位置或参数推断功能。- 示例:
// 原名称:handleUserRegistrationRequest()
// 简化为:registerUser()
public void registerUser(User user) { ... }
-
聚焦核心业务:名称应体现“做什么”而非“如何做”。
- 示例:
// 原名称:calculateTotalPriceIncludingTaxAndDiscount()
// 简化为:calculateTotal()
// 通过注释或文档说明包含税和折扣
| 原始名称 | 优化后 | 策略 |
|---|---|---|
getCustomerInformationFromDatabaseUsingId | findCustomerById() | 参数隐含(id)、领域术语(Customer) |
validateUserRegistrationFormAndSaveToDatabase | registerUser() | 拆分方法,聚焦核心动作 |
TransactionProcessorForECommerceOrders | OrderTransactionProcessor | 上下文明确(ECommerce 是模块名) |
calculateMonthlySubscriptionCostBasedOnPlanTypeAndUserTier | computeSubscriptionCost() | 参数隐含(planType, userTier) |
注意事项
-
避免过度缩写:确保缩写在团队中统一且易懂(如
Svc代表 Service,但Svc对新人可能不直观)。 -
保持一致性:同一项目中命名风格需统一(如是否使用
CamelCase或Snake_Case)。 -
注释补充:对于非常规缩写或复杂逻辑,可通过注释或文档说明。
-
IDE辅助:利用 IDE 的自动补全功能(如 IntelliJ 的智能提示),减少长名称输入负
总结原则
-
优先上下文:在类/模块/参数中已包含的信息,方法名/变量名可省略。
-
领域术语优先:使用业务领域中的通用术语替代冗长描述。
-
拆分优先:复杂逻辑拆分为小模块,每个模块命名清晰。
-
可读性 > 简洁性:宁可稍长但明确,也不要过于晦涩的缩写。
相关文章:
[代码规范]1_良好的命名规范能减轻工作负担
欢迎来到啾啾的博客🐱,一个致力于构建完善的Java程序员知识体系的博客📚,记录学习的点滴,分享工作的思考、实用的技巧,偶尔分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄…...
【HarmonyOS Next之旅】DevEco Studio使用指南(三)
目录 1 -> 一体化工程迁移 1.1 -> 自动迁移 1.2 -> 手动迁移 1.2.1 -> API 10及以上历史工程迁移 1.2.2 -> API 9历史工程迁移 1 -> 一体化工程迁移 DevEco Studio从 NEXT Developer Beta1版本开始,提供开箱即用的开发体验,将SD…...
冯・诺依曼架构深度解析
一、历史溯源:计算机科学的革命性突破 1.1 前冯・诺依曼时代 在 1940 年代之前,计算机领域呈现 "百家争鸣" 的格局: 哈佛 Mark I(1944):采用分离的指令存储与数据存储ENIAC(1946&a…...
gralloc1_perform具体在干什么
gralloc1_perform 会在特定场景下通过 ioctl 调用,执行 缓存 (cache) 管理 和 内存映射 操作,确保 CPU 和 GPU 之间的数据一致性。 📌 为什么需要对 cache 进行操作? 在 Android 系统中,CPU 和 GPU 通常共享 DDR 内存…...
安装配置Anaconda,配置VSCode
文章目录 Anaconda介绍下载Anaconda安装Anaconda换源创建一个新环境conda常用命令 VSCode环境配置 记录一下笔者收集的一些资料,不喜勿喷。 Anaconda介绍 Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,提供了包管…...
【愚公系列】《高效使用DeepSeek》017-知识点思维导图生成
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...
【量化策略】网格交易策略
【量化策略】网格交易策略 🚀量化软件开通 🚀量化实战教程 技术背景与应用场景 网格交易策略是一种基于市场波动性的自动化交易方法,适用于震荡市场。它通过在预设的价格区间内设置多个买卖点,自动执行低买高卖的操作…...
C++ 语法之函数和函数指针
在上一章中 C 语法之 指针的一些应用说明-CSDN博客 我们了解了指针变量,int *p;取变量a的地址这些。 那么函数同样也有个地址,直接输出函数名就可以得到地址,如下: #include<iostream> using namespace std; void fun() …...
网络协议抓取与分析(SSL Pinning突破)
1. 网络协议逆向基础 1.1 网络协议分析流程 graph TD A[抓包环境配置] --> B[流量捕获] B --> C{协议类型} C -->|HTTP| D[明文解析] C -->|HTTPS| E[SSL Pinning突破] D --> F[参数逆向] E --> F F --> G[协议重放与模拟] 1.1.1 关键分析目标…...
蓝桥杯真题——洛谷Day13 找规律(修建灌木)、字符串(乘法表)、队列(球票)
目录 找规律 P8781 [蓝桥杯 2022 省 B] 修剪灌木 字符串 P8723 [蓝桥杯 2020 省 AB3] 乘法表 队列 P8641 [蓝桥杯 2016 国 C] 赢球票 找规律 P8781 [蓝桥杯 2022 省 B] 修剪灌木 思路:对某个特定的点来说有向前和向后的情况,即有向前再返回到该位置…...
【2025】基于Springboot + vue实现的毕业设计选题系统
项目描述 本系统包含管理员、学生、教师三个角色。 管理员角色: 用户管理:管理系统中所有用户的信息,包括添加、删除和修改用户。 配置管理:管理系统配置参数,如上传图片的路径等。 权限管理:分配和管理…...
JAVA并发编程 --- 补充内容
1 线程状态 1.1 状态介绍 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢?Java中的线程 状态被定义在了java.lang.Thread.State枚…...
ADB三个模块介绍
ADB(Android Debug Bridge)是 Android 开发中非常重要的工具,它由 3 个主要模块 组成,分别是 ADB Client(客户端)、ADB Server(服务端) 和 ADB Daemon(守护进程ÿ…...
【ArduPilot】Windows下使用Optitrack通过MAVProxy连接无人机实现定位与导航
Windows下使用Optitrack通过MAVProxy连接无人机实现定位与导航 配置动捕系统无人机贴动捕球配置无人机参数使用MAVProxy连接Optitrack1、连接无人机3、设置跟踪刚体ID4、校正坐标系5、配置IP地址(非Loopback模式)6、启动动捕数据推流 结语 在GPS信号弱或…...
qt 图像后处理的软件一
这是一个图像后处理软件刚刚,目前功能比较单一,后续会丰富常用的功能。 目前实现的功能有 1.导入图像 2图像可中心缩放(右上角放大缩小,按钮及滚轮双重可控)。 3.图像重置功能 软件界面如下。 代码放在我的资源里…...
Ardunio 连接OLED触摸屏(SSD1106驱动 4针 IIC通信)
一、准备工作 1、硬件 UNO R3 :1套 OLED触摸屏:1套 导线诺干 2、软件 arduino 二、接线 UNO R3OLED5VVCCGNDGNDA5SCLA4SDA 脚位如下图所示: Uno R3脚位图 触摸屏脚位图 查阅显示屏的驱动规格:通常显示屏驱动芯片有SSD1306,SH110…...
深度学习 第4章 数值计算和 Deepseek 的实践
第4章 数值计算和 Deepseek 的实践 章节概述 本章主要探讨了数值计算中的关键问题,这些问题在深度学习和机器学习中尤为重要。数值计算的核心挑战在于如何在有限的计算资源和精度限制下,高效且稳定地处理连续数学问题。本章首先讨论了溢出和下溢问题&a…...
【数据分享】2000—2024年我国省市县三级逐年归一化植被指数(NDVI)数据(年最大值/Shp/Excel格式)
之前我们分享过2000-2024年我国逐年的归一化植被指数(NDVI)栅格数据,该逐年数据是取的当年月归一化植被指数(NDVI)的年最大值。(可查看之前的文章获悉详情)!该数据来源于NASA定期发布…...
HW华为流程管理体系精髓提炼华为流程运营体系(124页PPT)(文末有下载方式)
资料解读:HW华为流程管理体系精髓提炼华为流程运营体系(124页PPT) 详细资料请看本解读文章的最后内容。 华为作为全球领先的科技公司,其流程管理体系的构建与运营是其成功的关键之一。本文将从华为流程管理体系的核心理念、构建…...
Linux中管理多版本Python总结
1. pyenv 管理多个 Python 版本 pyenv 是一个流行的工具,用于管理多个 Python 版本。它可以轻松安装、切换和管理不同版本的 Python。 1.1.安装 pyenv 1.1.1安装依赖 sudo apt-get update sudo apt-get install -y make build-essential libssl-dev zlib1g-dev…...
【系统架构设计师】操作系统 - 特殊操作系统 ③ ( 微内核操作系统 | 单体内核 操作系统 | 内核态 | 用户态 | 单体内核 与 微内核 对比 )
文章目录 一、微内核操作系统1、单体内核 操作系统2、微内核操作系统 引入3、微内核操作系统 概念4、微内核操作系统 案例 二、单体内核 与 微内核 对比1、功能对比2、单体内核 优缺点3、微内核 优缺点 一、微内核操作系统 1、单体内核 操作系统 单体内核 操作系统 工作状态 : …...
OpenBMC:BmcWeb添加路由4 设置method
设置method的方式与设置权限的方式类似: //http\routing\ruleparametertraits.hpp struct RuleParameterTraits {...self_t& methods(boost::beast::http::verb method){self_t* self = static_cast<self_t*>(this);std::optional<HttpVerb> verb = httpVerb…...
【RabbitMQ】RabbitMQ的基本架构是什么?包括哪些核心组件?
RabbitMQ基于AMQP协议实现,由多个核心组件组成,确保消息的可靠传递。 Rabbit的架构图: 1.RabbitMQ的基本架构: 1.核心组件: 1.Producer(生产者): 发送消息到RabbitMQ。 2.Exchange(交换机):接…...
(C语言)将整数转化为二进制(转化二进制教学)
#include <stdio.h> #include <stdlib.h>void intToBinary(int num, char *binary) {int index 0;for (int i 31; i > 0; i--) { // 假设 int 是 32 位int bit (num >> i) & 1; // 获取第 i 位binary[index] bit 0; // 将 bit 转换为字符 0 或…...
Octave3D 关卡设计插件
课程参考链接 这位大佬有在视频合集中有详细的讲解,个人体验过,感觉功能很强大 https://www.bilibili.com/video/BV1Kq4y1C72P/?share_sourcecopy_web&vd_source0a41d8122353e3e841ae0a39908c2181 Prefab资源管理 第一步 在场景中创建一个空物体…...
【视频】文本挖掘专题:Python、R用LSTM情感语义分析实例合集|上市银行年报、微博评论、红楼梦、汽车口碑数据采集词云可视化
原文链接:https://tecdat.cn/?p41149 分析师:Zhenzhen Liu,Shuai Fung 作为数据科学家,我们始终关注如何从非结构化数据中提取高价值信息。本专题合集聚焦企业年报的文本分析技术,通过Python与R语言实战案例ÿ…...
反编译内容
“反编译” 是指将可执行的程序(如二进制代码、字节码等)转换回人类可读的高级语言源代码或某种中间表示形式的过程。 在软件领域,比如对于用 Java 编写的程序,编译后是字节码文件(.class),反…...
机器学习扫盲系列(1) - 序
文章目录 序为什么要写这一系列?AI 概念科普原理性思维转行立flag 这一系列的计划神经网络训练框架 序 为什么要写这一系列? AI 概念科普 在各种AI概念铺天盖地向我们袭来的今天,我们作为其他方向的工作者,如果想转行做深度学习…...
英伟达“AI 超级碗”开幕
Nvidia的AI和机器人技术进展 2025年03月19日 | AI日报  欢迎各位人工智能爱好者。 Nvidia的CEO Jensen Huang刚刚拉开了他的“AI超级碗”,并发表了关于该公司最新芯片、…...
DeepSeek扫盲篇: V3 vs R1全面对比架构差异与蒸馏模型演进史
I. 引言:DeepSeek系列的技术革命 在全球大模型军备竞赛白热化的2023年,DeepSeek系列通过V3与R1两款里程碑产品,构建了中文大模型领域的"双塔奇观"。这两个看似矛盾的版本——前者以1280亿参数的MoE架构突破算力边界,后…...
