#java #database #oop #clean-architecture
#java #База данных #ооп #чистая архитектура
Вопрос:
Недавно я прочитал о чистой архитектуре и пытаюсь создавать классы для объектов.
Возьмем, к примеру, YouTube. Когда я хочу отобразить имя и количество подписчиков канала YouTube (например, при просмотре списка подписок), у меня есть следующие классы:
class Channel {
private String name;
private int subscriberCount;
private List<Video> videos;
}
class Video { // data variables about Video }
Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я хочу извлечь данные канала из своей базы данных для создания объекта канала, объект канала должен содержать все видео, принадлежащие каналу. Но мне не нужно отображать список видео канала YouTube, поэтому желательно, чтобы я не хотел извлекать видеоинформацию из базы данных. (Просмотр списка из 200 подписанных каналов, каждый из которых содержит 1000 видео = 200 000 видеообъектов, которые я не использую)
Как мне моделировать мои классы, чтобы убедиться, что каждый класс содержит только ту информацию, которая мне нужна (чтобы я не тратил впустую память и вызовы БД? Я думаю (1) установить videos
значение null, или (2) создать новый класс без videos
переменной, или (3) сохранить только идентификаторы видео, чтобы переменная имела тип List<int>
.
Комментарии:
1. Ваш класс канала в порядке. Просто задайте имя и количество подписчиков в конструкторе и используйте метод set для установки списка видео. Таким образом, ваш код решает, нужен ли вам список видео.
2. @Gilbert Le Blanc Боюсь, что я случайно пытаюсь получить видео, но для некоторых каналов оно равно нулю
3. Как всегда, при разработке программного обеспечения ответ таков: это зависит . В вашем случае это зависит от того, что вам нужно сделать со списком видео. Например, нужно ли отправлять
Channel
объекты с сервера клиенту?
Ответ №1:
объект канала должен содержать все видео, принадлежащие каналу
Это не должно быть. Вы также можете определить Channel
без видео
class Channel {
private String name;
private int subscriberCount;
}
и извлекайте объекты Video
через собственные VideoRepository
.
interface VideoRepository {
public List<Video> getChannelVideos(Channel channel);
}
Тогда у вас есть полный контроль над загрузкой видео и, следовательно, потреблением памяти.
вы также можете добавить подкачку в свой репозиторий
interface VideoRepository {
public List<Video> getChannelVideos(Channel channel, int offset, int size);
}
Ответ №2:
Вы создаете Channel
класс, который выглядит следующим образом:
public class Channel {
private String name;
private int subscriberCount;
private List<Video> videos;
public Channel(String name, int subscriberCount) {
this.name = name;
this.subscriberCount = subscriberCount;
this.videos = new ArrayList<>();
}
public List<Video> getVideos() {
return videos;
}
public void setVideos(List<Video> videos) {
this.videos = videos;
}
public String getName() {
return name;
}
public int getSubscriberCount() {
return subscriberCount;
}
}
public class Video { // data variables about Video };
Создавая List
в конструкторе ofвидео, но не добавляя к List
, если вы не выполните setVideos
метод, вы никогда не получите нулевой ответ при выполнении getVideos
метода.
Вы получите пустое List
.