Вы уже получили довольно хороший совет. Вы спросили, существует ли более объектно-ориентированный подход к проблеме, поэтому я подумал, что попытаюсь пролить свет на нее. Как уже упоминал Питер на этом уровне разработки, это реализация одного метода, поэтому подход будет довольно похож, как, например, процедурный подход. В чем преимущество? Одним словом повторное использование. Если вам нужно было найти книгу по названию во многих местах, то перемещение кода в ее собственный класс поможет.
Итак, у вас есть один экземпляр Book для инкапсуляции поведения вокруг одной книги, но вы хотите иметь поведение с несколькими книгами или коллекцией книг. Вы можете хранить данные (массив книг) и метод, который их учитывает, как вы обрисовали в своей программе. Однако, если мы хотим собрать место для поведения на коллекции книг, мы можем определить новый класс. Давайте назовем это библиотекой, и мы могли бы сделать что-то вроде следующего:
public class Library {
private Book[] books;
private bookCount = 0;
public Library( int numberOfTotalBooks ) {
books = new Book[numberOfTotalBooks];
}
public boolean addBook( Book book ) {
if( bookCount < book.length ) {
books[bookCount++] = book;
return true;
}
return false;
}
public Book findByTitle( String title ) {
for( int i = 0; i < bookCount; i++ ) {
if( books[i].getTitle().equals( title ) ) {
return books[i];
}
}
// didn't find one
return null;
}
}
Итак, пара вещей, о которых нужно помнить. Во-первых, когда мы работаем с библиотекой, мы не знаем, есть ли там массив. Мы могли бы использовать массив, набор, список или базу данных (чаще всего). Дело в том, что код, вызывающий эти функции, работает только с интерфейсом библиотеки (не буквальным интерфейсом Java, а сигнатурой метода библиотеки). Также это интерфейс более высокого уровня. Нам не нужно перебирать книги, выполнять циклы, операторы if и т. Д. Мы просто вызываем метод, говорящий «Привет, найдите этот заголовок книги в библиотеке». Как это сделано, нам все равно. Это основной клиент Object Orientation, называемый инкапсуляцией, и он обманчиво силен. На самом деле речь идет о том, как мы делегируем ответственность в нашей программе и даем детали работы отдельным классам или классам. Если бы в Библиотеке были только открытые члены (например, books и bookCount) или getter / setters, то у клиента не было бы никаких преимуществ, потому что клиент все равно должен был бы выполнять всю тяжелую работу. Уловка ОО состоит в том, чтобы выяснить, что можно делегировать из объекта, не создавая проблем. Это требует практики и опыта.
Во-вторых, мы отделили презентацию от акта поиска книги. Метод, который вы написали, предполагал следующий шаг, который должен был напечатать «Эй, мы нашли это». Тем не менее, объект Library просто возвращает книгу вам, когда он ее находит, или NULL, если этого не произошло. Это позволяет печатать на консоль, отображать в графическом интерфейсе или сериализовать его в поток JSON на сервере. Акт поиска книги отделен от визуализации. Это еще один важный аспект программирования в целом, но в некоторой степени связанный с ориентацией объекта и инкапсуляцией. Обычно это называется разделением интересов. Консольное приложение заботится о поддержке пользовательского интерфейса и печати консоли. В то время как библиотека просто управляет каталогизацией и управлением коллекцией книг. То, как эти детали выполняются, не имеет значения.
В конце концов, библиотека - это класс многократного использования. Мы можем использовать его в консольном приложении, на рабочем столе, в Интернете или на сервере промежуточного программного обеспечения. Что еще более важно, мы также можем повторно использовать вызовы findByTitle или addBooks из нескольких мест в рамках одной программы. Кроме того, помещая методы с данными, мы создаем барьер для использования этой функции. Вы не можете сделать это нигде в вашей программе. Вы должны иметь ссылку на библиотеку. Если у вас нет ссылки на экземпляр библиотеки, вам не следует его вызывать. Это может быть проблематично для новых разработчиков, потому что им не хватает опыта для правильной организации своих программ, чтобы они не сталкивались с этим (тогда они начинают создавать объекты-ценности, создавать статические элементы, одиночные символы и т. Д., И все превращается в большой шарик грязи). Это обоюдоострый меч.
Еще одна вещь, которую я хотел бы отметить, это сказать, что мы хотели смоделировать две библиотеки. У нас есть библиотека в центре и в центре города, и мы хотим, чтобы люди могли проверять книги из любой библиотеки. С ОО это действительно легко представить:
Library uptown = new Library( 50 );
Library downtown = new Library( 100 );
Теперь мы можем проверять книги одного или другого. И я не использовал статику (то есть глобальные переменные), поэтому повторное использование этой логики действительно легко. Это основы ОО, так что это действительно глубокие темы. Странно, как я могу так много писать на очень простые темы. В любом случае, я надеюсь, что это помогло вам понять вашу программу немного глубже и понять, как вы можете использовать ОО, чтобы помочь вам.