Вызов метода n раз: я должен использовать преобразованный цикл for-each или традиционный цикл for? - PullRequest
4 голосов
/ 25 апреля 2010

Учитывая необходимость зацикливания до произвольного значения типа int, лучше ли практиковать программирование для преобразования значения в массив и для каждого массива или просто использовать традиционный цикл for?

К вашему сведению, я рассчитываю количество 5 и 6 результатов («попаданий») в нескольких бросках 6-гранных кубиков. Мое произвольное значение типа int - это dicePool, которое представляет количество бросков.

Насколько я понимаю, есть два варианта:

  1. Преобразование dicePool в массив и для каждого массива:

    public int calcHits(int dicePool) {
       int[] dp = new int[dicePool];
       for (Integer a : dp) {
         // call throwDice method
       }
    }
    
  2. Используйте традиционный цикл for:

    public int calcHits(int dicePool) {
       for (int i = 0; i < dicePool; i++) {
         // call throwDice method
       }
    }
    

На мой взгляд, вариант 1 - это неуклюжий код, который включает в себя ненужное создание массива, хотя цикл for-each более эффективен, чем традиционный цикл for в Option 2.

Ответы [ 5 ]

12 голосов
/ 25 апреля 2010

На данный момент скорость не важна (вставьте комментарий преждевременной оптимизации;). Важно то, как быстро вы можете понять, что делает код , то есть вызывать метод dicePool раза.

Первый метод выделяет массив размером dicePool и перебирает его значения, что приводит к выполнению тела цикла dicePool раз (я буду делать вид, что вы имели в виду int вместо Integer, чтобы избежать несвязанных вопрос автобокса). Это потенциально неэффективно для компьютера , выполняющего код, но, что более важно, это неэффективно для человека , читающего код, поскольку он концептуально далек от того, чего вы хотели достичь. В частности, вы заставляете читателя задуматься о новом массиве, который вы только что создали, И о значении переменной a, которая будет равна 0 для каждой итерации цикла, даже если ни один из них не связан с вашей конечной целью .

Любой Java-программист, рассматривающий второй метод, поймет, что вы выполняете тело цикла dicePool раз с i «подсчетом» до dicePool. Хотя последняя часть не особенно важна, начало именно то, что вы хотели сделать. Использование этой распространенной Java-идиомы сводит к минимуму несвязанные вещи, о которых нужно подумать читателю, поэтому это лучший выбор.

Если сомневаешься, иди с простотой. : D

4 голосов
/ 25 апреля 2010

Зачем вам нужно выделять массив для зацикливания переменной, которую можно безопасно увеличивать и использовать без необходимости выделения?

Звучит излишне неэффективно. Вам может понадобиться выделить массив, если вам нужно поменять местами порядок ints, но это не так. Я бы точно выбрал вариант 2 .

foreach полезен, когда вы хотите выполнить итерацию по коллекции, но создать коллекцию просто для итерации по ней , когда она вам не нужна, просто бессмысленно. .

2 голосов
/ 25 апреля 2010

Что заставляет вас думать, что цикл for-each более эффективен?

Итерации по набору, скорее всего, менее эффективны, чем простой цикл и счетчик.

Это может помочь, если вы дадите больше контекста о проблеме, в частности, есть ли у этого вопроса больше, чем выбор одного синтаксиса над другим. У меня возникают проблемы при мысли о проблеме, для которой # 1 будет лучшим решением.

2 голосов
/ 25 апреля 2010

(2) - очевидный выбор, потому что нет смысла создавать массив на основе вашего описания. Если есть, конечно, все меняется.

1 голос
/ 25 апреля 2010

Я бы не стал писать первый.Нет необходимости использовать последний синтаксис в каждой настройке.

Ваш инстинкт хорош: если он чувствует себя неуклюже и выглядит неуклюже, вероятно, это так.

...