Синяя Борода. История одного проекта
TRANSCRIPT
![Page 1: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/1.jpg)
Синяя Борода. История одного проекта
Андрей МайоровBYTE-force
twitter.com/xorets
![Page 2: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/2.jpg)
Agenda
• Детали проекта• В чем сложности?• Почему так получилось?• Как исправлять ситуацию?
![Page 3: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/3.jpg)
http://www.flickr.com/photos/lofink/4501610335/
![Page 4: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/4.jpg)
Использование и развитие
• Используется в наших веб-проектах• Развивается по остаточному
принципу
![Page 5: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/5.jpg)
История развития
XML + XSLT + Transformation script, Classic ASP, JS Scriptlets, MS SQL, Stored Procedures, XSLT, Pre-AJAX, ASP.NET, custom HttpHandler, custom XML-based page renderer, Business Logic in Stored Procs, XML from SQL Server, XSLT with extensions, Utility Classes in C#, NHibernate, ObjectQuery functionality, Automatic mapping Object – XML, AJAX Backoffice, JS-web services, CRUD, Custom Event Bus, DI Container (Unity), ASP.NET MVC…
![Page 6: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/6.jpg)
Крупные модернизации
• Внедрение ORM• Преобразование объектов в XML• DI container• Переходим на ASP.NET MVC
![Page 7: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/7.jpg)
You we are here
![Page 8: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/8.jpg)
Сборок совсем мало
http://www.flickr.com/photos/lofink/4501610335/
![Page 9: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/9.jpg)
Сегодняшние проблемы проекта
![Page 10: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/10.jpg)
Сложен reuse частей проекта
http://hq-wallpapers.info/tag/Карточный%20домик
![Page 11: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/11.jpg)
Unit tests не работают
https://picasaweb.google.com/lh/photo/bdJ2w6x9L1H7kUzDsDSyIg
![Page 12: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/12.jpg)
Сложно развивать систему
http://sqlblog.com/blogs/merrill_aldrich/archive/2011/08/10/ouch-chasing-the-isv-or-that-code-makes-my-teeth-hurt-t-sql-tuesday-ish-21.aspx
![Page 13: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/13.jpg)
Неясно, куда класть код
http://www.flickr.com/photos/lofink/4501610335/
![Page 14: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/14.jpg)
Проблемы – у разработчиков
• Люди боятся• Люди не понимают• Людям сложно
У кода нет проблем: работает и не падает.
![Page 15: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/15.jpg)
Основная беда – монолитность кода
![Page 16: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/16.jpg)
God-классы
• Куча функционала, тысячи строк• Со временем только растут
Зло!
![Page 17: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/17.jpg)
Публичные статические поля
• Singleton.Instance• Context.Current
Зло!
![Page 18: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/18.jpg)
«Магическое» конфигурирование
• Неявное, по первому обращению• В конструкторе через глобальный
сервис• В статическом конструкторе• Жесть! Зло!
![Page 19: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/19.jpg)
Слишком большие проекты
• 1000 классов на 9 проектов• 600 классов – в 2 проектах• Проекты на ~50 классов живут явно
лучше других
Зло!
![Page 20: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/20.jpg)
«Борода» детектед
http://www.kiter.by/2010/07/blog-post.html
![Page 21: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/21.jpg)
«Очень синяя борода» - Творческое Объединение «Экран».
Прости, любимая, так получилось...
![Page 22: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/22.jpg)
Надо «расчесать» код
http://www.nrk.no/kultur-og-underholdning/1.7321778
![Page 23: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/23.jpg)
http://www.flickr.com/photos/lofink/4501610335/
Призывы не работают
![Page 24: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/24.jpg)
Конкретные цели: тестопригодный код маленькие пэкеджи
![Page 25: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/25.jpg)
Наши текущие проблемы
![Page 26: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/26.jpg)
Слишком много NHibernate
• За 5 лет проник повсеместно• Конфигурируется «магически»• Текущая сессия – в контексте запроса • Все классы лезут туда напрямую• Вспомогательный статический
класс зависит от HttpRuntime
![Page 27: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/27.jpg)
Ближайшие цели
• Не лазать в базу через контекст запроса• Только по прямой ссылке• Не лазать из методов доменных объектов
• Подготовиться к другому ORM
![Page 28: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/28.jpg)
Решение
• Домен – в отдельный пакет• Убрать логику из доменных объектов *• Сделать обертку для сессии• Передавать обертку в сервисы явно
* Уточнение будет позже
![Page 29: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/29.jpg)
«Анемичная» доменная модель
• Модель без поведений• Фаулер не одобряе:• Нужен ОРМ• Нет инкапсуляции и полиморфизма• Скатываемся в процедурный стиль
![Page 30: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/30.jpg)
Поведение в методе
obj.Publish() – инкапсуляцияPublish() везде разный – полиморфизм
![Page 31: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/31.jpg)
Настройка под заказчика
• У разных клиентов – разные требования к Article.Publish().
![Page 32: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/32.jpg)
Command pattern
![Page 33: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/33.jpg)
В среднесрочной перспективе:
• Убираем логику из доменных объектов• Реализуем её командами• Делаем контейнер домена
![Page 34: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/34.jpg)
Запись данных гораздо сложнее чтения
![Page 35: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/35.jpg)
CRUD головного мозга
http://cthulhucrochet.blogspot.com/2010/09/time-to-switch-to-garlic-shampoo.html
![Page 36: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/36.jpg)
CQRS
• Command-Query Responsibility Segregation• Грег Янг• Начнем с разделения чтения и
записи
![Page 37: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/37.jpg)
Стратегия разделения на куски
???
![Page 38: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/38.jpg)
Паттерн vs. Антипаттерн
Попробуй решить
вот так
Никогда такне делай!
![Page 40: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/40.jpg)
addconf.ru
![Page 41: Синяя Борода. История одного проекта](https://reader031.vdocuments.mx/reader031/viewer/2022012918/557ebef8d8b42a48588b51ad/html5/thumbnails/41.jpg)
Пожалуйста, поставьте оценку моему докладу.
Ваше мнение очень важно.
Спасибо!