В моей компании недавно проявился большой интерес к Сервис-ориентированной архитектуре (SOA). Всякий раз, когда я пытаюсь понять, как мы можем это использовать, я всегда сталкиваюсь с ментальным блоком. Грубо говоря:
Объектная ориентация гласит: «объединяйте данные и методы, которые манипулируют данными (бизнес-процессами) вместе»;
Сервис-ориентация гласит: «сохраняйте бизнес-процесс в сервисе и передавайте ему данные».
Предыдущие попытки разработки SOA заканчивались преобразованием объектно-ориентированного кода в структуры данных и отдельных процедур (сервисов), которые ими манипулируют, что кажется шагом назад.
У меня такой вопрос: Какие шаблоны, архитектуры, стратегии и т. Д. Позволяют SOA и OO работать вместе?
Редактировать: Ответы "OO для внутренних объектов, SOA для системных границ" велики и полезны, но это не совсем то, к чему я стремился.
Допустим, у вас есть объект Account
, в котором есть бизнес-операция с именем Merge
, которая объединяет его с другой учетной записью. Типичный ОО подход будет выглядеть так:
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
на самом деле представляет собой просто структуру, поскольку все бизнес-правила скрыты в службе.
Могу ли я одновременно иметь богатые функциональные классы и повторно используемые услуги?