如何重构深层嵌套的函数?

时间:2018-12-18 07:10:17

标签: if-statement nested refactoring statements

我的代码当前如下所示:

If (case = 1)
{
    If (option = 1)
    {
        If (otherOption = 1)
            ;do something
        else if (otherOption = 2)
            ;do something
        else if (otherOption = 3)
            ;do something
    }
    else
    {
        If (otherOption = 1)
            ;do something
        else if (otherOption = 2)
            ;do something
        else if (otherOption = 3)
            ;do something
    }
}

else if (case = 2)
{
    If (option = 1)
    {
        If (otherOption = 1)
            ;do something
        else if (otherOption = 2)
            ;do something
        else if (otherOption = 3)
            ;do something
    }
    else
    {
        If (otherOption = 1)
            ;do something
        else if (otherOption = 2)
            ;do something
        else if (otherOption = 3)
            ;do something
    }
}

else if (case = 3)
{
    If (option = 1)
    {
        If (otherOption = 1)
            ;do something
        else if (otherOption = 2)
            ;do something
        else if (otherOption = 3)
            ;do something
    }
    else
    {
        If (otherOption = 1)
            ;do something
        else if (otherOption = 2)
            ;do something
        else if (otherOption = 3)
            ;do something
    }
}

显然很糟糕,很难维护。我想在此之上添加另一个超级If语句,它将这棵树拆分6次。每个;做某事都会执行一行代码。

有关如何重构这种怪兽的任何帮助?我已经写了很多看起来像这样的代码,而我每次都害怕使用它。我需要一种解决这些问题的新方法。扩展此代码的功能需要大量工作。

1 个答案:

答案 0 :(得分:1)

即使您未指定应用程序的上下文,似乎也可以从Strategy Pattern的应用程序中受益。

您发布的代码可以设置为 Context 对象,并负责控制外部if-else语句的更高级别条件。
在if-else语句的每个块中,可以使用 ConcreteStrategy 对象(通常实现 Strategy 接口)来加载特定的行为。

内部if-else块可以重复此模式。

示例

考虑一个游戏,其中角色在2D地图上移动。根据其寿命指标(例如0-200),如果他处于疲劳,正常或超级状态,则可以分别移动2,5,8个图块。

字符对象的行为类似于策略模式的“ 上下文”,并且他负责 MoveStrategy 对于这种情况是正确的。 放置正确的 MoveStrategy 对象,并通过转发Character的 move()方法的方法 move()进行调用。

该示例的Java实现提示:

public class Character{

    private int life=100;
    private int x=0 
    private int y=0; 
    private MoveStrategy strategy=new DefaultStrategy();


    public int getLife(){
        return life;
        }

        public void setLife(int value){
        this.life=value;
        }

    public void move(){
        if(life<30)
            strategy=new TiredStrategy();
        else if(life > 100)
            strategy=new SuperStrategy();
        else
            strategy=new DefaultStrategy();


        strategy.move();

    }
}



public interface MoveStrategy{

    public abstract void move();

}

public DefaultStrategy implements MoveStrategy{

    public void move(){
        System.out.println("Move character of 5 tiles");
    }
}

public TiredStrategy implements MoveStrategy{

    public void move(){
        System.out.println("Move character of 2 tiles");
    }
}

public SuperStrategy implements MoveStrategy{

    public void move(){
        System.out.println("Move character of 8 tiles");
    }
}