1. 重复的switch坏味道深度解析
在面向对象编程中,重复的switch语句是一种典型的代码坏味道。这种坏味道表现为相同的switch-case结构在代码库的多个位置重复出现,通常用于根据某个类型或状态执行不同的行为。就像餐厅里同一份菜单被复印了多份放在不同位置,当菜品价格变动时,服务员必须找到所有菜单副本进行修改,否则就会出现价格不一致的情况。
1.1 典型症状与识别方法
识别重复的switch坏味道可以从以下几个维度入手:
- 结构重复性:相同的枚举类型或状态值在多个switch语句中被重复判断
- 行为相关性:每个case分支处理的是与类型/状态相关的业务行为
- 修改同步性:添加新类型时需要修改多个switch语句
- 代码位置:相同的switch逻辑出现在不同的类或方法中
以下是一个更复杂的真实案例,展示了多个层面对同一用户类型进行判断的情况:
cpp复制// 订单服务中的折扣计算
double OrderService::calculateDiscount(UserType type) {
switch(type) {
case REGULAR: return 0.0;
case VIP: return 0.1;
case PREMIUM: return 0.2;
default: throw InvalidUserType();
}
}
// 购物车服务中的最大商品数限制
int CartService::getMaxItems(UserType type) {
switch(type) {
case REGULAR: return 10;
case VIP: return 50;
case PREMIUM: return 100;
default: throw InvalidUserType();
}
}
// 消息服务中的欢迎语
string MessageService::getWelcomeMessage(UserType type) {
switch(type) {
case REGULAR:
