Насколько важно сделать уровень обслуживания?

68

Я начал создавать приложение в 3 слоя (DAL, BL, UI) [оно в основном обрабатывает CRM, некоторые отчеты о продажах и инвентарь].

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

Лично у меня такое ощущение, что это просто усложняет ситуацию, и я не вижу в этом особой пользы, которая бы это оправдывала.

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

Я пытался гуглить на нем, но я все еще в замешательстве и не могу решить, что делать.

BornToCode
источник

Ответы:

58

Книга Мартина Фаулера «Образцы архитектуры предприятия» гласит:

Легче всего ответить на вопрос, вероятно, когда им не пользоваться. Скорее всего, вам не нужен сервисный уровень, если бизнес-логика вашего приложения будет иметь только один тип клиента - скажем, пользовательский интерфейс - и его ответы в сценариях использования не включают несколько транзакционных ресурсов. [...]

Но как только вы представляете второй тип клиента или второй транзакционный ресурс в ответах на варианты использования, он платит за разработку на уровне обслуживания с самого начала.

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

С CRM, Sales and Inventory будет много вариантов использования CRUD-типа, почти всегда однозначно соответствующих операциям уровня сервиса. Ответы на создание, обновление или удаление объекта домена должны координироваться и передаваться атомарно с помощью операций сервисного уровня.

Еще одним преимуществом наличия сервисного уровня является то, что он может быть разработан для локального или удаленного вызова, или для того и другого, и дает вам гибкость для этого. Шаблон закладывает основу для инкапсулированной реализации бизнес-логики приложения и последовательного вызова этой логики различными клиентами. Это означает, что вы также уменьшаете / удаляете дублирование кода, поскольку ваши клиенты используют одни и те же общие службы. Вы также можете потенциально снизить затраты на обслуживание - поскольку при изменении вашей бизнес-логики вам (как правило) нужно менять только услугу, а не каждого из клиентов.

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

