
既然之前写了代码质量的评估标准,今天就再介绍一下,如何用烂代码保住你的饭碗。
下面这些问题不只是『写得丑』,而是直接导致团队效率崩盘、项目质量雪崩,让老板增派人手的好办法的。
public interface UserPersistenceStrategy {
void saveUser(User user);
}
public class DefaultUserPersistenceStrategy implements UserPersistenceStrategy {
public void saveUser(User user) {
// 保存逻辑
}
}
public class UserManager {
private UserPersistenceStrategy strategy;
public UserManager(UserPersistenceStrategy strategy) {
this.strategy = strategy;
}
public void save(User user) {
strategy.saveUser(user);
}
}这么复杂只为了简单保存一个用户?需求根本没有多变,而纯粹浪费维护成本。
YAGNI( You Aren't Gonna Need It)原则
只为当前真实的需求设计,不预支未来的复杂性。
Utils、Helper 类,把真正重要的业务逻辑藏在一堆静态方法里。public class UserUtils {
public static boolean isVip(User user) {
return user.getPoints() > 1000;
}
}
public class OrderService {
public void createOrder(User user) {
if (UserUtils.isVip(user)) {
// 走VIP流程
}
}
}业务逻辑(如是不是 VIP)藏在工具类,或者 Service 很难读懂。
业务逻辑应该放在领域模型或服务层,而不是扔到工具类。
Manager 继承 BaseManager,BaseManager 又继承 AbstractBaseManager。public class AbstractUserManager {
protected void connect() { /* 连接DB */ }
}
public class BaseUserManager extends AbstractUserManager {
protected void authenticate() { /* 鉴权 */ }
}
public class PremiumUserManager extends BaseUserManager {
public void premiumFeatures() {
connect();
authenticate();
// 高级功能
}
}PremiumUserManager 明明只是想扩展功能,却被迫继承一堆底层细节。优先使用组合(Composition),而不是继承(Inheritance)。
"has-a" 通常比 "is-a" 更灵活。
public class UserDTO {
private String name;
private int age;
}
public class UserEntity {
private String name;
private int age;
}
// 然后各种Mapper工具来回copy...按上下游系统的边界来设计对象,只有真正跨层或跨系统需要隔离时才引入 DTO、VO。
public interface UserService {
void createUser();
}
public class UserServiceImpl implements UserService {
public void createUser() { /* 逻辑 */ }
}没必要的抽象让代码量虚高,理解成本上升。
接口是为了变化而生。如果没有多实现需求,直接用具体类,后续有需要时再提取接口。
API 规范,没有版本管理。@PostMapping("/user")
public Map<String, Object> createUser(@RequestBody Map<String, Object> body) {
// 用 `Map` 接参数,返回也是 `Map`
}用严格定义的 Request/Response 对象,配合 Swagger/OpenAPI,接口必须有明确契约。
在大型项目里,不是写不写得动代码的问题,而是
烂代码 ≠ 只影响自己 烂代码是拖垮整个项目、整个团队的毒瘤。