Przeciążenie lub parametry opcjonalne

10

Kiedy mam funkcję, która może otrzymać lub nie otrzymać określonego parametru, czy lepiej jest przeciążyć funkcję lub dodać opcjonalne argumenty?

Jeśli każdy ma swoje wzloty i upadki - kiedy miałbym z nich korzystać?

JNF
źródło
Z perspektywy optymalizacji lepszym rozwiązaniem jest posiadanie opcjonalnych parametrów.
Maneet Puri

Odpowiedzi:

12

Jeśli język obsługuje je poprawnie (np. Bezpieczeństwo typu, jeśli dotyczy), wolałbym opcjonalne argumenty z następujących powodów:

  • Lepiej przekazują twoją intencję, więc nikt nie podejrzewa, że ​​przeciążenie funkcji zrobi coś innego (czego i tak prawdopodobnie nie powinno).
  • Mniej kodu do utrzymania, nawet jeśli funkcja przeciąża tylko deleguje do bardziej kompleksowego. Jeśli chcesz później zmienić nazwę funkcji, masz co najmniej 3 miejsca do zrobienia (dwie definicje + jedno wywołanie).
  • Kompilator (jeśli istnieje) może generować mniejsze pliki binarne.
  • Argumenty opcjonalne skalują się lepiej, przynajmniej w niektórych językach. Co jeśli chcesz mieć 3 opcjonalne argumenty z możliwością mieszania i dopasowywania? Aby uzyskać pełną elastyczność, potrzebujesz 6 przeciążeń.
  • Jeśli jest to metoda obiektowa, wielokrotne przeciążenia znacznie utrudnią implementację zastąpień w podklasach.
Benjamin Kloster
źródło
Czy nie potrzebujesz 8? Trzy opcjonalne argumenty a, bi cma następujące możliwości: nic, a, b, c, AB, AC, BC, ABC. To jest 2^ndla różnych typów, nien!
Mark
0

Zakładając sytuację w rodzaju konstruktora: Często wybieram płynny wzorzec konstruktora, aby zapobiec sytuacjom z wieloma opcjami.

Na przykład. Ordering.natural().onResultOf(function).reverse().compound(Ordering.natural().onResultOf(function2))to przykład wywołania płynnego interfejsu konstruktora zaimplementowanego w Guava.

Oczywiście potrzebujesz teraz osobnego obiektu, aby utrzymać stan twojego konstruktora, ale zmniejszasz ogólną złożoność, oddzielając zachowanie konstruowania od zachowania konstruowanego.

Dibbeke
źródło
To nie odpowiada na pytanie.
Andy