Ответов (4)4
Мне очень нравится этот вопрос. Некоторое время я использовал инструменты ORM (Toplink, теперь eclipselink, Hibernate), и я всегда видел, как это упоминается в документах JPA, но мне это никогда не было действительно нужно. В основном моя философия заключается в том, что ORM существует только для того, чтобы вы не писали утомительный код для извлечения записей для базы данных. Это действительно огромная экономия времени и предотвращение совершения глупых ошибок. Конечно, вы можете делать с этим что-то интересное, но почему бы не сохранить его для контроллера (если вы следите за MVC), чем вставить его в модель?
Если вы пишете сложное программное обеспечение для бизнеса, оно вам необходимо.
Допустим, вы хотите продавать товары отдельным лицам или организациям. В заказе на продажу покупателем может быть тот или иной покупатель. Как это сделать без наследования?
С наследованием вы бы сделали что-то вроде этого:
@Entity
@Inheritance
public abstract class Party {
@Id
private Long id;
...
}
@Entity
public class Individual extends Party {
...
}
@Entity
public class Organization extends Party {
...
}
@Entity
public class SalesOrder {
private Party buyer;
...
}
Тогда вы сможете:
salesOrder.setBuyer(someOrganization)
или salesOrder.setBuyer(someIndividual)
Я использовал наследование с Hibernate (а некоторые с Django) и очень сожалел об этом.
Принцип «композиция важнее наследования» особенно актуален для классов предметной области. Хотя я согласен с тем, что есть несколько случаев, когда наследование имеет смысл на уровне модели, в большинстве случаев наследование дает вам очень статичную модель предметной области, где один объект не сможет перейти на другой класс.
Я также считаю, что большинству разработчиков не нравится концепция наследования на уровне базы данных, поэтому обслуживание становится более сложным.
И, наконец, есть некоторые технические проблемы, такие как прокси-серверы, установленные Hibernate, которые скроют актуальный класс объекта. Это заставляет "instance of" вести себя странно. Конечно, вы можете сказать, что «instance of» - это запах кода и, возможно, это еще один намек на то, что композиция, вероятно, является лучшим решением ...