Deco
источник
2
Интересно, что Мартин Фаулер выступает против одного и того же интерфейса для локального и удаленного вызова, утверждая, что огромная разница в производительности при удаленном вызове вынуждает более грубый интерфейс.
PSR
Я не совсем понял ваш абзац With CRM, Sales and Inventory there will be a lot of CRUD-type use cases of which there is almost always a one-to-one correspondence with Service Layer operations- если речь идет о нескольких интерфейсах, так как же сюда входит CRUD? И если бы мне не понадобилось несколько пользовательских интерфейсов, даже если CRUD хорошо сочетается со службами, я все равно не сделал бы уровень обслуживания, если бы я правильно понял, и я действительно надеюсь, что сделал это, потому что я предпочитаю делать вещи простыми (уровень обслуживания - это
путай
4
В этих случаях редко, чтобы был только один клиент, который мог бы воспользоваться этим. Если у вас был только один пользовательский интерфейс, я мог бы подумать о двух причинах, по которым вам все еще может потребоваться уровень обслуживания: безопасность и возможность повторного использования. Типичная настройка предприятия будет иметь приложение UI доступным для внешних клиентов, а уровень обслуживания будет доступен только в сети. Таким образом, веб-сервер переносит работу в заблокированную часть вашей сети. В примере продаж вы можете использовать повторно, если вы берете продажи со своего веб-сайта и переходите на eBay или Amazon. Теперь у вас есть один пользовательский интерфейс, но несколько клиентов.
Фил Паттерсон
5
Просто чтобы добавить к комментарию от @PhilPatterson. Несколько клиентов не просто должны быть на основе пользовательского интерфейса. Подумайте о веб-сервисах или библиотеках - они также могут быть клиентами. Ваш интерфейсный пользовательский интерфейс может использовать сервисный уровень, а также программные сервисы, которые вы упаковываете, и позволить кому-то другому использовать.
Деку
Можете ли вы привести пример уровня обслуживания?
user962206
34

Добавление сервисного уровня, потому что вы оценили идею и пришли к выводу, что лучший подход: хорошо

Добавление сервисного слоя, потому что это то, что делают все классные дети: плохо

Если твоя интуиция говорит, что она тебе не нужна, не делай этого.

Одно из самых разочаровывающих событий в мире программирования за последние 10 лет - это то, что он стал раздражающе ориентированным на моду, когда люди следят за трендами и моделями, как будто они были в этом сезоне. Не попадитесь в эту ловушку. Потому что в следующем сезоне «все» скажут вам, что вы должны были спроектировать это по-другому.

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

GrandmasterB
источник
27
Это вообще не затрагивает предмет, а просто дает общее представление о методах разработки, которые после замены нескольких слов могут относиться практически к любому вопросу на этом сайте. Прочитав этот ответ, я даже не уверен , что вы точно знаете , какой уровень услуг является .
Aaronaught
12
Это, конечно, может быть применено к другим вопросам ... не делает его менее верным. Фактом является то, что ни у вас, ни у меня нет никакого необходимого контекста, чтобы заявить, что ему нужно в его проекте, поэтому сказать ему, что он ему нужен, или нет, он просто бесполезное и непрофессиональное предположение. Здесь ОП нуждается в некоторой моральной поддержке для принятия правильных решений.
GrandmasterB
5
@Aaronaught Независимо от правильности ответа, он по-прежнему по существу отвечает на главный вопрос: «Насколько важен уровень обслуживания?». Он утверждает, что вовсе не существенен и что это, возможно, просто причуда. Если вы не согласны с ответом, тогда, пожалуйста, понизьте.
maple_shaft
2
@GrandmasterB Я бы сказал, что мода хороша в разработке программного обеспечения. Большинство разработчиков слишком свежи или некомпетентны, чтобы принимать взвешенные решения по дизайну и архитектуре. Мы по-прежнему ожидаем, что они получат некоторое подобие работающего программного обеспечения, поэтому они прыгают на широкую ногу и согласны с неудачным выбором дизайна, гораздо предпочтительнее и более удобны в обслуживании, чем то, что было сделано несколько лет назад, когда мы ковбоем кодировали бы все, что они не поняла или не оценила.
maple_shaft
10
@maple_shaft Просто чтобы уточнить, я не говорю, что сервисные уровни - это увлечение. Я говорю, основываясь на пути был задан вопрос, что, кажется , есть чудаковатая / мода / подножка поведение со стороны своих коллег , чтобы подтолкнуть его в использовании архитектуры он не думает это warrented в его проекте. Я ясно заявляю в своем ответе, что рассматриваю сервисные уровни (или любые другие концепции) как просто нейтральные концепции, пригодность которых следует оценивать с учетом их собственных достоинств для отдельных проектов. Они не должны применяться / использоваться, если по собственному мнению они не нужны.
GrandmasterB
22

Есть много факторов, которые влияют на решение о создании сервисного уровня. Я создал сервисные слои в прошлом по следующим причинам.

  1. Код, который должен быть повторно использован несколькими клиентами.
  2. Сторонние библиотеки, на которые у нас ограниченные лицензии.
  3. Третьи стороны, которым нужна точка интеграции в нашу систему.
  4. Централизация дублированной бизнес-логики.

Случай 1: вы создаете базовую функциональность, которая должна использоваться множеством разных клиентов. Сервисный уровень обеспечивает функциональность для разных клиентов, чтобы использовать предоставленные вами функции прямо из коробки.

Случай 2. Обычно вы размещаете код в пространстве приложения, но используете стороннюю библиотеку, для которой у вас ограниченные лицензии. В этом случае у вас есть ресурс, который вы хотели бы использовать везде, но только ограниченное их количество. Если вы размещаете его за службой, тогда вся ваша организация может использовать его в своих приложениях, не покупая лицензию для каждого отдельного хостинга.

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

Случай 4: Вы проанализировали свой код в масштабах предприятия и обнаружили, что отдельные команды создали одно и то же (просто реализовали его немного по-разному). С сервисным уровнем вы можете выбрать лучший подход (ы), и теперь вы можете реализовать процесс одинаково для всех команд, заставив их обратиться в сервис. Еще одним преимуществом централизации логики является обнаружение ошибок. Теперь вы можете развернуть исправление один раз, и все клиенты одновременно получат выгоду.

Все это при том, что есть потенциальные негативы для уровня обслуживания.

  1. Добавляет сложность системы. Если раньше у вас было только одно приложение для отладки, теперь у вас есть два. Производственные проблемы требуют проверки настроек клиентских приложений, настроек сервисных приложений или проблем связи между правильной настройкой клиентских и серверных приложений. Это может быть сложно, если вы никогда не делали этого раньше.
  2. Одна точка отказа. Если у вас есть перерыв в обслуживании, все клиенты будут затронуты. Когда код не развернут таким образом, риск может быть меньше (хотя есть способы смягчить это).
  3. Управление версиями может быть сложнее. Когда у вас есть одно приложение, использующее службу, развертывание интерфейса может быть изменено одновременно между ними. Когда у вас есть несколько клиентов, вы должны управлять тем, кто на V1, кто на V2, и координировать удаление V1 (как только вы узнаете, что все обновились до V2).

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

Фил Паттерсон
источник
2
+1 Спасибо за информативный ответ. У меня действительно были сомнения, погоду принять ваш ответ или ответ Деку. В конце концов, потому что я не слишком опытен, я решил выбрать ответ, который получает большинство голосов. Я все еще чувствую, что ваш ответ заслуживает большего количества голосов. В любом случае я действительно ценю, что вы поделились своими знаниями и опытом. Спасибо!
BornToCode
1
Пожалуйста! Основной момент, который следует исключить из обоих ответов, заключается в том, что речь идет (главным образом) о решении проблем обслуживания с наличием нескольких клиентов, которым необходимо выполнять одно и то же. Чем больше клиентов воспользуется услугой, тем больше вы получите поддержку.
Фил Паттерсон
1
Существует также безопасность - сервисные уровни могут предоставить хакерам еще одну стену для взлома, чтобы добраться до сокровищ в БД. Отсутствие сервисных уровней, возможно, является причиной того, что так много веб-сайтов получают огромные нарушения, а сервис в середине, хакеры будут получать значительно меньше данных, прежде чем они будут обнаружены.
gbjbaanb
6

Большинство сервисных уровней, которые я видел, - полный беспорядок. Услуги, как правило, имеют много разных методов, 1500 LOC не редкость. Различные методы не имеют ничего общего, но делятся кодом. Это приводит к высокой сцепленности , низкой когезии . Это также нарушает OCP , потому что каждый раз, когда требуется новая операция, вы должны модифицировать код, а не расширять базу кода. Хорошо сконструированный сервисный уровень теоретически возможен, но я никогда не видел его на практике.

CQRS решает эти проблемы и не позволяет создавать один из этих процедурных уровней обслуживания.

Йерун
источник
2
Хорошо построен по чьим стандартам, хотя? Конечно, по стандартам ОО интерфейс сервисного уровня - это полная путаница. С функциональной или процедурной точки зрения, это поощряет красивый многоуровневый дизайн. Я думаю, что самая большая проблема, с которой сталкиваются люди с уровнями обслуживания, заключается в том, что они поощряют приложение, основанное на транзакциях без сохранения состояния, и препятствуют чисто объектно-ориентированному подходу. Я могу понять обе стороны аргумента.
maple_shaft
6

Добавление интерфейса (сервисный уровень является типом интерфейса) требует времени. Хороший занимает много времени для разработки и тестирования. Очень важно сделать это правильно с первой попытки, потому что изменение этого позже ломает всех клиентов. Кроме того, учтите, что вы, вероятно, не будете знать, что должно быть в этом интерфейсе, пока у вас не появится второй клиент с немного другими потребностями. Поддержание сервиса - это бесконечный проект сам по себе.

В большинстве организаций, если вы обращаетесь к своему бизнес-спонсору и спрашиваете его: «Хотите ли вы, чтобы другие отделы пользовались (повторно использовали) этой системой, которую мы разрабатываем, с вашим бюджетом?» они будут смеяться над тобой. Сначала заставьте его работать для вашего бизнес-спонсора, а затем начните с повторного использования этого кода (в свободное время вашего отдела).

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

PS Если вы работаете на Java, у Джошуа Блоха есть много фантастических советов по интерфейсу в его книге «Эффективная Java».

GlenPeterson
источник
Отличный ответ без стерильных теорий.
Данило
2

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

DAL, BL и UI / Controller - хорошая комбинация для разработки приложения. Если вы планируете использовать один пользовательский интерфейс, нет необходимости готовить дополнительный слой. Включение еще одного слоя в приложение только увеличивает время разработки.

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

Переполнение стека: обсуждение шаблона уровня обслуживания

Сатиш Пандей
источник
Итак, вы предлагаете, чтобы в каждой сложной прикладной разработке он использовал сервисный уровень, а не просто соглашался на уровни DAL, BL, UI?
BornToCode
В случае нескольких пользовательских интерфейсов мы должны включить уровень обслуживания. В вашем случае я не думаю, что нужно готовить новый слой. Это только увеличивает сложность приложения.
Сатиш Пандей
0

Я бы поспорил, что ваш BL - это ваш уровень обслуживания Центральное место, где сидит ваша бизнес-логика. Это должна быть библиотека DLL, которая может использоваться всем, кому нужна эта логика. Затем вы можете поместить слой веб-API поверх этого, если ваше приложение будет иметь другой пользовательский интерфейс.

user441521
источник