Аспектно-ориентированное программирование в мире ООП - нарушение правил - PullRequest
2 голосов
/ 18 июня 2010

Когда я работал над проектом веб-сайта asp.net mvc, я исследовал различные подходы к валидации. Некоторые из них были валидацией DataAnotation и блоком валидации. Они используют атрибуты для настройки правил проверки. Как это:

[Required]
public string Name {get;set;}

Меня смутило, как этот подход сочетается с SRP (принципом единой ответственности) из мира ООП. Также мне не нравится какая-либо бизнес-логика в бизнес-объектах, я предпочитаю модель «плохих бизнес-объектов», но когда я украшаю свои бизнес-объекты атрибутами проверки для реальных требований, они становятся некрасивыми (имеет много атрибутов / с логикой локализации и скоро).

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

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

Вы думаете, что атрибуты не нарушают srp, или вы просто игнорируете это и думаете, что это самый простой, не худший способ?

P.S. Я читаю несколько подобных статей и обсуждений, и я просто хочу навести порядок.

P.P.S. извините за мой "свободный" английский: =)

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

Ответы [ 2 ]

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

AOP сам по себе не нарушает никаких правил SOLID, особенно SRP.

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

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

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

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

Раньше я использовал проверяющие геттеры и сеттеры, и это была ужасная идея.

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

...