@dmytromindra
DATA
CONTEXT
INTERACTION
Дима Миндра
Lohika, Одесса
@dmytromindra
Цель – понимание DCI
@dmytromindra
@dmytromindra
Старые друзья проблемы
@dmytromindra
Проблема №1: Завершенность
Часто, разработку программного обеспечения не удается завершить. Даже после значительных допольнительных инвестиций.
@dmytromindra
Проблема №2: Дефекты
Объем работы, связанной с устранением дефектов и ошибок в «завершенном» программном продукте, необходимой для того, чтобы сделать продукт готовым к использованию часто занимает значительное количество времени. Часто это время больше чем время разработки продукта.
@dmytromindra
Проблема №3: ТребованияФункциональность программного обеспечения редко соответствует требованиям конечных пользователей.
@dmytromindra
Проблема №4: Поддержка
После создания программного обеспечения его практически невозможно поддерживать, т.к. способность разработчиков понять, что они написали быстро уменьшается с течением времени.
@dmytromindra
Проблемы
@dmytromindra
Real .NET Developer
@dmytromindra
Объектно
Ориентированный
Анализ
@dmytromindra
Вход: Проблема
Выход:
концептуальная
Модель (Domain objects,
Use cases, Interactions,
some UI mockups )
Анализ
@dmytromindra
Методы OOA
• Метод OOSA Шлеер-Меллора• Метод Коада• ОМТ• Метод Мартина Оделла и средства проектирования Ptech• Метод “класс-связь” • OSA• Метод SEOO• Метод BON• Fusion• OBA• Syntropy• MOSES• Метод Текселя (Texel)• Метод OORAS
@dmytromindra
Проектирование
Вход: концептуальная модельВыход: архитектура(дизайн)
системы
@dmytromindra
OOD
SRP — The Single Responsibility PrincipleOCP — The Open Closed PrincipleLSP — The Liskov Substitution PrincipleISP — The Interface Segregation PrincipleDIP — The Dependency Inversion PrincipleREP — The Reuse Release Equivalency PrincipleCCP — The Common Closure PrincipleCRP — The Common Reuse PrincipleADP — The Acyclic Dependencies PrincipleSDP — The Stable Dependencies PrincipleSAP — The Stable Abstractions Principle
А также DDD, Pattern Language, MVC, CQRS, Event Driven, SOA, …..
@dmytromindra
Понимани
е
@dmytromindra
Процедурная декомпозиция
Цикл
Последовательность
Выбор
A
B C
D
C1I
I1 C2 I2
@dmytromindra
Все запутано
@dmytromindra
Затем мы перешли к ООП
@dmytromindra
Наследование 80-го уровня
@dmytromindra
Опять ?
@dmytromindra
Что же делает пользователь ?Это отражено в коде ?
@dmytromindra
Мы что-то теряем
@dmytromindra
Один UseCase разнесен по
многим классам.
@dmytromindra
То, как представляет себе систему
пользователь не совпадает с тем, как она
спроектирована
@dmytromindra
Agile ценности
• Individuals and interactions
• Working software
• Customer collaboration
• Responding to change
@dmytromindra
MVC 1979
MVC улучшает восприятие
Но по-прежнему не отображает поведение
@dmytromindra
ООП фокусируется на том что
система из себя представляет.
При этом может быть совершенно не очевидно,что она делает и как ей пользоваться
@dmytromindra
Дихотомия ООП
Лексический анализ
• Существительные – классы
• Глаголы - методы
@dmytromindra
Объектное мышление
• Мы приобретаем объектное мышление от языка программирования.
• Мы ограничиваем свое восприятие ООП.
@dmytromindra
DCI
@dmytromindra
Кто виноват ?
Trygve Mikkjel Heyerdahl ReenskaugJim Coplien
@dmytromindra
Как пользователь представляет
себе это действие ?
@dmytromindra
Ментальная Модель
пользователя
Данные Роли
Взаимодействия
@dmytromindra
Простой пример
Transfer Money
User
Берем один счет,
затем берем другой счет,
определяем сумму перевода,
переводим деньги.
@dmytromindra
Данные (Data)
Account
Sav ingsAccountCheckingAccount
@dmytromindra
Роли (Interaction)
«interface»
TransferMoneySink
«interface»
TransferMoneySource
Пассивные (Methodless)
«interface»
TransferMoneySink«interface»
TransferMoneySource
TransferMoneySourceTrait
+ TransferTo() : void
Активные (methodful)
@dmytromindra
Контекст (Context)
Берем один счет,
Берем другой счет,
определяем сумму
перевода,
переводим деньги.
«interface»
TransferMoneySink
«interface»
TransferMoneySource
TransferMoneySourceTrait
+ TransferTo() : void
TransferMoneyContext
«Property»
+ TransferMoneySource
+ TransferMoneySink
+ Ammount: int
+ Execute() : void
@dmytromindra
DCI & MVC вместе
@dmytromindra
DCI – это еще одна точка зрения
@dmytromindra
Комбинируя подходы мы
получаем архитектуру системы
MVC
DCI
Domain Model
Концептуальная модель
проектирование
@dmytromindra
Время действовать
(показывать код)
@dmytromindra
Как насчет TDD
@dmytromindra
SOLID-но ?
@dmytromindra
@dmytromindra
@dmytromindra
@dmytromindra
@dmytromindra
@dmytromindra
Приправим контрактами
@dmytromindra
Do try this ;)
@dmytromindra
Links and References
http://www.artima.com/articles/dci_vision.html
http://www.leansoftwarearchitecture.com/
@dmytromindra
Source Code
https://github.com/DmytroMindra/DCI-Simple-Sample
@dmytromindra