Как провести рефакторинг глубоко вложенных функций? - PullRequest
0 голосов
/ 18 декабря 2018

Мой код в настоящее время выглядит так:

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 голосов
/ 19 декабря 2018

Даже если вы не указали контекст своего приложения, кажется, что сценарий, который может использовать преимущества от применения Шаблон стратегии .

Код, который вы разместили, может быть урегулировандействовать как объект Context , отвечающий за управление условием более высокого уровня вашего внешнего оператора if-else.
В каждом блоке оператора if-else определенное поведение может быть загружено с помощью aa ConcreteStrategy объект (который обычно реализует интерфейс Strategy ).

Этот шаблон можно повторить для внутренних блоков if-else.

Пример

Рассмотрим игру, в которой персонаж перемещается по 2D-карте.В зависимости от его индикатора жизни (например, 0-200), он может перемещаться по 2,5,8 плитки, если он находится соответственно в усталом, нормальном или супер состоянии.

Персонаж объект действует как " Context шаблона стратегии, и у него есть ответственность, ответственность за которую MoveStrategy является правильной для ситуации. Придание жизни правильного MoveStrategy объекта и вызова путем пересылки метода move () через move () метода Character.

Подсказка для реализации 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");
    }
}
...