代码命名:见名知意的艺术
读别人的烂代码,最痛苦的是什么?
java
int d;
String n;
boolean f;三秒后你就会问自己:d 是什么?n 是 name 还是 number?f 是 flag 还是 female?
命名烂,代码就没法维护。这不是小事。
四大命名法一览
| 命名法 | 规则 | 示例 | 用途 |
|---|---|---|---|
| PascalCase | 单词首字母大写 | UserService | 类名、接口名 |
| camelCase | 首个单词小写,后续首字母大写 | userName | 变量名、方法名 |
| SCREAMING_SNAKE | 全大写 + 下划线分隔 | MAX_SIZE | 常量 |
| kebab-case | 全小写 + 连字符 | user-name | 不用于 Java |
类名和接口名
类名用 PascalCase,名词或名词短语:
java
// ✅ 好的类名
public class UserService { }
public class OrderController { }
public class PaymentGateway { }
public interface Repository { }
public interface CacheManager { }
// ❌ 糟糕的类名
public class userService { } // 大小写不对
public class User { } // 太泛,不知道干什么
public class DoSomething { } // 动词开头,不符合惯例接口名不用加 I 前缀,那是 C# 的风格:
java
// ✅ 推荐:直接命名
public interface UserService { }
public interface Repository { }
// ❌ 老派:I前缀
public interface IUserService { }方法名
方法名用 camelCase,动词或动词短语,体现动作:
java
public class UserService {
// ✅ 好的方法名:动词 + 名词,意图清晰
public User findById(Long id) { }
public List<User> findAllUsers() { }
public void saveUser(User user) { }
public boolean validatePassword(String password) { }
public boolean isActive() { }
// ❌ 糟糕的方法名
public User find(Long id) { } // find 什么?
public List getUsers() { } // get 什么?全部?
public void doSave(User user) { } // doSave 和 save 有什么区别?
}常见动词前缀:
| 前缀 | 含义 | 示例 |
|---|---|---|
get | 获取 | getUserById() |
find | 查找 | findByName() |
create | 创建 | createOrder() |
save | 保存 | saveUser() |
update | 更新 | updatePassword() |
delete | 删除 | deleteById() |
is / has / can | 判断 | isActive()、hasPermission() |
validate | 校验 | validateInput() |
变量名
变量名用 camelCase,名词或形容词:
java
public class User {
// ✅ 见名知意
private String userName;
private int userAge;
private boolean isActive;
private List<Order> orders;
private LocalDateTime createdAt;
// ❌ 单字母或模糊命名
private String n; // name?
private int a; // age?
private boolean f; // female?flag?failed?
}布尔变量用 is/has/can/should 前缀,让判断意图清晰:
java
// ✅ 布尔变量:前缀表明是判断
private boolean isActive;
private boolean hasPermission;
private boolean canEdit;
private boolean shouldUpdate;
// ❌ 不清晰
private boolean active; // 是形容词还是判断?
private boolean flag; // flag 是什么的 flag?常量名
常量用 SCREAMING_SNAKE:
java
// ✅ 推荐
public static final int MAX_RETRY_COUNT = 3;
public static final String DEFAULT_CHARSET = "UTF-8";
public static final int PAGE_SIZE_MAX = 100;
public static final BigDecimal ZERO = BigDecimal.ZERO;
// ❌ 错误
public static final int maxRetryCount = 3; // 没大写
public static final int default_page_size = 20; // 格式混乱集合命名
集合变量名要体现类型,同时避免冗余:
java
// ✅ 推荐:类型 + 语义
List<User> users; // 用户列表
Set<Order> orderSet; // 用 Set 明确去重
Map<String, User> userMap; // 用 Map 明确是键值对
Queue<Task> taskQueue; // 用 Queue 明确队列
Map<Long, List<Order>> userOrdersMap; // 键值明确
// ❌ 冗余:类型重复
List<User> userList; // List 已经说明了是列表
Map<String, User> userHashMap; // HashMap 已经说明了实现包名
包名全小写,点分隔,顶级域名反写:
java
package com.example.project; // ✅
package cn.com.company.module; // ✅
package io.github.username.project; // ✅
package com_example_project; // ❌ 下划线不标准
package comExampleProject; // ❌ 不是驼峰常见场景的命名约定
DAO / Repository 层
java
public interface UserDao {
User selectById(Long id);
List<User> selectAll();
int insert(User user);
int update(User user);
int deleteById(Long id);
}Service 层
java
public interface UserService {
User getUserById(Long id);
List<User> getAllUsers();
void register(User user);
void updateUser(User user);
void deleteUser(Long id);
boolean login(String username, String password);
}Controller 层
java
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) { }
@PostMapping
public void createUser(@RequestBody User user) { }
@PutMapping("/{id}")
public void updateUser(@PathVariable Long id, @RequestBody User user) { }
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) { }
}缩写规则
可以用的缩写
| 全拼 | 缩写 | 说明 |
|---|---|---|
| authentication | auth | 认证 |
| authorization | authz | 授权 |
| password | pwd | 密码(仅内部用) |
| username | user / username | 用户名 |
| number | num | 编号 |
| message | msg | 消息 |
| configuration | config | 配置 |
| library | lib | 库 |
不要用的缩写
java
// ❌ 这些缩写三年后看代码鬼认识
int dbCnt; // database count?
String usrNm; // user name?
boolean isVld; // is valid?中英对照速查
| 中文 | 英文 | 方法示例 |
|---|---|---|
| 用户 | User | getUserById() |
| 订单 | Order | createOrder() |
| 商品 | Product | getProductDetail() |
| 添加 | Add/Create | addUser() / createUser() |
| 删除 | Delete/Remove | deleteById() / removeUser() |
| 修改 | Update/Modify | updateUser() |
| 查询 | Get/Find/Select | getUserById() / findByName() |
| 登录 | Login | login() |
| 登出 | Logout | logout() |
| 校验 | Validate | validateInput() |
总结口诀
类名接口名 → PascalCase,名词短语
变量方法名 → camelCase,动名词组合
常量全大写 → SCREAMING_SNAKE
包名小写点分隔
见到单字母变量就皱眉好的命名,是代码最重要的文档。
