使用重构移除丑陋的if else代码(4)

使用重构移除丑陋的if else代码(4)
本文紧接 使用重构移除丑陋的if else代码(3)

OK, 到目前为止,所有的逻辑代码已经从SystemManager重构到了SystemStatePerformer。下一步应该继续重构SystemManager, 将SystemState替换为performer:

1, 使用IDE的重构功能,将变量SystemState改为SystemStatePerformer

2. 在updateState()方法中调用SystemStatePerformerFactory

3. 在测试代码里面,调用manager.statePerformer.getState()

重构后的代码如下:

package  de.jingge.refactoring;

 

import   static  de.jingge.refactoring.SystemState. * ;


public   class  SystemManager {

 

    SystemStatePerformer statePerformer;

 

    
public   void  login() {

        
//  call service#login()

        updateState(LOGGEDIN);

    }

 

    
public   void  logout() {

        
//  call service#logout()

        updateState(LOGGEDOUT);

    }

 

    
public   void  idle() {

        
//  call some other services

        updateState(IDLE);

    }

 

    
public   void  updateState(SystemState state) {

        
this .statePerformer  =  SystemStatePerformerFactory.getInstance()

                getSystemStatePerformer(state);

        statePerformer.perform();

    }

}

可以看到if else已经消失了。


测试代码也要做相应修改:
package  de.jingge.refactoring;

 

import  org.junit.AfterClass;

import  org.junit.BeforeClass;

import  org.junit.Test;

import   static  org.junit.Assert. * ;

import   static  de.jingge.refactoring.SystemState. * ;


public   class  SystemManagerTest {

    
private   static  SystemManager manager;

    @BeforeClass
    
public   static   void  setUpClass()  throws  Exception {

        manager 
=   new  SystemManager();

        
//  add some service mock objects

    }

    @AfterClass
    
public   static   void  tearDownClass()  throws  Exception {

    }

    @Test
    
public   void  login() {

        manager.login();

        assertEquals(manager.statePerformer.getState(), LOGGEDIN);

    }

    @Test
    
public   void  logout() {

        manager.logout();

        assertEquals(manager.statePerformer.getState(), LOGGEDOUT);

    }

    @Test
    
public   void  idle() {

        manager.idle();

        assertEquals(manager.statePerformer.getState(), IDLE);

    }

}

到这里重构已经差不多完成了,代码已经更加面向对象了。这里还有一个小问题,在factory里面还有一个switch,这个和if else其实是没有本质区别的,也就是说if else并没有被完全移除掉。


那么如何能够彻底把这个switch也移除掉呢?很简单,我们只需要在getSystemStatePerformer()方法被调用之前先创建所有 performer匿名类的实例,然后在该方法被调用时直接返回对应的实力。 那么具体如何实现呢,请看下一篇文章 使用重构移除丑陋的if else代码(5)




声明:本文版权归作者所有,如需转载请注明出处。

你可能感兴趣的:(使用重构移除丑陋的if else代码(4))