简化条件表达式之以多态取代条件表达式(Replace Conditional with Polymorphism)

你手上一个条件表达式,它根据对象类型的不同而选择不同的行为。将这个条件表达式的每个分支放进一个子类的覆写函数中,然后将原始函数声明为抽象函数。

动机:多态的最根本的好处是:如果你需要根据对象的不同类型而采取不同的行为,多态使你不必编写某些的条件表达式。

正因为有了多态,所以你会发现:“类型吗的switch语句”以及 ”基于类型名称的if-then-else语句“在面向对象程序中很少出现。

多态能够给你带来很多好处。如果同一组条件表达式在程序的许多地点出现,那么使用多态的收益是最大的。使用条件表达式时,如果你想添加一种新类型,就必须查找并更新所有条件表达式。但如果使用多态,只需建立一个新的子类,并在其中提供适当的函数就行了。类的用户不需要了解这个子类,这就大大降低了系统各部分之间的依赖,使系统升级更加容易。

class Engineer extends EmployeeType{
    int getTypeCode(){
        return Employee.ENGINEER;
    }
}
class Manager extends EmployeeType{
    int getTypeCode(){
        return Employee.MANAGER;
    }
}
class Salesman extends EmployeeType{
    int getTypeCode(){
        return Employee.SALEMAN;
    }
}
class Employee...
private employeeType _type;
int payAmount(){
    switch(getType()){
    case EmployeeType.ENGINEER:
        return _monthlySalary;
    case EmployeeType.SALESMAN:
        return _monthlySalary + _commission;
    case EmployeeType.MANAGER:
        return _monthlySalary + bonus;
    default;
        throw new RuntimeException();
    }
}
int getType(){
    return _type.getTypeCode();
}
void setType(int arg){
    _type = EmployeeType.newType(arg);
}
class employeeType...
static EmployeeType newType(int code){
    switch(code){
        case ENGINEER:
            return new Engineer();
        case SALESMAN:
            return new Salesman();
        case MANAGER:
            return new Manager();
        default:
            throw new IllegalArgumentException();
    }
}
static final int ENGINEER = 0;
static final int SALESMAN = 1;
static final int MANAGER = 2;

使用多态后

class Engineer extends EmployeeType{
    int getTypeCode(){
        return Employee.ENGINEER;
    }
}
class Manager extends EmployeeType{
    int getTypeCode(){
        return Employee.MANAGER;
    }
}
class Salesman extends EmployeeType{
    int getTypeCode(){
        return Employee.SALEMAN;
    }
}
class Employee...
private employeeType _type;
int payAmount(){
    switch(getType()){
    case EmployeeType.ENGINEER:
        return _monthlySalary;
    case EmployeeType.SALESMAN:
        return _monthlySalary + _commission;
    case EmployeeType.MANAGER:
        return _monthlySalary + bonus;
    default;
        throw new RuntimeException();
    }
}
int getType(){
    return _type.getTypeCode();
}
void setType(int arg){
    _type = EmployeeType.newType(arg);
}
class employeeType...
static EmployeeType newType(int code){
    switch(code){
        case ENGINEER:
            return new Engineer();
        case SALESMAN:
            return new Salesman();
        case MANAGER:
            return new Manager();
        default:
            throw new IllegalArgumentException();
    }
}
static final int ENGINEER = 0;
static final int SALESMAN = 1;
static final int MANAGER = 2;

原文地址:https://www.cnblogs.com/newbee0101/p/11982109.html

时间: 2024-11-13 08:29:21

简化条件表达式之以多态取代条件表达式(Replace Conditional with Polymorphism)的相关文章

以多态取代条件表达式

1.案例 话说最近直播很火嘛,反正我今天已经看了一晚上大胸了 我们看到,直播间里大致分为3类观众: 1.普通观众 2.房管 3.超管 如何区分这三种观众呢?我们发现,普通观众只显示自己的昵称,房管在自己的昵称前面还有一个醒目的“房管”标记,当然,超管的昵称前有个醒目的“超管”标记.看直播的都希望自己有个标记,因为这样才能装13啦... 2.条件表达式 现在,我们通过编写代码来区分这3种观众. 1.编写3个类. class CommonAudience; //普通观众 class HouseMan

