Одна функция, которая выполняет итерацию по списку и выполняет два действия, или две функции, каждая из которых выполняет свое собственное действие и выполняет итерацию по списку отдельно? - PullRequest
0 голосов
/ 29 декабря 2018

Как видно из заголовка, какой из двух вариантов лучше?

1) Одна функция, которая перебирает список и выполняет действия A и B.

2) Два отдельныхфункции, каждая из которых выполняет свое собственное действие и выполняет итерацию по списку отдельно.

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

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

1 Ответ

0 голосов
/ 30 декабря 2018

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

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

Теперь давайте рассмотрим некоторые преимущества разбиения циклов

Больше читаемости

Одним из недостатков процедурного кода является то, что трудно узнать, какие части кода связаны, пока вы не прочитаете весь код.Поэтому, если в одном цикле есть два действия, я не знаю, связаны ли они или нет, пока я не прочитаю весь цикл.Это может очень затруднить внесение изменений.

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

Меньше локальных переменных

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

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

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

...