你最先学会的指令最好是最少用到的
要解决的问题TL;DR:移除所有意外的 IF 条件
- 代码重复问题
- 可能的拼写错误及其他缺陷
相关代码异味:
代码异味 07:布尔变量的使用 使用布尔变量作为标志会暴露意外的实现细节,并在代码中引入了大量的if语句。 代码异味 36 — 别再用 switch/case 了编程初学者课程:控制结构。资深开发者建议:避免使用这些结构。
代码异味 133 — 固定的 IF 条件硬编码是可以的,但只是一段时间内的事情levelup.gitconnected.com 隐含的 else 分支 — 代码异味 156我们第一天学编程时就接触了 if/else,但后来常常忽略了 else 分支。不过,今天我们要来谈谈编程中容易忽视的隐含 else 分支。levelup.gitconnected.com 代码异味 119 — Stairs Code:嵌套的布尔条件表示了一个业务规则。Medium 的文章 代码异味 145 — 短路技巧的滥用:不要用布尔求值作为可读性的捷径levelup.gitconnected.com(一个技术博客网址) 代码异味入门 — 与布尔值进行比较在与布尔值进行比较时,我们会执行隐式的类型转换并得到意外的结果这篇文章 代码异味 #45 — 非多态的方法如果它们做同样的事情,就应该可以互换 步骤:接下来的步骤
- 寻找或创建多态层次
- 将每个if语句的主体移动到相应的抽象中
- 为抽象命名
- 为方法命名
- 用多态消息发送替换if语句
public String handleMicrophoneState(String state) {
if (state.equals("off")) {
return "麦克风已关闭";
} else {
return "麦克风已开启";
}
}
/* 表示 'off' 状态的常量在整个代码中重复出现,增加了拼写错误的可能性。
'else' 条件并没有显式检查 'on' 状态,而是隐式地处理任何其他状态;
这种处理方式会导致在任何需要处理状态的地方重复使用 IF 条件,
暴露了内部表示并违反了封装原则。
该算法不便于扩展且封闭修改,这意味着添加新的状态将需要在代码的多个地方进行修改。 */
瑞典语中的“After”可以翻译为“之后”。
// 步骤 1:找到或创建多态层次结构
abstract class MicrophoneState { }
final class On extends MicrophoneState { }
final class Off extends MicrophoneState { }
// 步骤 2:将每个 if 语句的主体移到相应的抽象类中
abstract class MicrophoneState {
public abstract String 来自if的多态方法();
}
final class On extends MicrophoneState {
@Override
public String 来自if的多态方法() {
return "麦克风开启";
}
}
final class Off extends MicrophoneState {
@Override
public String 来自if的多态方法() {
return "麦克风关闭";
}
}
// 步骤 3:命名抽象类
abstract class MicrophoneState {}
final class 开启的麦克风状态 extends MicrophoneState {}
final class 关闭的麦克风状态 extends MicrophoneState {}
// 步骤 4:命名方法
abstract class MicrophoneState {
public abstract String handle();
}
final class 开启的麦克风状态 extends MicrophoneState {
@Override
public String handle() {
return "麦克风开启";
}
}
final class 关闭的麦克风状态 extends MicrophoneState {
@Override
public String handle() {
return "麦克风关闭";
}
}
// 步骤 5:用多态消息替换 if 语句
public String handleMicrophoneState(String state) {
Map<String, MicrophoneState> states = new HashMap<>();
states.put("静音", new Muted());
states.put("录音", new Recording());
states.put("空闲", new Idle());
MicrophoneState microphoneState =
states.getOrDefault(state, new 空的麦克风状态());
return microphoneState.handle();
}
类型:
[X] 半自动
安全大多数步骤都是机械化的,这是一个相当安全的代码重构。
为什么代码更好?重构后的代码遵循开-闭原则,更倾向于利用多态,而不是通过IF语句进行条件判断。
限制条件你只需把它用在意外的情况中的IFs上。
将业务规则保留为 “领域 if”,不要进行这种重构。
标签项一些情况 IFs
相关重构操作 重构 013 — 删除重复代码 另见 如何摆脱烦人的 IF语句,为什么我们学的第一个编程指令却很少用 致谢这篇文章是重构系列文章的一部分。
如何用简单的重构让代码更棒可以让你的代码变得更好mcsee.medium.com點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