Ich habe eine kleine Debatte mit meinem Freund darüber, ob diese beiden Praktiken nur zwei Seiten derselben Medaille sind oder ob eine wirklich besser ist.
Wir haben eine Funktion, die einen Parameter nimmt, einen Member davon ausfüllt und ihn dann zurückgibt:
Item predictPrice(Item item)
Ich glaube, dass es keinen Sinn macht, das Objekt zurückzugeben , da es mit demselben Objekt funktioniert , das übergeben wird. Aus Sicht des Anrufers ist dies eher verwirrend, da Sie davon ausgehen können, dass ein neues Objekt zurückgegeben wird, das dies nicht tut.
Er behauptet, dass es keinen Unterschied macht, und es wäre nicht einmal wichtig, wenn es einen neuen Gegenstand erschaffen und diesen zurückgeben würde. Ich stimme aus folgenden Gründen überhaupt nicht zu:
Wenn Sie mehrere Verweise auf das Element haben, das übergeben wird (oder Zeiger oder was auch immer), ist es von wesentlicher Bedeutung, ein neues Objekt zuzuweisen und zurückzugeben, da diese Verweise falsch sind.
In nicht speicherverwalteten Sprachen beansprucht die Funktion, die eine neue Instanz zuweist, den Besitz des Speichers, und daher müssten wir eine Bereinigungsmethode implementieren, die irgendwann aufgerufen wird.
Das Zuweisen auf dem Heap ist möglicherweise teuer, und daher ist es wichtig, ob die aufgerufene Funktion dies tut.
Daher halte ich es für sehr wichtig, über eine Methodensignatur erkennen zu können, ob ein Objekt geändert oder ein neues zugewiesen wird. Aus diesem Grund glaube ich, dass die Signatur lauten sollte, da die Funktion lediglich das übergebene Objekt ändert:
void predictPrice(Item item)
In jeder Codebasis (zugegebenermaßen in C- und C ++ - Codebasen, nicht in Java, der Sprache, in der wir arbeiten), mit der ich gearbeitet habe, wurde der obige Stil im Wesentlichen eingehalten und von wesentlich erfahreneren Programmierern eingehalten. Er behauptet, dass meine Stichprobengröße von Codebasen und Kollegen von allen möglichen Codebasen und Kollegen klein ist und daher meine Erfahrung kein wahrer Indikator dafür ist, ob man überlegen ist.
Also irgendwelche Gedanken?
Item
ist class Item ...
und nicht typedef ...& Item
, ist die lokale item
bereits eine Kopie