xjb 发表于 2010-4-3 23:09:02

对象健身操:拒绝else

http://gigix.agilechina.net/2009/7/7/program-without-else/

每个程序员都熟知if/else结构。几乎每种语言都支持if/esle。简单的条件判断对于任何人来说都不难理解。不过大多数程序员也见识过令人眩晕的层层嵌套的条件判断,以及连绵数页的case语句。更糟糕的是,在现有的判断条件上加一个新的分支通常是非常容易的,而将它重构为一个更好的方式的想法却罕有人去提及。条件判断结构通常还是重复代码的来源。例如,状态标识经常会带来这样的问题:[*]public static void endMe() {[*]    if (status == DONE) {[*]      doSomething();[*]    } else {[*]      // other code[*]    }[*]}
复制代码
你有很多种方式重写这段代码,去掉else关键字。例如下面的代码:[*]public static void endMe() {[*]    if (status == DONE) {[*]      doSomething();[*]      return;[*]    }[*]    // other code[*]}[*][*]public static Node head() {[*]    if (isAdvancing()) { return first; }[*]    else { return last; }[*]}[*][*]public static Node head() {[*]    return isAdvancing() ? first : last;[*]}
复制代码
在上面的例子中,第二段代码由于使用了三元运算符,所以代码长度从四行压缩到了一行。需要小心的是,如果过度使用“提前返回”,代码的清晰度很快会降低。《设计模式》一书中关于策略模式的部分里有一个实例,演示了如何使用多态避免根据状态进行分支选择的代码。如果这种根据状态进行分支选择的代码大量地重复,就应该考虑使用策略模式了。
面向对象编程语言给我们提供了一种更为强大的工具——多态。它能够处理更为复杂的条件判断。对于简单的条件判断,我们可以使用“卫语句”和“提前返回”替换它。而基于多态的设计则更容易阅读与维护,从而可以更清晰地表达代码的内在意图。但是,程序员要做出这样的转变并不是一帆风顺的。尤其是你的代码中可能早已充斥了else。所以,作为这个练习的一部分,你是不可以使用else的。在某些场景下可以使用 Null Object 模式,它会对你有所帮助。另外还有很多工具和技术都可以帮助你甩掉else。试一试,看你能提出多少种方案来?
页: [1]
查看完整版本: 对象健身操:拒绝else