面向对象与IF-ElSE

                            面向对象与IF-ElSE

我们这里要讨论的问题是,对于代码中出现了很多的IF-Else,我们如何处理

我之前写了个代码,要求对输入的不同字符作不同处理,所以写了很多IF-Else,后来,需求增加,也就是增加了一些判断,我把所有的半段都提出来放到了一个方法里,利用flag进行表示处理,虽然解决了需求的扩展问题,但是大量的IF-Else没有得到处理,当然如果输入的字符种类很少,我想没必要处理[当时只有4种],但是如果输入的字符种类便多了,怎么办?当然不能再用IF-Else了。

[1、] 其实处理办法是有的,如果应用命令模式,但其实只是分散了IF-ELSE,但并没有解决实质性问题。
public void process(char inChar){//原来未使用命令模式的处理
   if(inChar == 'A'){......}
   if(inChar == 'B'){......}
   if(inChar == 'C'){......}
   if(inChar == 'D'){......}

   ...............................
}

使用命令模式:

public Interface Handle{public void doSome(char inChar);}

public class HandleACommand{
       public void doSome(char inChar){//这里其实是分散了if的处理方式,使其不用集中处理
              if(inChar == 'A'){//do some thing . }
       }
}

public class HandlBCommand{
       public void doSome(char inChar){//这里其实是分散了if的处理方式,使其不用集中处理
              if(inChar == 'B'){//do some thing . }
       }
}

//now we call process with command pattern
public void process(char inChar){//原来未使用命令模式的处理
   private Handle handleA = new HandleACommand();//这里也可以使用DI方式注入
   private Handle handleB = new HandleBCommand();//这里也可以使用DI方式注入
   .....................................
  
   handleA.doSome(inChar);
   handleB.doSome(inChar);
   handleC.doSome(inChar);
   handleD.doSome(inChar);

   ...............................
}

[2、] 使用Java反射机制
另外一种解决方法是Java的反射机制。通过输入的字符合成不同的方法,扩展问题很好解决,每增加一个命令,就增加一个方法,但是会出现大量的方法。性能上不用我说大家也知道,会比不用反射机制慢1个数量级,当然它可以解决问题。

public void process(char inChar){
    tyr{
          final Method handleMethod = this.getClass().getMethod("handle" + inChar);
          handleMethod.invoke(this);
    }catch(NoSuchMethodException ex){//do exception.......}
    }catch(IllegalAccessException ex}{//do exception.......}
    }catch (InvocationTargetException ex){//do exception.......}

    private void handleA(inChar){//do some thing.}
    private void handleB(inChar){//do some thing.}
    private void handleC(inChar){//do some thing.}
    private void handleD(inChar){//do some thing.}
}

[3、] 利用state模式处理
下面是用的最多的处理办法,利用State模式进行处理。这也是处理此类问题使用最多的一种模式。当然也不是万能的,只是让大家首先考虑这个模式而已。但是这样会增加子类的数量。
public interface State {public void handle();}
public class ConcreteState_ONE {
       public void handle(){//do some thing. }
}
public class ConcreteState_TWO {
       public void handle(){//do some thing. }
}
public class ConcreteState_Default {
       public void handle(){//do some thing. }
}
..............................................

public class CoreProcess {
    private static final int STATE_ONE = 0;
    private static final int STATE_TWO = 1;
    private static final int STATE_THREE = 2;
    private static final int STATE_FOUR = 3;
    ..........................................
   
    private State initState = new ConcreteState_Default();
   
    public void changeState(int stateNum){
           switch(stateNum){
                case STATE_ONE : initState = new ConcreteState_ONE(); break;
                case STATE_TWO : initState = new ConcreteState_TWO(); break;
                ......................................................
               
                default : initState = new ConcreteState_Default();
           }          
    }
   
    public void requestCommand(){
         initState.handle();    
    }   
   
}

//客户调用
public class Context{
     public static void main(String[] args){
          CoreProcess coreProcess = new CoreProcess();
          coreProcess.changeState(CoreProcess.STATE_ONE);
          coreProcess.requestCommand();
          ..............................................
         
          coreProcess.changeState(CoreProcess.STATE_THREE);
          coreProcess.requestCommand();
         
          ....................................
     }
}


    总结,但是在提出的汽车问题中,输入的字符扩展有限(或者说输入字符种类不回很多),不应该过度设计,当然那也是时间有限,过度设计最可怕的是它会分散你的思维,让你有限的精力浪费在不应该或暂时不应该思考的问题上,而那些真正应该在现阶段得到重视和解决的问题却被你忽略了。无论是java还是c++以及其他很多语言,都有if/else 关键字的出现,那么就不能用是否面向对象而将之排出,比如在Struts的Action处理中,根据不同情况进行不同跳转处理就是应该使用if/else。

 

coolwangyu@Gmail.com

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值