Каков путь наименьшего зла при работе с полиморфизмом и наследованием типов сущностей в сервис-ориентированной архитектуре?
Принцип SOA (как я понимаю) состоит в том, чтобы иметь классы объектов как простые конструкторы данных, лишенные какой-либо бизнес-логики. Вся бизнес-логика содержится в узкополосных, слабосвязанных сервисах. Это означает, что реализация служб настолько мала, насколько это возможно, способствует ослаблению связи и означает, что сущности избегают знать о каждом поведении, которое система может выполнять на них.
Из-за того, что Java довольно затруднительное решение использовать объявленный тип при принятии решения о том, какой перегруженный метод использовать, любое полиморфное поведение в реализациях сервисов вместо этого заменяется рядом проверка условных выражений object.getClass()
или использование instanceof
. Это кажется довольно отсталым в ООПЛ.
Является ли использование условных обозначений принятой нормой в SOA? Следует ли отказаться от наследования в сущности?
UPDATE
Я определенно подразумеваю перегрузку, а не переопределение.
Я определяю SOA, чтобы это означало, что поведение системы сгруппировано по использованию в интерфейсах, а затем логика для них реализуется в одном классе для каждого интерфейса. Поскольку такой класс сущности (скажем Product
) становится не чем иным, как POJO с геттерами и сеттерами. Это абсолютно не должно содержать никакой бизнес-логики, связанной с сервисом, потому что тогда вы вводите один фокус связи, в соответствии с которым класс сущности должен знать обо всех бизнес-процессах, которые могут когда-либо работать на нем, полностью отрицая цель слабосвязанного SOA.
Итак, если вы не должны встраивать поведение бизнес-процесса в класс сущности, нельзя использовать полиморфизм с этими классами сущностей - для переопределения поведения нет никакого поведения.
ОБНОВЛЕНИЕ 2
Вышеописанное поведение объясняется более просто, так как перегруженный путь выбирается в время компиляции и переопределенный путь в время выполнения.
Было бы плохой практикой иметь подкласс вашей реализации сервиса для каждого подтипа класса модели домена, на котором он действует, и как люди могут обойти проблему перегрузки при компиляции?