Перевантаження або необов'язкові параметри


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))є прикладом виклику вільного інтерфейсу для побудови, реалізованого в Guava.

Звичайно, зараз вам потрібен окремий об'єкт для утримання стану вашого будівельника, але ви зменшуєте загальну складність, відокремлюючи поведінку конструкції від поведінки побудованих.


Це не відповідає на запитання.
Енді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.