41
Синяя Борода. История одного проекта Андрей Майоров BYTE-force twitter.com/xorets

Синяя Борода. История одного проекта

Embed Size (px)

Citation preview

Page 1: Синяя Борода. История одного проекта

Синяя Борода. История одного проекта

Андрей МайоровBYTE-force

twitter.com/xorets

Page 2: Синяя Борода. История одного проекта

Agenda

• Детали проекта• В чем сложности?• Почему так получилось?• Как исправлять ситуацию?

Page 3: Синяя Борода. История одного проекта

http://www.flickr.com/photos/lofink/4501610335/

Page 4: Синяя Борода. История одного проекта

Использование и развитие

• Используется в наших веб-проектах• Развивается по остаточному

принципу

Page 5: Синяя Борода. История одного проекта

История развития

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: Синяя Борода. История одного проекта

Крупные модернизации

• Внедрение ORM• Преобразование объектов в XML• DI container• Переходим на ASP.NET MVC

Page 7: Синяя Борода. История одного проекта

You we are here

Page 8: Синяя Борода. История одного проекта

Сборок совсем мало

http://www.flickr.com/photos/lofink/4501610335/

Page 9: Синяя Борода. История одного проекта

Сегодняшние проблемы проекта

Page 10: Синяя Борода. История одного проекта

Сложен reuse частей проекта

http://hq-wallpapers.info/tag/Карточный%20домик

Page 11: Синяя Борода. История одного проекта

Unit tests не работают

https://picasaweb.google.com/lh/photo/bdJ2w6x9L1H7kUzDsDSyIg

Page 12: Синяя Борода. История одного проекта

Сложно развивать систему

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: Синяя Борода. История одного проекта

Неясно, куда класть код

http://www.flickr.com/photos/lofink/4501610335/

Page 14: Синяя Борода. История одного проекта

Проблемы – у разработчиков

• Люди боятся• Люди не понимают• Людям сложно

У кода нет проблем: работает и не падает.

Page 15: Синяя Борода. История одного проекта

Основная беда – монолитность кода

Page 16: Синяя Борода. История одного проекта

God-классы

• Куча функционала, тысячи строк• Со временем только растут

Зло!

Page 17: Синяя Борода. История одного проекта

Публичные статические поля

• Singleton.Instance• Context.Current

Зло!

Page 18: Синяя Борода. История одного проекта

«Магическое» конфигурирование

• Неявное, по первому обращению• В конструкторе через глобальный

сервис• В статическом конструкторе• Жесть! Зло!

Page 19: Синяя Борода. История одного проекта

Слишком большие проекты

• 1000 классов на 9 проектов• 600 классов – в 2 проектах• Проекты на ~50 классов живут явно

лучше других

Зло!

Page 20: Синяя Борода. История одного проекта

«Борода» детектед

http://www.kiter.by/2010/07/blog-post.html

Page 21: Синяя Борода. История одного проекта

«Очень синяя борода» - Творческое Объединение «Экран».

Прости, любимая, так получилось...

Page 22: Синяя Борода. История одного проекта

Надо «расчесать» код

http://www.nrk.no/kultur-og-underholdning/1.7321778

Page 23: Синяя Борода. История одного проекта

http://www.flickr.com/photos/lofink/4501610335/

Призывы не работают

Page 24: Синяя Борода. История одного проекта

Конкретные цели: тестопригодный код маленькие пэкеджи

Page 25: Синяя Борода. История одного проекта

Наши текущие проблемы

Page 26: Синяя Борода. История одного проекта

Слишком много NHibernate

• За 5 лет проник повсеместно• Конфигурируется «магически»• Текущая сессия – в контексте запроса • Все классы лезут туда напрямую• Вспомогательный статический

класс зависит от HttpRuntime

Page 27: Синяя Борода. История одного проекта

Ближайшие цели

• Не лазать в базу через контекст запроса• Только по прямой ссылке• Не лазать из методов доменных объектов

• Подготовиться к другому ORM

Page 28: Синяя Борода. История одного проекта

Решение

• Домен – в отдельный пакет• Убрать логику из доменных объектов *• Сделать обертку для сессии• Передавать обертку в сервисы явно

* Уточнение будет позже

Page 29: Синяя Борода. История одного проекта

«Анемичная» доменная модель

• Модель без поведений• Фаулер не одобряе:• Нужен ОРМ• Нет инкапсуляции и полиморфизма• Скатываемся в процедурный стиль

Page 30: Синяя Борода. История одного проекта

Поведение в методе

obj.Publish() – инкапсуляцияPublish() везде разный – полиморфизм

Page 31: Синяя Борода. История одного проекта

Настройка под заказчика

• У разных клиентов – разные требования к Article.Publish().

Page 32: Синяя Борода. История одного проекта

Command pattern

Page 33: Синяя Борода. История одного проекта

В среднесрочной перспективе:

• Убираем логику из доменных объектов• Реализуем её командами• Делаем контейнер домена

Page 34: Синяя Борода. История одного проекта

Запись данных гораздо сложнее чтения

Page 35: Синяя Борода. История одного проекта

CRUD головного мозга

http://cthulhucrochet.blogspot.com/2010/09/time-to-switch-to-garlic-shampoo.html

Page 36: Синяя Борода. История одного проекта

CQRS

• Command-Query Responsibility Segregation• Грег Янг• Начнем с разделения чтения и

записи

Page 37: Синяя Борода. История одного проекта

Стратегия разделения на куски

???

Page 38: Синяя Борода. История одного проекта

Паттерн vs. Антипаттерн

Попробуй решить

вот так

Никогда такне делай!

Page 39: Синяя Борода. История одного проекта

Вопросы, пожалуйста

Андрей МайоровBYTE-force

[email protected]/xorets

Page 40: Синяя Борода. История одного проекта

addconf.ru

Page 41: Синяя Борода. История одного проекта

Пожалуйста, поставьте оценку моему докладу.

Ваше мнение очень важно.

Спасибо!