程序中减少使用 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");    }}
0 0
原创粉丝点击