Перегрузка или дополнительные параметры

10

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

Если у каждого есть свои взлеты и падения - когда я буду их использовать?

ЕНФ
источник
С точки зрения оптимизации, наличие дополнительных параметров является лучшим вариантом.
Манеет Пури

Ответы:

12

Если язык поддерживает их должным образом (например, безопасность типов, если применимо), я бы предпочел необязательные аргументы по следующим причинам:

  • Они лучше передают ваше намерение, поэтому никто не подозревает, что перегрузка вашей функции будет делать что-то другое (что, вероятно, в любом случае не должно).
  • Меньше кода для обслуживания, даже если перегрузка функции делегирует только более полную. Если вы хотите переименовать функцию позже, у вас есть как минимум 3 места для этого (два определения + один вызов).
  • Компилятор (если есть) может генерировать меньшие двоичные файлы.
  • Необязательные аргументы лучше масштабируются, по крайней мере, в некоторых языках. Что если вы хотите иметь 3 необязательных аргумента с возможностью смешивать и сопоставлять? Для полной гибкости вам понадобится 6 перегрузок.
  • Если это объектный метод, многократные перегрузки сильно затруднят реализацию переопределений в подклассах.
Бенджамин Клостер
источник
Разве вам не нужно 8? Три необязательных аргумента a, bи cимеет эти возможности: ничего, а, б, в, ab, ac, bc, abc. Это 2^nдля разных типов, а неn!
Марк
0

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

Например. Ordering.natural().onResultOf(function).reverse().compound(Ordering.natural().onResultOf(function2))это пример вызова интерфейса свободно созданного, реализованного в Гуаве.

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

Dibbeke
источник
Это не отвечает на вопрос.
Энди