重构-多态取代条件表达式

1 package refactoring; 2 3 /** 4 * @title Object oriented polymorphism 5 * @description 面向对象多态取代switch 6 * @author LZH 7 * @date 2016-8-2 下午10:48:51 8 */ 9 public class OOPReplaceSwitch { 10 11 public static void main(String[] args) { 12 13 int emplo

重构第31天 使用多态替代条件语句( Replace conditional with Polymorphism)

理解:本文中的”使用多态代替条件判断”是指如果你需要检查对象的类型或者根据类型执行一些操作时,一种很好的办法就是将算法封装到类中,并利用多态性进行抽象调用. 详解:本文展示了面向对象编程的基础之一“多态性”, 有时你需要检查对象的类型或者根据类型执行一些操作时,一种很好的办法就是将算法封装到类中,并利用多态性进行抽象调用. 如下代码所示,OrderProcessor 类的ProcessOrder方法根据Customer 的类型分别执行一些操作,正如上面所讲的那样,我们最好将OrderProces

小酌重构系列[14]——使用多态代替条件判断

概述 有时候你可能会在条件判断中,根据不同的对象类型(通常是基类的一系列子类,或接口的一系列实现),提供相应的逻辑和算法.当出现大量类型检查和判断时,if else(或switch)语句的体积会比较臃肿,这无疑降低了代码的可读性.另外,if else(或switch)本身就是一个“变化点”,当需要扩展新的对象类型时,我们不得不追加if else(或switch)语句块,以及相应的逻辑,这无疑降低了程序的可扩展性,也违反了面向对象的OCP原则. 基于这种场景,我们可以考虑使用“多态”来代替冗长的条

利用反射+多态替换条件语句

/*利用反射+多态替换条件语句*/ class Program { public static void Main(string[] args) { /* * 用户发送一个命令,让代码去指定Commander * * <?xml version="1.0" encoding="utf-8" ?><Command><CommandType>Start</CommandType></Command> */ //

重构第四天 : 用多态替换条件语句(if else &amp; switch)

面相对象的一个核心基础就是多态,当你要根据对象类型的不同要做不同的操作的时候,一个好的办法就是采用多态,把算法封装到子类当中去. 重构前代码: 1 public abstract class Customer 2 { 3 } 4 5 public class Employee : Customer 6 { 7 } 8 9 public class NonEmployee : Customer 10 { 11 } 12 13 public class OrderProcessor 14 { 15

编写高质量代码改善C#程序的157个建议——建议104:用多态代替条件语句

建议104:用多态代替条件语句 假设要开发一个自动驾驶系统.在设计之初,此自动驾驶系统拥有一个驾驶系统命令的枚举类型: enum DriveCommand { Start, Stop } 当前该枚举存在两个命令:开始.停止.又假设有一个驾驶方法可以处理车辆接收到的指令.一开始我们可能像下面这样编码: static void Main(string[] args) { DriveCommand command = DriveCommand.Start; Drive(command); comman

条件随机场介绍(4)—— An Introduction to Conditional Random Fields

4. 推断 高效的推断算法对条件随机场的训练和序列预测都非常重要.主要有两个推断问题:第一,模型训练之后,为新的输入\(\mathbf{x}\)确定最可能的标记\(\mathbf{y}^* = \arg \max_{\mathbf{y}} p(\mathbf{y}|\mathbf{x})\):第二,如第5部分所述,参数估计常要求计算标记子集上的边缘分布,例如节点的的边缘分布\(p(y_t|\mathbf{x})\)和边上的边缘分布\(p(y_t,y_{t-1}|\mathbf{x})\).这两个

第1章 重构,第一个案例(3):运用多态取代switch

3. 运用多态取代与价格相关的条件逻辑 3.1 switch和“常客积分”代码的再次搬迁 (1)switch:最好不要在另一个对象的属性上运用switch语句 switch(getMovie().getPriceCode()) //在movie对象的priceCode属性上运用switch { //这意味着可以将getCharge函数从Rental类移动到Movie类去 //选择在Movie类中封装计算费用功能,还有一个 //原因,就是可以控制因影片类型变化导致的计算 //方式变化,从而对其它对