У меня есть цикл for, где я должен пропустить первый элемент массива с нуля.
Что из этого показывает мои намерения более четко?
for($i=1 ; $i < count(array) ; $i++){
array[$i];
}
или
for($i=0+1 ; $i < count(array) ; $i++){
array[$i];
}
$i=2-1
является лучшим способом. : /foreach ($i in range(1, count))
(как это выглядит в PHP). Или что-то вродеforeach ($item in array.skip(1))
того, что сделал бы человек C #.Ответы:
Я ненавижу оба.
Кто сказал, что вы можете использовать магические числа? Если вы собираетесь начать со смещения 1, как насчет того, чтобы сказать нам, ПОЧЕМУ вы начинаете со смещения 1. Добавление одинаково магического нуля мне ничего не объясняет.
Это смещение полезной нагрузки? Это какая-то строка паскаля, которую вы конвертируете в строку c с нулевым символом в конце? Пожалуйста, расскажите нам, что происходит.
Извините, но я потратил впустую большую часть своей карьеры, расшифровывая подобные бессмысленные тайны, и мое терпение к ним истощилось. Является ли переменная с приличным именем действительно много, чтобы спросить?
Под приличным именем я подразумеваю имя, которое объясняет, ПОЧЕМУ мы пропускаем первый элемент. Не то, что просто говорит, что мы пропускаем первый элемент. 1 сказал мне, что сам по себе.
источник
static final int LONELIEST_NUMBER = 1
во всем своем коде Java. :-) Тем не менее, если подумать, я бы хотел отменить ваш ответ, но не смогу, если вы его не отредактируете. Глупое ТАКОЕ правило?Краткий ответ: первый вариант лучше.
Второй вариант просто добавляет шум. Маловероятно, что 0 + 1 помогает читателю понять, что это могло быть 0, но оно равно 1. Гораздо более вероятно, что он будет озадачен коротким моментом и отвлечен от того, о чем идет речь. Особенно на языке, где все массивы начинаются с 0.
Как уже упоминалось, если вы хотите подчеркнуть тот факт, что цикл начинается с 1, а не с 0, просто добавьте комментарий.
источник
Не говорите нам, что вы пропустили первый пункт - мы это видим. Что не очевидно, так это почему . Итак ... если это не очевидно из контекста, скажите нам, почему:
Или, если вы не любите комментировать, что-то вроде:
Не используйте комментарии и хитрости, чтобы напомнить нам, как работает язык.
источник
Ваш пример выглядит надуманным. В реальном коде тот факт, что циклы должны начинаться со второго элемента массива, наиболее вероятно очевиден из следующих строк кода. Например, если реальный код выглядит так
не было бы никакого объяснения или конструкции «0 + 1», необходимой, чтобы прояснить, почему цикл начинается с 1 вместо 0.
Однако, если код внутри цикла не объясняет причины столь очевидным образом (возможно,
array[0]
имеет особое значение и должен рассматриваться не так, как остальные элементы), добавьте поясняющий комментарий. Но прежде чем сделать это, подумайте дважды, сможете ли вы избежатьarray[0]
такого особого значения, и реорганизуйте окружающий код, который, вероятно, будет лучшей альтернативой.источник
Никогда не видел вариант № 2, но мне это нравится. Почему? При выборе опции 1 я хотел бы знать, забыл ли программист, что массивы начинаются с 0. Опция 2 проясняет, что они намеренно начинаются с 1.
Тем не менее, лучше всего в любом случае добавить комментарий, почему вы пропускаете элемент.
Или, если вы можете легко описать, почему вы начинаете с одного, используйте константу. Например, если посмотреть на аргументы командной строки, что-то вроде
Лично я бы, наверное, просто использовал комментарий, YMMV.
источник
Я сомневаюсь, что кто-то будет смущен первым. Мы все должны были сделать это. Настолько, что второй с большей вероятностью запутает. «Почему там 0+? Они как-то переопределяют оператор +?»
Приличный компилятор все равно превратит второй в первый, но похоже, что вы используете PHP, что интерпретируется. Таким образом, каждый раз, когда интерпретатор попадает в этот цикл, ему фактически необходимо добавить 0 и 1. Ничего страшного, но зачем переводчику делать работу?
источник
Используйте переменную, которая объясняет начальную точку.
Вам необходимо « пропустить первый элемент массива с нуля », например:
источник
Если кто-то одержим всеми циклами, начинающимися с нуля, вы можете использовать оператор continue. Добавьте комментарий к тому, почему вы пропускаете, так как обычно это не так.
источник
if first then skip
с комментарием, объясняющим почему. Все же без контекста ни одно из решений не является «лучшим»Что бы я сделал, это удалил первый элемент перед циклом. Создайте новый массив, если вам нужно. Объясните в комментарии, почему вы это делаете. А потом просто сделай простой foreach.
Таким образом, ваше намерение совершенно ясно.
Чтобы уточнить, вы можете обернуть код в метод с соответствующим именем, чтобы прояснить ситуацию.
Однако все это все еще отсутствует контекст. Что вы хотите сделать с элементами? Будете ли вы возвращать новый массив? Вы заботитесь об оригинале и новом массиве после вас
doStuff()
?В любом случае, здесь нет четкого ответа, и решение о том, как сделать код читаемым, сильно зависит от контекста.
источник
$array[$i-1] = $array[$i]
или что-то подобное, согласно ответу @ DocBrown?1
(см. Комментарий Кевина Ли), это вовсе не делает код более понятным. Читатель должен понимать array_shift, что он делает, как он работает. Может быть, эта строка кода является ошибкой? Модифицирует ли массив или возвращает новый? Вставляет ли элемент или удаляет один? Меняет ли это индексы или нет? Я не вижу, как использование цикла на основе одного не будет огромным улучшением в этой функции (и, учитывая его имя, сразу понятно).