Сервис-ориентация против Объектно-ориентированной - могут ли они сосуществовать?

StackOverflow https://stackoverflow.com/questions/442815

  •  22-07-2019
  •  | 
  •  

Вопрос

Был проявлен большой интерес к Сервис-ориентированная архитектура (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 объект - это на самом деле просто структура, поскольку все бизнес-правила скрыты в сервисе.

Могу ли я одновременно иметь богатые функциональные классы и повторно используемые сервисы?

Это было полезно?

Решение

Я действительно думаю, что SOA полезен только для внешних интерфейсов (вообще говоря, для тех, кто находится за пределами вашей компании), и даже тогда, только в тех случаях, когда производительность действительно не имеет значения, вам не нужна упорядоченная доставка сообщений.

В свете этого, я думаю, что они могут сосуществовать.Поддерживайте работу ваших приложений и обмен данными, используя философию OO, и только тогда, когда необходимы внешние интерфейсы (для третьих сторон), предоставляйте их через SOA (это не обязательно, но это один из способов).

Я действительно чувствую, что SOA используется чрезмерно, или, по крайней мере, архитектуры с SOA предлагаются слишком часто.Я действительно не знаю ни о каких крупных системах, которые используют SOA внутренне, и я сомневаюсь, что они могли бы.Это больше похоже на то, что вы могли бы просто использовать для создания мэшапов или простых запросов типа прогноза погоды, а не создавать поверх них серьезные системы.

Другие советы

Мое мнение таково, что SOA может быть полезна на макроуровне, но каждая служба, вероятно, все равно будет достаточно большой, чтобы нуждаться в нескольких внутренних компонентах.Внутренние компоненты могут извлечь выгоду из архитектуры OO.

SOA API должен быть определен более тщательно, чем внутренние API, поскольку это внешний API.Типы данных, передаваемые на этом уровне, должны быть как можно более простыми, без какой-либо внутренней логики.Если есть какая-то логика, которая относится к типу данных (напримерпроверка), предпочтительно должна быть одна служба, отвечающая за выполнение логики для данного типа данных.

SOA - это хорошая архитектура для обмена данными между системами или приложениями.

Каждое приложение определяет "сервисный" интерфейс, который состоит из запросов, которые оно будет обрабатывать, и ожидаемых ответов.

Ключевыми моментами здесь являются четко определенные сервисы с четко определенным интерфейсом.То, как на самом деле реализуются ваши сервисы, не имеет значения с точки зрения SOA.

Таким образом, вы можете свободно внедрять свои услуги, используя все новейшие технологии OO или любую другую методику, которая подходит именно вам.(Я видел крайние случаи, когда "сервис" внедряется реальными людьми, вводящими данные на экран - и все же все по-прежнему было SOA из учебника!).

Я думаю, что это неправильное понимание объектной ориентации.Даже в Java методы, как правило, не являются частью Объекты но из их класс (и даже это "членство" не обязательно для объектной ориентации, но это другой предмет).Класс - это просто описание типа, так что на самом деле это часть программы, а не данные.

SOA и OO не противоречат друг другу.Служба может принимать данные, внутренне организовывать их в объекты, работать с ними и, наконец, возвращать их в любом желаемом формате.

Я слышал, как Джеймс Гослинг говорил, что SOA можно реализовать в COBOL.

Если вы прочитаете собственное описание Алана Кея о происхождении ООП, там описывается множество маленьких компьютеров, взаимодействующих для выполнения чего-то полезного.

Рассмотрите это описание:

Ваш X должен состоять из Ys.Каждый Y должен отвечать за одну концепцию и должен быть полностью описан в терминах своего интерфейса.Один Y может попросить другого Y что-то сделать посредством обмена сообщениями (в соответствии с их указанными интерфейсами).

В некоторых случаях X может быть реализован с помощью Z, которым он управляет в соответствии со своим интерфейсом.Ни одному X не разрешен прямой доступ к Z другого X.

Я думаю, что возможны следующие замены:

Term      Programing       Architecture
----    ---------------    ------------
  X         Program           System
  Y         Objects          Services
  Z      Data structure      Database
----    ---------------    ------------
result        OOP              SOA

Если вы мыслите в первую очередь в терминах инкапсуляции, скрытия информации, слабой связи и интерфейсов черного ящика, то сходства довольно много.Если вы погрязнете в полиморфизме, наследовании и т.д.вы думаете о программировании / реализации вместо архитектуры, ИМХО.

Если вы позволяете своим службам запоминать состояние, то их можно просто рассматривать как большие объекты с возможно медленным временем вызова.

Если им не разрешено сохранять состояние, то они, как вы уже сказали, являются операторами данных.

Похоже, вы, возможно, разделяете свою систему на слишком много служб.Есть ли у вас письменные, взаимосогласованные критерии того, как разделять?

Внедрение SOA делает не подлый выбросьте все свои предметы но речь идет о разделении вашей системы на большие многоразовые блоки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top