У меня есть сущность:
@Entity
@Table(name = "CARDS")
public class Card {
@ManyToOne
@JoinColumn(name = "PERSON_ID", referencedColumnName = "ID", nullable = false)
private Person person;
@OneToMany(mappedBy = "card")
private List<CardStatus> cardStatuses;
И я свою службу могу назвать следующим кодом:
public Card getCardBlaBlaBla(Long id){
Card card = cardRepository.findaCard(id);
Something something = card.getCardStatuses().get(0).getSomething();
}
card.getCardStatuses().get(0).getSomething() — getCardStatuses
равно LAZY
Мои вопросы - Нарушает ли этот вызов закон Диметры?
Закон Деметры Существует хорошо известная эвристика под названием Закон Деметры2, согласно которой модуль не должен знать о внутренностях объектов, которыми он манипулирует. Как мы видели в предыдущем разделе, объекты скрывают свои данные и раскрывают операции. Это означает, что объект не должен раскрывать свою внутреннюю структуру через средства доступа, потому что это означает раскрытие, а не сокрытие своей внутренней структуры. Точнее, Закон Деметры говорит, что метод f класса C должен вызывать только методы этих:
• C • An object created by f • An object passed as an argument to f • An object held in an instance variable of C
Метод не должен вызывать методы для объектов, возвращаемых любой из разрешенных функций. Другими словами, разговаривайте с друзьями, а не с незнакомцами. Следующий код нарушает закон Деметры (среди прочего), потому что он вызывает функцию getScratchDir() для возвращаемого значения getOptions(), а затем вызывает getAbsolutePath() для возвращаемого значения getScratchDir(). final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
Card
- это структуры данных и не нарушает закон Диметры, но LAZY
метод имеет логику (сделать выбор в БД).
Нарушает ли этот вызов закон Диметры или нет? Если да, то как я могу использовать его правильно?
У меня действительно много кода, например:
entityOblect.getChield().getChield().getSomething();
ИЗМЕНИТЬ
Из книги Cleand Code:
ИЗМЕНИТЬ2
(c) Роберт С. Мартин - Чистый код
Active Record Active Records — это специальные формы DTO. Это структуры данных с общедоступными переменными (или с доступом к компонентам); но у них обычно есть методы навигации, такие как сохранение и поиск. Обычно эти активные записи являются прямыми переводами из таблиц базы данных или других источников данных. К сожалению, мы часто обнаруживаем, что разработчики пытаются обращаться с этими структурами данных как с объектами, помещая в них методы бизнес-правил. Это неудобно, поскольку создает гибрид между структурой данных и объектом. Решение, конечно, состоит в том, чтобы рассматривать Active Record как структуру данных и создавать отдельные объекты, содержащие бизнес-правила и скрывающие свои внутренние данные (которые, вероятно, являются просто экземплярами Active Record).