Sto discutendo un po 'con il mio amico sul fatto che queste due pratiche siano solo due facce della stessa medaglia, o se una sia veramente migliore.
Abbiamo una funzione che accetta un parametro, ne compila un membro e poi lo restituisce:
Item predictPrice(Item item)
Credo che siccome funziona sullo stesso oggetto stesso che è passato, non ha senso continuare a restituire l'oggetto. In effetti, se mai, dal punto di vista del chiamante, confonde le cose come ci si potrebbe aspettare che restituisca un elemento nuovo che non è così.
Afferma che non fa alcuna differenza, e non avrebbe nemmeno importanza se creasse un nuovo oggetto e lo restituisse. Non sono assolutamente d'accordo, per i seguenti motivi:
-
Se hai più riferimenti all'elemento che passa (o puntatori o qualsiasi altra cosa), l'allocazione di un nuovo oggetto e il suo ritorno sono di importanza rilevante in quanto tali riferimenti non saranno corretti.
-
Nei linguaggi gestiti non a memoria, la funzione che assegna una nuova istanza rivendica la proprietà della memoria, e quindi dovremmo implementare un metodo di pulizia che viene chiamato ad un certo punto.
-
L'allocazione sull'heap è potenzialmente costosa, pertanto è importante sapere se la funzione chiamata lo fa.
Quindi, credo che sia molto importante poter vedere attraverso una firma dei metodi se modifica un oggetto o ne assegna uno nuovo. Di conseguenza, credo che la funzione modifichi semplicemente l'oggetto passato, la firma dovrebbe essere:
void predictPrice(Item item)
In ogni base di codice (ammettiamolo codeb C e C ++, non Java, che è la lingua in cui stiamo lavorando) con cui ho lavorato, lo stile di cui sopra è stato essenzialmente rispettato e tenuto da programmatori considerevolmente più esperti. Egli sostiene che, dal momento che la mia dimensione campionaria di codebase e colleghi è piccola rispetto a tutti i possibili codebase e colleghi, e quindi la mia esperienza non è un vero indicatore se uno è superiore.
Quindi, qualche idea?