Skip to content

代码命名:见名知意的艺术

读别人的烂代码,最痛苦的是什么?

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) { }
}

缩写规则

可以用的缩写

全拼缩写说明
authenticationauth认证
authorizationauthz授权
passwordpwd密码(仅内部用)
usernameuser / username用户名
numbernum编号
messagemsg消息
configurationconfig配置
librarylib

不要用的缩写

java
// ❌ 这些缩写三年后看代码鬼认识
int dbCnt;        // database count?
String usrNm;     // user name?
boolean isVld;    // is valid?

中英对照速查

中文英文方法示例
用户UsergetUserById()
订单OrdercreateOrder()
商品ProductgetProductDetail()
添加Add/CreateaddUser() / createUser()
删除Delete/RemovedeleteById() / removeUser()
修改Update/ModifyupdateUser()
查询Get/Find/SelectgetUserById() / findByName()
登录Loginlogin()
登出Logoutlogout()
校验ValidatevalidateInput()

总结口诀

类名接口名 → PascalCase,名词短语
变量方法名 → camelCase,动名词组合
常量全大写 → SCREAMING_SNAKE
包名小写点分隔
见到单字母变量就皱眉

好的命名,是代码最重要的文档。

基于 VitePress 构建