Tengo un pequeño debate con mi amigo sobre si estas dos prácticas son simplemente dos caras de la misma moneda, o si una es realmente mejor.
Tenemos una función que toma un parámetro, completa un miembro y luego lo devuelve:
Item predictPrice(Item item)
Creo que, dado que funciona en el mismo objeto que se pasa, no tiene sentido devolver el artículo. De hecho, en todo caso, desde la perspectiva de la persona que llama, confunde las cosas, ya que podría esperar que devuelva un nuevo elemento que no lo hace.
Afirma que no hay diferencia, y que ni siquiera importaría si creara un nuevo Artículo y lo devolviera. Estoy totalmente en desacuerdo por las siguientes razones:
Si tiene múltiples referencias al elemento que pasa (o punteros o lo que sea), asignar un nuevo objeto y devolverlo es de importancia material ya que esas referencias serán incorrectas.
En lenguajes no gestionados por memoria, la función que asigna una nueva instancia reclama la propiedad de la memoria y, por lo tanto, tendríamos que implementar un método de limpieza que se llama en algún momento.
Asignar en el montón es potencialmente costoso y, por lo tanto, es importante si la función llamada lo hace.
Por lo tanto, creo que es muy importante poder ver a través de una firma de métodos si modifica un objeto o asigna uno nuevo. Como resultado, creo que como la función simplemente modifica el objeto pasado, la firma debería ser:
void predictPrice(Item item)
En cada base de código (ciertamente, bases de código C y C ++, no en Java, que es el lenguaje en el que estamos trabajando) con las que he trabajado, el estilo anterior se ha cumplido esencialmente y se ha mantenido por programadores considerablemente más experimentados. Afirma que, dado que el tamaño de mi muestra de bases de código y colegas es pequeño de todas las posibles bases de código y colegas, y por lo tanto, mi experiencia no es un verdadero indicador sobre si uno es superior.
Entonces, ¿alguna idea?
Item
es class Item ...
y no typedef ...& Item
, el local item
ya es una copia