2014-02-10 2 views
0

Ну, у меня возникли проблемы с повторным факторингом старого кода, его школьное задание так ... Я планирую использовать шаблон дизайна или стратегию проектирования, во всяком случае, я не уверен, как использовать они в данном конкретном случае:Re facting with Factory design patern

public void sunk(int i, int j) 
{ 
    if(map[i][j]==hit) 
    { 

    //if the hit is not on an edge 
    if(i<9 && i>0 && j<9 && j>0) 
    { 

     //dec above if odd 
     if(map[i-1][j]!= hit && map[i-1][j]%2==1) 
     { 
      //if(map[i-1][j]==13) 
      map[i-1][j]= map[i-1][j] -9; 
     } 

     //dec above if even 
     if(map[i-1][j]!= hit && map[i-1][j]%2==0) 
     { 
      map[i-1][j]= map[i-1][j] -2; 
     } 

     //dec below if odd 
     if(map[i+1][j]!= hit && map[i+1][j]%2==1) 
     { 
      map[i+1][j]= map[i+1][j] -9; 
     } 

     //dec below if even 
     if(map[i+1][j]!= hit && map[i+1][j]%2==0) 
     { 
      map[i+1][j]= map[i+1][j] -2; 
     } 

     //dec left if even 
     if(map[i][j-1]!= hit && map[i][j-1]%2==0) 
     { 
      map[i][j-1]= map[i][j-1] -4; 
     } 

     //dec left if odd 
     if(map[i][j-1]!= hit && map[i][j-1]%2==1) 
     { 
      map[i][j-1]= map[i][j-1] -9; 
     } 

     //dec right if even 
     if(map[i][j+1]!= hit && map[i][j+1]%2==0) 
     { 
      map[i][j+1]= map[i][j+1] -4; 
     } 

     //dec right if odd 
     if(map[i][j+1]!= hit && map[i][j+1]%2==1) 
     { 
      map[i][j+1]= map[i][j+1] -9; 
     } 
    } 

и я иду дальше и дальше, потому что так у меня так много, если-иначе заявления я имею в виде использования указанных выше моделей. Помощь

ответ

0

Я не уверен, что любой шаблон поможет вам здесь.

Factory будет использоваться для создания экземпляров различных подклассов объектов (или наборов подклассов) на основе входных параметров.

Strategy будет использоваться для замены поведения в классе по адресу времени выполнения.

Не зная больше о том, чего пытается достичь код выше, трудно сделать предложение. Для кода, подобного вышеизложенному, можно инкапсулировать в таблицы поиска, что даст вам краткую реализацию за (огромную?) Стоимость читаемости.

0

У вас может быть стратегия. Сначала начните с интерфейса для стратегии. Я не знаю, какой язык вы используете, поэтому я буду использовать Java-подобный язык.

interface HitStrategy { 
    bool AppliesTo(map, i, j); 
    void Apply(map,i,j); 
} 

Каждый класс будет реализовывать различные если блоки:

class DecRightIfOdd implements HitStrategy { 
    public bool AppliesTo(map, i, j){ 
     return map[i][j+1]!= hit && map[i][j+1]%2==1; 
    } 

    public void Apply(map,i,j){ 
     map[i][j+1]= map[i][j+1] -9; 
    } 
} 

Тогда в вашем коде, вы можете иметь список HitStrategy и найти те, которые действуют на карте и положение, а затем вызвать Применить метод.

Итак, почему это лучше, если у вас есть куча ifs? вы можете использовать наследование. В вашем примере у вас есть два Dec Right, один для Odd и один для четного. Вы можете сделать это:

abstract class DecRight implements HitStrategy { 
    public bool AppliesTo(map, i, j){ 
     return map[i][j+1]!= hit; 
    } 
    public abstract Apply(map,i,j); 
} 

class DecRightIfOdd inherits DecRight { 
    public bool AppliesTo(map, i, j){ 
     return base(map,i,j) && map[i][j+1]%2==0; 
    } 

    public void Apply(map,i,j){ 
     map[i][j+1]= map[i][j+1] -4; 
    } 
} 

class DecRightIfEven inherits DecRight { 
    public bool AppliesTo(map, i, j){ 
     return base(map,i,j) && map[i][j+1]%2==1; 
    } 

    public void Apply(map,i,j){ 
     map[i][j+1]= map[i][j+1] -9; 
    } 
} 

Надеюсь, это поможет.