2014-01-30 5 views
1

Я написал метод, чтобы попытаться оптимизировать мой код, поскольку одно и то же было вызвано 3 раза, однако переписывание этого метода имеет только аналогичную проблему. Он в основном делает то же самое, но просто изменяет переменную, основанную на параметре.Код повторного факторинга/оптимизации кода

public void checkChance(String spawnX, int chance, int value) { 
     if (spawnX.equals("smallX")) { 
      if (player.getX() > screenWidth/2) { 
       if (chance > value) { 
        smallX = random.nextInt(screenWidth - (screenWidth/2)) + (screenWidth/2); 
       } else { 
        smallX = random.nextInt((screenWidth/2) - 0); 
       } 
      } else { 
       if (chance > value) { 
        smallX = random.nextInt((screenWidth/2) - 0); 
       } else { 
        smallX = random.nextInt(screenWidth - (screenWidth/2)) + (screenWidth/2); 
       } 
      } 
     } else if (spawnX.equals("mediumX")) { 
      if (player.getX() > screenWidth/2) { 
       if (chance > value) { 
        mediumX = random.nextInt(screenWidth - (screenWidth/2)) + (screenWidth/2); 
       } else { 
        mediumX = random.nextInt((screenWidth/2) - 0); 
       } 
      } else { 
       if (chance > value) { 
        mediumX = random.nextInt((screenWidth/2) - 0); 
       } else { 
        mediumX = random.nextInt(screenWidth - (screenWidth/2)) + (screenWidth/2); 
       } 
      } 
     } else if (spawnX.equals("largeX")) { 
      if (player.getX() > screenWidth/2) { 
       if (chance > value) { 
        largeX = random.nextInt(screenWidth - (screenWidth/2)) + (screenWidth/2); 
       } else { 
        largeX = random.nextInt((screenWidth/2) - 0); 
       } 
      } else { 
       if (chance > value) { 
        largeX = random.nextInt((screenWidth/2) - 0); 
       } else { 
        largeX = random.nextInt(screenWidth - (screenWidth/2)) + (screenWidth/2); 
       } 
      } 
     } 

    } 

В идеале я бы хотел, так что я только часть в теле каждого, если (который проверяет, что равняется spawnX) и просто изменить то, что установка переменной GET в. Как я могу это сделать?

ответ

1

Без копания слишком много в дизайне относительно метода подписи и с какой целью этот код выполняет [почему он вычитает 0? screenWidth - (screenWidth/2) всегда будет просто равна screenWidth/2], я думаю, что-то вроде следующего будет понятнее, с меньшим дублированием:

public void checkChance(final String spawnX, final int chance, final int value) { 
    int intermediary; 

    if (player.getX() > screenWidth/2) { 
     if (chance > value) { 
      intermediary = random.nextInt(screenWidth - (screenWidth/2)) + (screenWidth/2); 
     } else { 
      intermediary = random.nextInt((screenWidth/2) - 0); 
     } 
    } else { 
     if (chance > value) { 
      intermediary = random.nextInt((screenWidth/2) - 0); 
     } else { 
      intermediary = random.nextInt(screenWidth - (screenWidth/2)) + (screenWidth/2); 
     } 
    } 

    if (spawnX.equals("smallX")) { 
     smallX = intermediary; 
    } else if (spawnX.equals("mediumX")) { 
     mediumX = intermediary; 
    } else if (spawnX.equals("largeX")) { 
     largeX = intermediary; 
    } 
} 
+0

Это не вычитание 0, 0 - минимальное значение. Я оставил его здесь для своей выгоды. Но спасибо за порядок! –

+0

Снова это не вычитание, я знаю, что это будет равно screenWidth/2, но я хочу, чтобы он начинался с экранаWidth/2 на screenWidth (это не экранная ширина минус что-либо) –

+0

Хорошо, но я могу говорить только с кодом, который выкладывается :) – laz

1

В начале, вы могли бы сделать что-то вроде этого (псевдо-код)

TYPE tmpX = (conditionSmall) ? smallX: ((conditionMedium)? medium : largeX); 

Затем просто сделать ваши изменения в tmpX. Поскольку переменные Java (кроме примитивов) действительно указывают на объекты, ваш tmpX укажет на объект, который вы хотите изменить.

+0

ИНТ tmpX = ((spawnX.equals ("smallX")) smallX: ((spawnX.equals («mediumX»))? mediumX: largeX)); - Я закончил с этим, но он не устанавливает переменные правильно, поскольку все они появляются в одной и той же позиции Х. Что я делаю не так? –

+1

Ах! ваш smallX и т. д. являются примитивами (ints). Я не видел их объявленных и не обращал внимания на детали, из которых это можно было бы вывести. Лаз дал вам правильный ответ. –

Смежные вопросы