Mam trochę dyskusji z przyjacielem, czy te dwie praktyki są tylko dwiema stronami tej samej monety, czy też jedna z nich jest naprawdę lepsza.
Mamy funkcję, która pobiera parametr, wypełnia jego element członkowski, a następnie zwraca go:
Item predictPrice(Item item)
Uważam, że ponieważ działa na tym samym przekazywanym obiekcie, nie ma sensu zwracać przedmiotu. W rzeczywistości, jeśli cokolwiek, z perspektywy dzwoniącego, myli sprawy, ponieważ można oczekiwać, że zwróci nowy przedmiot, którego nie ma.
Twierdzi, że to nie robi różnicy, i nie miałoby to nawet znaczenia, gdyby stworzył nowy przedmiot i zwrócił go. Zdecydowanie się nie zgadzam z następujących powodów:
Jeśli masz wiele odniesień do przekazywanych elementów (lub wskaźników lub cokolwiek innego), przydzielenie nowego obiektu i zwrócenie go ma istotne znaczenie, ponieważ odniesienia te będą niepoprawne.
W językach, które nie są zarządzane, funkcja alokująca nową instancję twierdzi, że jest właścicielem pamięci, a zatem musielibyśmy zaimplementować metodę czyszczenia, która jest w pewnym momencie wywoływana.
Przydział na stercie jest potencjalnie drogi, dlatego ważne jest, czy wywoływana funkcja to robi.
Dlatego uważam, że bardzo ważne jest, aby móc zobaczyć za pomocą sygnatury metod, czy modyfikuje obiekt, czy przydziela nowy. W rezultacie uważam, że ponieważ funkcja modyfikuje jedynie przekazywany obiekt, sygnatura powinna być:
void predictPrice(Item item)
W każdej bazie kodu (co prawda bazach C i C ++, nie Java, w której pracujemy), z którymi pracowałem, powyższy styl był zasadniczo przestrzegany i utrzymywany przez znacznie bardziej doświadczonych programistów. Twierdzi, że ponieważ moja próbka baz kodów i współpracowników jest niewielka ze wszystkich możliwych baz kodów i współpracowników, a zatem moje doświadczenie nie jest prawdziwym wskaźnikiem tego, czy ktoś jest lepszy.
Jakieś myśli?
Item
jest class Item ...
i nie typedef ...& Item
, lokalny item
jest już kopią