Powiedziałbym, że trzymaj się tego, jak robiłeś to wcześniej. Liczba parametrów w twoim przykładzie nie jest duża, ale alternatywy są znacznie straszniejsze.
Mapa - jest kwestia wydajności, o której wspomniałeś, ale większy problem to:
- Dzwoniący nie wiedzą, co wysłać, nie odwołując się do czegoś
innego ... Czy masz javadoc, który dokładnie określa, jakie klucze i
wartości są używane? Jeśli to zrobisz (co jest świetne), posiadanie wielu parametrów również nie stanowi problemu.
- Bardzo trudno jest zaakceptować różne typy argumentów. Możesz ograniczyć parametry wejściowe do jednego typu lub użyć Map <String, Object> i rzutować wszystkie wartości. Obie opcje są okropne przez większość czasu.
Obiekty opakowujące - to po prostu przenosi problem, ponieważ w pierwszej kolejności musisz wypełnić obiekt opakowujący - zamiast bezpośrednio do metody, będzie to konstruktor obiektu parametru. Ustalenie, czy przeniesienie problemu jest właściwe, czy nie, zależy od ponownego wykorzystania wspomnianego obiektu. Na przykład:
Nie użyłbym tego: byłby użyty tylko raz przy pierwszym wywołaniu, więc dużo dodatkowego kodu do obsługi 1 linii ...?
{
AnObject h = obj.callMyMethod(a, b, c, d, e, f, g);
SomeObject i = obj2.callAnotherMethod(a, b, c, h);
FinalResult j = obj3.callAFinalMethod(c, e, f, h, i);
}
Może to wykorzystać: tutaj może zdziałać trochę więcej. Po pierwsze, może uwzględniać parametry dla 3 wywołań metod. może również samodzielnie wykonywać 2 inne linie ... więc w pewnym sensie staje się zmienną stanu ...
{
AnObject h = obj.callMyMethod(a, b, c, d, e, f, g);
e = h.resultOfSomeTransformation();
SomeObject i = obj2.callAnotherMethod(a, b, c, d, e, f, g);
f = i.somethingElse();
FinalResult j = obj3.callAFinalMethod(a, b, c, d, e, f, g, h, i);
}
- Wzorzec budowniczy - moim zdaniem jest to anty-wzór. Najbardziej pożądanym mechanizmem obsługi błędów jest wykrywanie wcześniej, a nie później; ale w przypadku wzorca konstruktora wywołania z brakującymi parametrami obowiązkowymi (programista nie pomyślał o ich dołączeniu) są przenoszone z czasu kompilacji do czasu wykonania. Oczywiście, jeśli programista celowo umieści wartość null lub coś podobnego w slocie, to będzie to uruchomione, ale mimo to wcześniejsze wyłapywanie błędów jest znacznie większą zaletą dla programistów, którzy odmawiają spojrzenia na nazwy parametrów wywoływanej metody. Uważam, że jest to właściwe tylko w przypadku dużej liczby parametrów opcjonalnych , a nawet wtedy korzyść jest w najlepszym przypadku marginalna. Jestem bardzo przeciwny „wzorowi” budowniczego.
Inną rzeczą, o której ludzie zapominają, jest rola IDE w tym wszystkim. Gdy metody mają parametry, środowiska IDE generują większość kodu za Ciebie, a czerwone linie przypominają Ci, co musisz podać / ustawić. Korzystając z opcji 3 ... całkowicie to tracisz. Teraz od programisty zależy, czy zrobi to dobrze, i nie ma żadnych wskazówek podczas kodowania i kompilacji ... programista musi to przetestować, aby się dowiedzieć.
Ponadto warianty 2 i 3, jeśli zostaną niepotrzebnie przyjęte szeroko, mają długoterminowe negatywne konsekwencje w zakresie utrzymania ze względu na dużą liczbę duplikatów kodu, które generuje. Im więcej kodu, tym więcej jest do utrzymania, tym więcej czasu i pieniędzy przeznacza się na jego utrzymanie.