функции по сравнению с повторным кодом

Я пишу некоторый код PHP для создания PDFs пользующийся библиотекой FPDF. И я в основном использую те же 4 строки кода для печати каждой строки документа. Я задавался вопросом, который более эффективен, повторяя эти 4 строки много раз, или был бы, превращая его в функцию быть лучше? Мне любопытно, потому что такое чувство, что функция имела бы большие издержки, потому что функция только будет 4 строками долго.

Код, который я подвергаю сомнению, похож на это:

$pdf->checkIfPageBreakNeeded($lineheight * 2, true);
$text = ' label';
$pdf->MultiCell(0, $lineheight, $text, 1, 'L', 1);
$text = $valueFromForm;
$pdf->MultiCell(0, $lineheight, $text, 1, 'L');
$pdf->Ln();
8
задан cskwrd 2 August 2010 в 13:22
поделиться

8 ответов

Это должно дать ответ: http://en.wikipedia.org/wiki/Don%27t_repeat_yourself и http://www.codinghorror.com/blog/2007/03/curlys-law-do-one-thing.html

Закон Керли «Делай одно дело» - это отражено в нескольких основных принципах современной разработки программного обеспечения:

  • Не повторяйтесь

    Если у вас есть несколько способов выразить одно и то же, в какой-то момент два или три разных представления, скорее всего, упадут не в ногу друг с другом. Даже если они этого не делают, вы гарантируете себе головная боль поддержания их параллельно всякий раз, когда изменение имеет место. И произойдут изменения. Не надо повторяться важно, если вы хочу гибкость и ремонтопригодность программное обеспечение.

  • Один раз и только один раз

    Каждое объявление поведения должно происходить один раз и только однажды. Это одна из главных целей, если не основная цель, то при рефакторинге код. Цель дизайна - исключить дублированные декларации поведения, обычно путем их слияния или замены несколько похожих реализаций с объединяющая абстракция.

  • Единая точка истины

    Повторение ведет к непоследовательности и к коду, который неявно сломано, потому что вы изменили только некоторые повторения, когда вам нужно было изменить все они. Часто это также означает, что вы не продумали как следует организация вашего кода. Любой когда вы видите повторяющийся код, это знак опасности. Сложность - это цена; не платите дважды.

16
ответ дан 5 December 2019 в 04:36
поделиться

Мне интересно, потому что кажется, что функция будет иметь большие накладные расходы потому что функция будет всего 4 строк.

Вот откуда берутся спагетти.

Определенно инкапсулируйте это в функцию и вызывайте ее. Накладные расходы, которых вы боитесь, - это худший вид преждевременной оптимизации.

DRY - Don't Repeat Yourself.

11
ответ дан 5 December 2019 в 04:36
поделиться

Функция, безусловно, предпочтительнее, особенно если вам нужно вернуться позже, чтобы внести изменения.

2
ответ дан 5 December 2019 в 04:36
поделиться

Не беспокойтесь о накладных расходах; беспокойтесь о себе, который через год будет пытаться отладить это.

В свете вышесказанного, не повторяйтесь и сделайте крошечную функцию.

2
ответ дан 5 December 2019 в 04:36
поделиться

В дополнение ко всем ценным ответам на гораздо более важную тему ремонтопригодности; Я хотел бы добавить кое-что по вопросу о накладных расходах.

Я не понимаю, почему вы опасаетесь, что четырехстрочная функция будет иметь большие накладные расходы.

  1. В скомпилированном языке хороший компилятор, вероятно, все равно сможет встроить его, если это необходимо.

  2. В интерпретируемом языке (таком как PHP) интерпретатор должен анализировать весь этот повторяющийся код каждый раз, когда он встречается, во время выполнения . На мой взгляд, это говорит о том, что повторение может иметь еще большие накладные расходы, чем вызов функции.

  3. Беспокойство по поводу накладных расходов на вызов функций здесь - ужасно преждевременная оптимизация. В подобных вопросах единственный способ узнать, что быстрее, - это профилировать его.

Заставьте это работать, сделайте это правильно, сделайте это быстро. В этой последовательности.

1
ответ дан 5 December 2019 в 04:36
поделиться

Накладные расходы на самом деле очень малы и не будут иметь большого значения для вашего приложения. Вы бы предпочли эти небольшие накладные расходы, но иметь более простую программу в обслуживании, или вы хотите сэкономить одну миллисекунду, но потребуются часы, чтобы исправить небольшие повторяющиеся изменения.

Если вы спросите меня или другого разработчика, нам определенно нужен 1-й вариант. Так что продолжайте с функцией. Возможно, вы не поддерживаете код сегодня, но когда вы это сделаете, вы возненавидите себя за попытку сэкономить эти миллисекунды

0
ответ дан 5 December 2019 в 04:36
поделиться

Сделайте это функцией. Накладные расходы на вызов функций в наши дни довольно малы. В общем, вы сможете сэкономить гораздо больше времени, найдя лучшие высокоуровневые алгоритмы, чем возиться с такими низкоуровневыми деталями. И сделать и поддерживать его правильным намного проще с такой функцией. Ибо какая польза человеку, если он немного наберет скорость и потеряет правильность своей программы?

4
ответ дан 5 December 2019 в 04:36
поделиться

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

Написать функцию гораздо проще.

12
ответ дан 5 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: