PC的blog

Finding... Thinking... Solving...

BlogJava 首页 新随笔 联系 聚合 管理
  9 Posts :: 0 Stories :: 54 Comments :: 0 Trackbacks
本文紧接使用重构移除丑陋的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)




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

posted on 2008-08-04 03:08 polygoncell 阅读(1926) 评论(1)  编辑  收藏

Feedback

# re: 使用重构移除丑陋的if else代码(4)[未登录] 2008-08-04 10:18 Matthew
在enum中加入多态方法吧。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: