Я делаю базовое упражнение объектно-ориентированного дизайна для простого использования: книга может быть помечена многими тегами.
У меня много решений, и я хотел бы, чтобы ваш вклад был лучше с точки зрения принципов OOD и универсальности.
Вариант 1
public class Book {
private String title;
//... other attributes
private List<Tag> tags;
}
Меня беспокоит то, что мы смешали основные атрибуты Книги с дополнительной категоризацией или поисковыми данными. Возможно, в будущем я буду требовать, чтобы определенные Книги не могли быть помечены. В будущем класс Book может стать раздутым, когда я добавлю больше ответственности: категорию, список пользователей, которые ее читают, рейтинги...
Вариант 2
public class TaggedBook extends Book {
private Book book;
private List<Tag> tags;
}
Я думаю, что это похоже на шаблон Decorator, но я не вижу его здесь подходящим, потому что я не расширяю поведение.
Вариант 3
Разделить книги и теги полностью и использовать службу для извлечения тегов из книги (если каждая книга имеет уникальный идентификатор)
List<Tag> TagService.getTags(Book book)
Однако я не считаю это решение очень элегантным (это?), и мне, возможно, придется отправить два запроса: один для извлечения книги, другой для тегов.
Я планирую применить наилучшие варианты для других требований: Книга имеет рейтинг, книгу можно классифицировать...
Я также планирую использовать DMS для хранения объектов Books и Tags. Поскольку это не база данных отношений, его схема, скорее всего, будет соответствовать дизайну класса.
Спасибо