2013-08-07 9 views
5

każdym razem widzę metody były jednym z parametrów jest output parameter jakCzy za parametry wyjściowe uważa się złe praktyki?

void addTokenErrorsToReport(List<String> tokens, Map<String, Integer> report) 

mam wrażenie, że to jest po prostu błędne. Z mojego punktu widzenia parametry ogólnie powinny być niezmienne i niezmienione w ramach metody. Na przykład, powyższa metoda może być przepisany do

Map<String, Integer> createTokenErrorsReport(List<String tokens) 

Zwracany Map mogłyby być następnie połączyła się z oryginalnego raportu mapą.

Czy to założenie jest prawidłowe? Czy obie wersje są równie akceptowalne?

+4

Pytania oparte głównie na opiniach nie nadają się do SO. –

Odpowiedz

5

Tak jak w przypadku większości rzeczy, jest to tylko "zła praktyka", jeśli prowadzi do źle działającego/nieczytelnego/trudnego do utrzymania kodu lub jeśli nie wiesz, dlaczego to robisz.

W większości przypadków użycie parametru wyjściowego nie powoduje wystąpienia tych efektów.

W Twoim addTokenErrorsToReport z pewnością jest to odpowiednie podejście. Do raportu dodajesz błędy tokena - funkcja musi znać tokeny, które dodaje i raport, do którego dodaje. Funkcja wyraźnie wykonuje dokładnie operację, do której został zaprojektowany, bez żadnych wad.

Jeśli miałbyś zastosować metodę createTokenErrorsReport, musisz wykonać każde wywołanie, wstawiając nowe tokeny do istniejącego raportu. Jeśli dodawanie tokenów do istniejącego raportu jest typową operacją, to zdecydowanie ma sens dodawanie metody. To nie znaczy, że createTokenErrorsReport nie powinien istnieć również - jeśli tworzenie nowych raportów z listy tokenów jest typową operacją, to potrzebujesz funkcji, która to robi.

Doskonałym przykładem dobrego wykorzystania parametru wyjściowego jest Collections.sort, który sortuje listę w miejscu. Odzyskuje się wydajność tworzenia nowej kopii listy i zwracania posortowanej kopii, a jednocześnie nie ogranicza się do tworzenia kopii i sortowania kopii, jeśli chcesz.

Wystarczy użyć najlepszego narzędzia do wykonania pracy i zachować zwięzłość kodu.

0

Myślę, że to zależy od tego, skąd pochodzisz (język). Jeśli używasz do pisania c lub C++, gdzie możesz używać wskaźników jako parametrów, co jest miłe i praktyczne, możesz łatwo napisać kod taki jak twój pierwszy przykład. Naprawdę nie uważam, że jest coś dobrego lub złego, ale jak twój styl kodowania jest.

0

Widziałem tę praktykę kodowania dość często i stwierdziłem, że jest ona dość elegancka. Pozwala na "powrót" wielu obiektów.

Na przykład w powyższym przykładzie można zwrócić wartość całkowitą odpowiadającą kodowi błędu.

2

Jak dodać coś do mapy w drugim przykładzie? Myślę, że byłoby to złą praktyką, jeśli musisz podać pustą mapę, która zostanie wypełniona addTokenErrorsToReport. Ale w tym przypadku: nie, nie sądzę, że to zła praktyka. Jak zaimplementowałbyś inaczej, jeśli chcesz przetworzyć kilka List<String> tokens? Myślę, że pierwszy przykład jest prosty.

Powiązane problemy