Скрипт транзакции — это Антипаттерн?

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

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

Что вы думаете? Согласны ли вы с тем, что сценарий транзакции является антипаттерном? Или у вас действительно есть способ разработать сценарий транзакции, который будет объектно-ориентированным, а не замаскированным процедурным? Хотя я сомневаюсь, что это возможно.


person Lord Yggdrasill    schedule 22.04.2013    source источник


Ответы (3)


Transaction Script определенно не антишаблон.

Судя по тому, что я нашел о скрипте Transaction, он вообще не объектно-ориентирован.

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

Или, как пишет Фаулер:

Когда использовать

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

Антишаблон, о котором вы можете подумать, называется Модель анемичной доменной области. Это тот случай, когда вы намереваетесь и думаете строить модель предметной области — потому что ваша предметная область достаточно сложна для этого, — но на самом деле вы в конечном итоге< /em> в скрипте транзакции - из-за плохой организации кода/слабых навыков объектно-ориентированного программирования.

person Gustin    schedule 06.05.2013
comment
То, что вы говорите, совершенно верно, но по моему опыту каждый раз, когда я сталкивался с шаблоном Transaction Script, это был полный беспорядок, созданный для компенсации анемичной модели предметной области. Назовите это чувством вины по ассоциации, но когда я вижу этот паттерн, я понимаю, что это проблема. - person HDave; 27.08.2013
comment
@HDave +1. В большинстве случаев сценарий транзакции неприменим, ИМХО, и вам лучше использовать правильную модель домена. Одним из случаев, когда сценарий транзакции подходит, может быть своего рода служба, подобная кешу, в которой хранятся только копии сущностей, чья бизнес-логика реализована в других (микро) службах. - person Gebb; 28.01.2021

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

Упомянутый вами шаблон Активная запись удобен только в том случае, если у вас есть довольно простое сопоставление объектов домена один к одному с агрегатами постоянного хранилища (таблицами СУБД).

Сопоставление данных — это что-то вроде ORM (Hibernate и подобные). Если ваша бизнес-логика находится внутри сущностей предметной области, эти сущности должны видоизменять себя. На мой взгляд, это связывает логику, которая мутирует состояние (которое присуще при использовании ORM), с самим состоянием. Проще посмотреть на модель предметной области со стороны и поместить свою бизнес-логику в сервисы (скрипты транзакций). Кроме того, если у вас большой объем бизнес-логики, сложнее найти соответствующий код, когда он разбросан по сущностям предметной области (это похоже на то, что ваши сценарии транзакций смешаны вместе).

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

person Tvaroh    schedule 14.08.2013
comment
Да, большинство корпоративных приложений, которые я видел, использовали сценарий транзакций... и почти во всех случаях он полностью исчезал, поскольку добавлялась сложность. В большинстве случаев это было из-за TS, когда всего лишь небольшой DDD решил бы столько проблем... Поэтому я ненавижу TS, потому что с него легко начать, но часто разработчики упускают момент, когда было бы необходимо. переместите бизнес-логику в модель предметной области... Я предлагаю использовать TS только в очень простых случаях где-то между CRUD и очень небольшой сложностью бизнес-логики. - person Pabzt; 07.11.2019
comment
Один миллион процентов согласен с @Pabzt. Сложность растет в приложениях. Приверженность сценарию транзакций на протяжении всего курса для меня делает его антипаттерном. Я видел проекты с сотнями сервисов и моделей, где вся логика лежит на сервисных слоях. Поместите их все в папку Service и вуаля! - person Andez; 07.06.2020
comment
Большинство корпоративных приложений, которые я видел, используют сценарии транзакций... но они не знают об этом, поэтому команды продолжают говорить о DDD. - person Carmine Ingaldi; 18.08.2020

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

Вот почему Microsoft представила async/await. Он превращает неясно выглядящий стиль отправки обратного вызова (делегата) и выхода, обработки обратного вызова в отдельном методе (обязательно) в удобочитаемый сценарий транзакции.

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

