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


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))это пример вызова интерфейса свободно созданного, реализованного в Гуаве.

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


Это не отвечает на вопрос.
Энди
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.