Anemic Domain Model - антипаттерн или SOLID?

Preview:

Citation preview

Anemic Domain Model - антипаттерн или SOLID ?

Влад Клековкинглавный разработчикСпециализированная Депозитарная Компания Гарант

Rich Domain ModelФаулер рекомендуетИнкапсуляцияИнтуитивно понятнаУдобна в использованииКрасивые диаграммы

Пример RDM

Чего хочет заказчик?Меняются требованияИногда законыПоявляются исключенияСпециальные пользователиОсобые клиенты

Вносим изменения

Типичный метод

GOD Object рядом

Anemic Domain ModelАнтипаттернНе очевидна в использованииНарушение инкапсуляцииПроцедурный стильУстарело?

Пример ADM - Modelpublic class MyMegaDocument : Document, IWithStatus, IStartFinishDates, IPriceSumCount{ public string Name { get; set; } public Status Status { get; set; } public DateTime StartDate { get; set; } public DateTime FinishDate { get; set; } public decimal Price { get; set; } public decimal Count { get; set; } public decimal Summ { get; set; } ...}

interface IWithStatus{ Status Status { get; set; }}

interface IStartFinishDates{ DateTime StartDate { get; set; } DateTime FinishDate { get; set; }}

interface IPriceSumCount{ decimal Price { get; set; } decimal Count { get; set; } decimal Summ { get; set; }}

Пример ADM - Logic

Пример ADM - Logic

Инфраструктура

Конфигурируемая логика

Eдинственной обязанностиНа каждый класс должна быть возложена одна-единственная обязанность.

Открытости/закрытостиПрограммные сущности должны быть открыты для расширения, но закрыты для изменения.

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

Разделения интерфейсаМного специализированных интерфейсов лучше, чем один универсальный.

Инверсии зависимостейЗависимости внутри системы строятся на основе абстракций. Модули верхнего уровня не зависят от модулей нижнего уровня. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций

Следование SOLID

Сравнение

Recommended