а) Неправильный сценарий транзакции — это антипаттерн. Например, один огромный метод, отсутствие или несколько вызовов метода и т. д. Разные уровни операций в одном и том же методе (рефакторинг их в методы). Отдельные шаги бизнес-процесса вместе в одном методе (разбейте их на методы или отдельные классы. Много бизнес-объектов? Используйте сервисный шаблон DDD).

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

Использование TS должно быть фрактальным, с каждым увеличением детализировать логику стиля TS. Высокий уровень: вы видите вызовы методов и использование службы DDD. средний уровень может быть чем-то вроде микса. Ниже находятся в основном вызовы методов/свойств объекта предметной области, а также мельчайшие детали логики.

Бросать TS под автобус, потому что им можно злоупотреблять, или предотвращать его использование, просто пинать банку в сторону - разработчик, который не может группировать и разделять и не знает SRP (единая ответственность) / Cohesion, испортит другие стили. , слишком. Ответ заключается в том, чтобы обучить их бизнес-процессу и привести примеры группировки и разделения, которые должны выполняться в соответствии с бизнес-/функциональными требованиями (вертикальный срез), а не с технологией (горизонтальный срез).

  1. поместите логику, которая имеет дело только с одним объектом домена или другими экземплярами его типа в DO. Не ссылайтесь на другие типы объектов из объектов домена (person.orders) и не вставляйте что-либо в объект домена (другой DO или репозиторий и т. д.). Это просто нарушает SRP. [скрипты низкоуровневых транзакций в методах]
  2. Когда вам нужно что-то вроде person.orders или вы чувствуете, что вам нужно что-то внедрить, создайте службу DDD (не сериализованную, без постоянных свойств после каждого использования). Введите, например, человека и другие коллекции (репозиторий или IQueryable и т. д.). Делай работу там. [скрипты транзакций среднего уровня здесь]
  3. объединить операции над объектами домена и DDD svcs в категории «методы приложений» служб DDD.
  4. построить и вызвать те из самого высокого уровня программы

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

Примечание. В ссылке, приведенной в другом ответе, Фаулер рассказывает вам, как сделать сценарий транзакции правильным, а не неправильным:

https://www.informit.com/articles/article.aspx?p=1398617

Он также предполагает, что это не ОО. Я думаю, вы можете скрестить его с OO и использовать плюсы TS (читабельность и сотни плюсов), а также сотни плюсов OO. Другими словами, вы можете поместить элементы TS в модель предметной области и составить использование модели предметной области в TS более высокого уровня.

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

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

person FastAl    schedule 07.10.2020
comment
То, что вы предлагаете, это чистый TS и процедурное программирование. Вы продолжаете ссылаться на объекты предметной области и DDD, но это совершенно неверно. Одна из основных идей DDD заключается в разработке на основе агрегатов, которые представляют собой граф объектов предметной области с богатым поведением, которые реализуют бизнес-логику, защищая бизнес-инварианты. Ваш совет идет вразрез с этим. Выступать за ТС нормально. Нехорошо вводить читателей в заблуждение, говоря о DO или DDD, когда все, о чем вы говорите, — это набор процедур, работающих на анемичной модели предметной области. - person Arash Shahkar; 01.05.2021
comment
SRP & Cohesion › Антипаттерн Anemic Domain. Если один объект домена «знает» о другом (я имею в виду сериализуемые/бизнес-сущности, а не объекты службы, которые объединяют несколько DO), это ослабляет сплоченность (и случаются другие плохие вещи, например, теперь вам нужно издеваться над тестированием и т. д. и т. д.). Я знаю, что целая индустрия занимается персональными заказами, и я так же, как и вы, вижу в этом привлекательность, но в 70-х они все делали GOTO. Если вы используете структуры, это анемично. Если Анемия означает нарушение SRP, то она должна уйти (или быть переопределена) как антипаттерн. DDD тоже 20 лет, он может развиваться.... - person FastAl; 18.05.2021
comment
Иерархические базы данных также когда-то были необходимы и считались удобными. Это аналогия D.O. взаимные ссылки типа person.orders. На первый взгляд кажется, что лучше жестко кодировать отношения. И это более производительно. Но, в конце концов, это не то, где более высокие затраты, и это проигрышная игра. - person FastAl; 18.05.2021