Допустим, есть метод, который ищет авторов книг по идентификатору книги. Что следует передать в качестве параметра этому методу - только book.id (int) или целый объект книги?
Я делаю предположение, что "авторы книг" - это атрибут книги. Поэтому я представляю что-то вроде следующего класса:
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();
}
// ...
}
Учитывая экземпляр объекта Book (aBook
), для определения списка авторов я мог бы ожидать, что я могу вызвать aBook.getAuthors()
, который не требует параметров.
Я бы не одобрял создание частично созданных объектов домена. Другими словами, учитывая bookid
и ища список авторов, я бы хотел, чтобы код клиента выглядел так:
Book aBook = library.findBook(bookid);
List<Author> authors = aBook.getAuthors();
и меньше так:
Book bookQuery = new Book().setID(bookid); // partially instantiated Book
Book aBook = library.findBook(bookQuery);
List<Author> aBook = book.getAuthors();
Первая версия уменьшает количество одноразовых объектов, которые создаются клиентским кодом. (В данном случае bookQuery
, что не является настоящей книгой.)
Это также облегчает чтение кода и, следовательно, его поддержку. Это потому, что bookQuery
не делает то, что ожидал бы программист по обслуживанию. Например, я ожидал бы, что две книги с одинаковым идентификатором будут иметь одинаковое название, авторов, ISBN и т. Д. Эти утверждения не сработают для bookQuery
и aBook
.
В-третьих, он сводит к минимуму вероятность того, что когда-нибудь вы передадите недопустимый (частично созданный) объект Book методу, который ожидает настоящую книгу. Это ошибка, при которой сбой (в методе) может произойти далеко от причины (частичное создание экземпляра).