Digamos que hay un método que busca autores de libros por ID de libro. ¿Qué se debe pasar como parámetro para dicho método, solo book.id (int) u objeto de libro completo?
Estoy asumiendo que "autores de libros" es un atributo de un libro.Por lo tanto, me imagino algo parecido a la siguiente clase:
class Book {
private int id;
private List<Author> authors;
// ... maybe some other book information
public int getID() {
return this.id
}
public void setID(int value) {
this.id = value
}
public List<Author> getAuthors() {
return this.authors.clone();
}
// ...
}
Dado un objeto instanciado libro (aBook
), para determinar la lista de autores, yo esperaría que puedo llamar aBook.getAuthors()
, que no requiere ningún parámetro.
No recomendaría la creación de objetos de dominio parcialmente instanciados. En otras palabras, dado un bookid
, y en busca de una lista de autores, me gustaría que el código de cliente para buscar la misma familia:
Book aBook = library.findBook(bookid);
List<Author> authors = aBook.getAuthors();
y menos como esto:
Book bookQuery = new Book().setID(bookid); // partially instantiated Book
Book aBook = library.findBook(bookQuery);
List<Author> aBook = book.getAuthors();
La primera versión reduce la cantidad de objetos desechables creados por el código del cliente. (En este caso, bookQuery
, que no es un libro real.)
También hace que el código sea más fácil de leer y, por lo tanto, de mantener. Esto se debe a que bookQuery
no está haciendo lo que el programador de mantenimiento esperaría. Por ejemplo, esperaría que dos libros con el mismo ID tengan el mismo título, autores, ISBN, etc. Estas afirmaciones fallarían en bookQuery
y aBook
.
En tercer lugar, minimiza la posibilidad de que algún día pase un objeto de libro no válido (parcialmente instanciado) a un método que está esperando un libro real. Este es un error donde la falla (en el método) puede ocurrir lejos de la causa (la instanciación parcial).
He eliminado mi propia publicación y la recomiendo porque veo que el título de la pregunta hace que mi respuesta anterior sea incorrecta. – David
No creo que esto sea correcto. Ciertamente hay varias reglas que se aplican aquí. (Consulte la respuesta tardía para más detalles.) – alphazero