`
eimhee
  • 浏览: 2160544 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

重构: 使用替换丑陋的if else代码

阅读更多
使用Enum替换int常量

这一步比较简单,先创建一个enum类
package de.jingge.refactoring;

public enum SystemState {

    LOGGEDIN,

    LOGGEDOUT,

    IDLE;

}


然后开始重构SystemManager, 使用SystemState代替SystemManager里的int状态:

   1. 添加 import static de.jingge.refactoring.SystemState.*;
   2. 删除所有的integer常量  
   3. 将变量state的类型改为SystemState.

代码如下:

package de.jingge.refactoring;

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

public class SystemManager {

    SystemState state;

    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) {
        if (state == LOGGEDIN) {
            // do something after logging in is successful,
            // for example: show welcome dialog, open the last edit document, etc.
        } else if (state == LOGGEDOUT) {
            // do something after logging out is successful,
            // for example: free used resource, dispose GUI components, etc.
        } else if (state == IDLE) {
            // do something after the user is idle,
            // for example: save the application state temporarily, lock the application, etc.
        } else {
            throw new IllegalArgumentException("unknown state");
        }
        this.state = state;
    }
}




然后重构测试类:

1.    添加import static de.jingge.refactoring.SystemState.*;
2.    删除所有常量前引用的SystemManager.


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.state, LOGGEDIN);
    }
  
    @Test
    public void logout() {
        manager.logout();
        assertEquals(manager.state, LOGGEDOUT);
    }

    @Test
    public void idle() {
        manager.idle();
        assertEquals(manager.state, IDLE);
    }
}



运行这个测试类->通过
0
0
分享到:
评论
1 楼 seekgirl 2009-08-26  
没看到什么进步

相关推荐

    If-Else-Block-Refactoring:使用嵌套的ifelse代码块重构业务逻辑

    总之,重构嵌套的`if-else`块是提高代码质量的关键步骤。通过应用上述方法,开发者可以创建更清晰、更易于维护的代码,从而降低软件开发的复杂性,提升团队效率。对于Java开发者来说,理解和掌握这些重构技术是必不...

    Java 代码重构实例

    原始代码: ```java public boolean isStartAfter(Date date) {...} public boolean includes(Date date) {...} ``` 重构后: ```java private boolean tailGreatHead(int headHour, int headMinute, int ...

    软件重构技术(重构介绍、重构原则、代码的坏味道。。。)

    5. **复杂的条件表达式**:过于复杂的if-else语句可能导致代码难以理解和维护,应考虑使用策略模式或状态机来简化。 在实践中,我们可以借助一些工具,如IDE的重构功能(如Eclipse、IntelliJ IDEA等)来进行自动化...

    重构-改善既有代码设计

    6. **替换类型码与条件语句**:使用策略模式或工厂模式来消除大量if-else语句,提高代码的灵活性和可扩展性。 7. **重构测试**:确保重构过程中代码的行为不变,通过持续的单元测试来验证重构的效果。 8. **使用...

    重构改善既有代码的设计

    - **设计模式的应用**:重构经常与设计模式结合,如使用工厂模式替换大量的if-else,或使用策略模式解耦算法选择。 6. **案例研究** - **实际项目中的重构**:通过具体案例,如大型电商系统或游戏引擎,分析如何...

    《重构——改善既有代码的设计》第一个案例代码

    例如,将多层嵌套的if-else结构替换为更清晰的决策表或函数对象。 3. **提取方法**: 如果一个函数或方法包含多个步骤,将其拆分为更小、更专注的函数,这样可以使每个函数都具有单一职责,提高代码的可读性。 4. *...

    重构例子:ReplaceConditionalWithPolyMorphism

    现在,我们可以使用“用多态替换条件语句”的重构方法来改进这段代码。首先,我们为每种订单类型创建一个子类,比如 `NormalOrder`, `PremiumOrder` 和 `ExpressOrder`。然后,将每个子类中的特定处理逻辑移动到它们...

    重构 改善既有代码的设计 熊杰译 高清

    "替换条件逻辑"则是通过策略模式或者工厂模式来简化复杂的if-else结构,提升代码的可扩展性。 在进行重构时,书中的一个重要原则是保持每次改动的小规模,这样可以降低引入错误的风险,并使得问题更容易定位。此外...

    重构--改善既有代码的设计

    - **替换条件表达式为策略类**:用策略模式替换复杂的if-else语句,让代码更易于扩展和理解。 - **内联函数**:如果一个函数只在一个地方被调用,可以考虑将其内容直接放入调用处,消除函数调用开销。 - **移除...

    Java重构示例一.docx

    重构前的代码可能会包含if-else结构,如: ```java if (flag == 1) { return true; } else { return false; } ``` 重构后的代码则可以简化为: ```java return flag == 1; ``` 这样的重构减少了代码行数,提高...

    如何优雅的替换掉代码中的ifelse

    总的来说,避免大量`if-else`的关键在于将条件判断和具体操作分离,通过面向对象的设计原则(如单一职责原则、开闭原则)来重构代码,提高代码的可读性和可维护性。在实际项目中,应根据需求和团队的开发习惯选择...

    代码重构36计(摘抄)

    用条件运算符替换if-else语句进行变量赋值,可以简化代码并提高可读性。例如,用`int value = condition ? 1 : 2;`替代if-else结构。尽管有些人习惯于if-else,但条件运算符通常更简洁且直观。 3. **节约使用系统...

Global site tag (gtag.js) - Google Analytics