ОО Дизайн / Шаблоны - Жирная Модель Против Сценария Транзакции? - PullRequest
3 голосов
/ 15 июня 2010

Хорошо, модель 'Fat' и скрипт транзакций решают проблемы проектирования, связанные с тем, где хранить бизнес-логику.Я провел некоторое исследование, и популярная мысль говорит, что использование бизнес-логики all , инкапсулированной в модель, является подходящим способом (в основном, поскольку Transaction Script может стать действительно сложным и часто приводит к дублированию кода).Однако как это работает, если я хочу использовать TDG второй Модели в моей бизнес-логике?Конечно, Transaction Script представляет собой более аккуратное, менее связанное решение, чем использование одной Модели в бизнес-логике другой?

Практический пример ...

У меня есть два класса: User & Alert.При отправке экземпляров пользователя в базу данных (например, создание новых учетных записей пользователей), существует бизнес-правило, которое требует также вставки некоторых записей предупреждений по умолчанию (например, сообщение «Добро пожаловать в систему» ​​по умолчанию и т. Д.).Я вижу здесь два варианта:

1) Добавьте это правило в качестве метода User и создайте зависимость между User и Alert (или, по крайней мере, шлюзом табличных данных Alert).

2) Используйте скрипт транзакции, который позволяет избежать зависимости между моделями.(Кроме того, это означает, что бизнес-логика хранится в «нейтральном» классе и легко доступна для Alert. Это, вероятно, не так уж важно здесь).

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

Ответы [ 3 ]

2 голосов
/ 15 июня 2010

рассмотрите возможность переноса некоторой части бизнес-логики на уровень обслуживания

1 голос
/ 15 июня 2010

Для простых приложений с небольшой бизнес-логикой используйте Transaction Script.Это просто (так как каждый сценарий обычно сопоставляется с вариантом использования программного обеспечения) и легко реализуемо (например, вам не придется иметь дело со сложным сопоставлением ИЛИ, как в случае модели с расширенным доменом).На самом деле, затрачивая много времени на создание богатой модели ОО для простых приложений, для меня это акт чрезмерного проектирования.

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

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

0 голосов
/ 15 июня 2010

Зависит от сложности. Как говорит Буу, это зависит от сложности вашего приложения. TS быстрый и грязный - это может быть все, что вам нужно для этой конкретной работы. Сказав это, IME, чем больше кода вы пишете для решения насущной проблемы, тем больше кода привязывается к приложению и увеличивает ваши затраты на повторный факторинг на более позднем этапе, что, в свою очередь, снижает вероятность выполнения этой задачи. В долгосрочной перспективе это может сделать ваш код грязным.

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

...