В моей компании недавно был интерес к Service-Oriented Architecture (SOA). Всякий раз, когда я пытаюсь понять, как мы можем его использовать, я всегда сталкиваюсь с ментальным блоком. Грубо говоря:
-
Объектная ориентация говорит: "Храните данные и методы, которые управляют данными (бизнес-процессами) вместе";
-
Сервис-ориентация говорит: "Держите бизнес-процесс в сервисе и передавайте ему данные".
Предыдущие попытки разработки SOA завершили преобразование объектно-ориентированного кода в структуры данных и отдельные процедуры (службы), которые ими манипулируют, что похоже на шаг назад.
Мой вопрос: какие шаблоны, архитектуры, стратегии и т.д. позволяют SOA и OO работать вместе?
Изменить: Ответы, в которых говорится: "OO для внутренних компонентов, SOA для системных границ" являются большими и полезными, но это не совсем то, что я получаю.
Скажем, у вас есть объект Account
, который имеет бизнес-операцию под названием Merge
, которая объединяет ее с другой учетной записью. Типичный подход OO будет выглядеть следующим образом:
Account mainAccount = database.loadAccount(mainId);
Account lesserAccount = database.loadAccount(lesserId);
mainAccount.mergeWith(lesserAccount);
mainAccount.save();
lesserAccount.delete();
В то время как эквивалент SOA, который я видел, выглядит следующим образом:
Account mainAccount = accountService.loadAccount(mainId);
Account lesserAccount = accountService.loadAccount(lesserId);
accountService.merge(mainAccount, lesserAccount);
// save and delete handled by the service
В случае OO бизнес-логика (и распознавание сущности благодаря шаблону ActiveRecord) запекаются в класс Account
. В случае SOA объект Account
- это действительно просто структура, так как все бизнес-правила похоронены в службе.
Могу ли я иметь богатые функциональные классы и многоразовые службы одновременно?