程序中减少使用 if 语句的策略
来源:互联网 发布:数据库用户是什么 编辑:程序博客网 时间:2024/06/05 00:11
If语句问题
if语句会触发以下问题:
if 条件1 处理语句1elseif 条件2 处理语句2else 处理语句3
1)if 语句的代码易越改越混乱。“处理语句”越来越多,耦合越来越复杂,就会很难读。进一步嵌套 if 语句与本地 return 的滥用情况也很常见,很难搞懂业务逻辑是选择了哪种路径。
2)if 语句缺失 domain 的概念,很容易在不需要的情况下,将内容放在一起而增加耦合性,造成代码难读难改。
3)开发者必须在头脑中模拟执行实现情况。开发者的精力应当用来思考如何解决问题,而不是浪费在如何将复杂的代码分支结构编织在一起之上。
策略
策略1:布尔参数(Boolean Params)
背景: 在方法中依据 boolean值选择合适的处理策略。
void 函数名(参数1,参数2, boolean temporary) { if(temporary) { 处理1 } else { 处理2 }}
问题:上述代码代码中是将两个方法捆绑到一起,布尔参数作用在代码中定义一个概念。在编译时可以算出代码要采用哪种策略,就可以放心使用这种模式。
解决方案: 将这个方法拆分成两个新的方法,然后即可消除 if 。
策略2:使用多态(Polymorphism)
背景: 使用switch时 依据类型选择策略。
switch (type) { case 类型1: return 处理1; case 类型2: return 处理2; case 类型3: return 处理3; default: return 处理4; }
问题: 在添加新的类型时,必须要记得更新 switch 语句。根据类型做单次切换是可行的,如果 switch 太多,在添加新类型时如果忘记更新现有隐藏类型中的所有 switch,就会导致 bug 出现。
解决方案: 使用多态,添加新类型时添加相关行为。
class 基类 { public 函数1() { 处理 } protected 函数2() { 处理; } protected 函数3() { 处理; }}class 子类1 :继承方式 基类 { public double 函数4() { return 函数1-函数2; }}class 子类2:继承方式 基类 { public double 函数5() { 函数2+函数3; }}
策略3:NullObject/Optional
背景: 当外部请求时,回答“查一下 null 的情况”。
int 方法名(参数){ if(参数 == null) { return 0; } return 处理;}
策略4:将内联语句(Inline statements)转为表达式
boolean horrible(boolean foo, boolean bar, boolean baz) { if (foo) { if (bar) { return true; } } if (baz) { return true; } else { return false; }}
问题: 这种代码会导致开发者必须用大脑来模拟计算机对方法的处理。很少有不适用的情况,像这样的代码可以合成一行,或者拆成不同的部分。
解决方案: 将 if 语句树合成单个表达式。
boolean horrible(boolean foo, boolean bar, boolean baz){ return foo && bar || baz;}
策略5:给出应对策略
背景:在调用一些其他代码时,无法确保处理是否成功。
class Repository { String getRecord(int id) { return null; // cannot find the record }}class Finder { String displayRecord(Repository repository) { String record = repository.getRecord(123); if(record == null) { return "Not found"; } else { return record; } }}
问题: 这类 if 语句增加了处理同一个对象或者数据结构的时间,其中包含隐藏耦合——null 的情况。其它对象可能会返回其他代表没有结果的 magic value。最好将这类 if 语句放在一个地方,由于不会重复,就能将为空对象的 magic value 删除。
解决方案:针对被调用代码,给出应对策略。
class Repository { String getRecord(int id, String defaultValue) { String result = Db.getRecord(id); if (result != null) { return result; } return defaultValue; }} public class Finder { String displayRecord(Repository repository) { return repository.getRecord(123, "Not found"); }}
- 程序中减少使用 if 语句的策略
- 程序中减少使用if语句的方法集锦
- 程序中减少使用if语句的方法集锦
- 程序中减少使用if语句的方法集锦
- 如何在代码中减少if else语句的使用
- 在js开发中,如何减少if else语句的使用
- 减少if else 语句使用的个人集锦
- 调优(二) 减少if语句的使用
- js 减少if的使用
- 减少if语句
- 选择结构中if语句的使用
- jstl标签中if语句的使用
- shell中if语句的使用要点!
- shell 中if 语句的使用
- mysql中 if语句的使用
- 使用if语句编写程序
- if语句的使用
- if语句的使用
- 欢迎使用CSDN-markdown编辑器
- This cache store does not support tagging
- 405: HTTP method GET is not supported by this URL
- 个人总结之基于MSP430F5510的X9331驱动
- C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结
- 程序中减少使用 if 语句的策略
- RecyclerView基本用法
- java 解压文件
- mysql的普通索引,唯一索引,主索引
- JQuery的一些有用的小方法
- 自定义流式布局
- 【Python学习笔记】函数式编程:高阶函数filter
- java 删除目录
- Qt中使用CSDN git