Разница между классом обслуживания и классом Helper [закрыто]

61

Я хотел бы знать, что отличает класс Service от служебного класса или вспомогательного класса? Класс только с базовыми методами вызывает dao's является службой? Разве использование классов Helper не нарушает SRP?

Тинтин
источник

Ответы:

75

Линии могут быть немного размытыми, но я вижу это так:

  • Сервисный класс / интерфейс предоставляет клиенту способ взаимодействия с некоторыми функциями приложения. Это, как правило, публично, с деловым смыслом. Например, TicketingServiceинтерфейс может позволить вам buyTicket, sellTicketи так далее.

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

Сервисы не просто тесно связаны с DAO, это более широкий термин / модель использования, чем постоянство

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

Мартейн Вербург
источник
25

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

Уайетт Барнетт
источник
15

Для меня я придерживаюсь определения Эрика Эванса,service который выглядит примерно так:

Как правило, в хорошо спроектированной системе большинство классов (в модели предметной области) несут достаточно четкую ответственность или функцию в том, что они имеют дело с конкретной сущностью или набором сущностей в модели.

т.е.

  • Аккаунт, Фабрика аккаунтов, Репозиторий аккаунтов и т. Д.
  • Клиент, фабрика клиентов, хранилище клиентов и т. Д.

Когда у вас есть функциональность, которая не относится к какой-либо конкретной сущности, может быть трудно найти правильное место для нее. То есть что-то, что включает в себя процесс, который включает в себя Accountи а Customer.

Итак, вот где serviceприходит. Это место, куда вы помещаете код, который находится в модели предметной области, но, естественно, не принадлежит той или иной сущности / компоненту.

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

JW01
источник
1
Вышеупомянутое определение Эрика Эвана специально для доменной службы. У DDD есть доменные сервисы, сервисы приложений, сервисы инфраструктуры и даже репозитории, которые можно рассматривать как сервисы доступа к данным.
Сонго
12

Класс обслуживания: содержит бизнес-логику.
Вспомогательный класс: этот класс является одним из типов повторно используемых компонентов.

Дирал Пандья
источник
5

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

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

Это определение немного меняется в зависимости от вашего контекста. Однако критический момент заключается в том, что термин «сервис» находится на абстрактном уровне , уровне архитектуры и предметной области . «Вспомогательный класс» - это шаблон проектирования (хотя он и является анти-шаблоном, так как они имеют тенденцию развиваться в классы BLOB-объектов или богов), относящийся к классу, который инкапсулирует общие операции (обратите внимание, что он находится на более низком уровне абстракции и связан с к знаниям приложения / решения ). Я осознаю тот факт, что почти не существует программного обеспечения, не содержащего какого-либо вспомогательного класса, но, тем не менее, это плохая практика.

ins0m
источник
4

С одной стороны, следует с осторожностью относиться к множественным определениям «обслуживания» в DDD:

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

Доменная служба: может использоваться доменом или прикладным уровнем и содержать бизнес-логику, которая не вписывается в один конкретный объект.

Служба инфраструктуры: они используются доменом для связи с внешними ресурсами.

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

Пол Т Дэвис
источник