Your SlideShare is downloading. ×
Синяя Борода. История одного проекта.
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

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

605
views

Published on

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
605
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • Надо проектировать классы так, чтобы их всегда можно было полностью покрыть модульными тестами, подменяя окружение mock'ами.Без баз данныхБез Http-запросовБез тестовых файловПосле или во время этого можно уже делать классы"красивыми", соответствующими принципам и догмам. Надо разбивать проект на мелкие кусочки Рассчитывая на то, что кусочки могут заменяться или использоваться в других проектах.Результаты:Код будет покрыт работающими тестами. Ибо тесты не будут зависеть от базы данных, файловой системы и т.п.Код можнорефакторить до красивого вида. Благо тесты естьМелкие проекты не позволят делать перекрестных ссылокОни заставят вас применять IoC,DI и т.д. чтобы заставить все это работать вместе.
  • Для нас сейчас стараться писать тестопригодный код – несколько поздно. Код уже написан. Писать тесты к существующему коду – неблагодарная задачаНаша первая глобальная задача – разбить проект на куски ... и уменьшить связность кодаЕе выполнениесостоит из решения отдельных конкретных архитектурных проблем.Далее рассмотрим некоторые имеющиеся проблемы и обсудим возможные пути решения.
  • Читать данные мы можем по-разному: Через доменную модель Прямой запрос из базы Обращение к хранимой процедуреЗапрос из вообще сторонней базы, типа OLAP.И это все хорошо, если удобно.А записывать удобно через доменную модель и ORM. Понятно – т.к. модель отражает структуру базы.Все бы хорошо, если не одно «но»…
  • Стратегия разделения проекта на много мелких пакетов – это большой вопрос. Нужно выработать четкие и ясные принципы, понятные всем: Что выделять в отдельный проект? Как его именовать? Как подключать к общему решению?Мнения есть, алгоритма – нет. Пока.
  • Я не люблю понятие «антипаттерн». Паттерн – позитивная, созидательная сущность. Подход к решению вашей проблемы. Проблема конкретна, подход тоже. Все возможные сложности описаны. Это только предложение, одно из многих.Антипаттерн Это полный запрет, абсолютное отрицание.Ты передаешь доменные объекты во вью? Никогда так не делай! Нельзя! Это антипаттерн.Антипаттерн не подразумевает размышлений. Нельзя и все. Даже не пробуй так делать. Почему? Ну это же известный антипаттерн! (Я крут, а ты лох) Даже если антипаттерн в своем оригинальном описании содержит весьма конкретные условия применения («применение антипаттерна» – звучит), «крутые чуваки» опускают для себя всю сложную часть, оставляя простую:Нельзя, потому что запретил Великий Антипаттерн!Антипаттерн сильно отличается от менее категоричных: Я попробовал сделать так, но у меня не получилось. Ну дак, может, у тебя руки кривые?Этот подход может привести к таким-то проблемам. А может не приведет? Условия-то другие. 5 лет прошло, как никак…Антипаттерну нельзя задать эти вопросы. Ибо он есть Истина В Последней Инстанции. Сравните левую и правую части: Левая открывает новую возможность. Правая закрывает разом все.Пока все, но об этом можно долго.
  • Transcript

    • 1. Синяя Борода.История одного проекта Андрей Майоров BYTE-force twitter.com/xorets
    • 2. Agenda• Детали проекта• В чем сложности?• Почему так получилось?• Как исправлять ситуацию?
    • 3. http://www.flickr.com/photos/lofink/4501610335/
    • 4. Использование и развитие• Используется в наших веб-проектах• Развивается по остаточному принципу
    • 5. История развитияXML + XSLT + Transformation script, Classic ASP, JSScriptlets, MS SQL, Stored Procedures, XSLT, Pre-AJAX, ASP.NET, custom HttpHandler, custom XML-based page renderer, Business Logic in StoredProcs, XML from SQL Server, XSLT with extensions,Utility Classes in C#, NHibernate, ObjectQueryfunctionality, Automatic mapping Object – XML,AJAX Backoffice, JS-web services, CRUD, CustomEvent Bus, DI Container (Unity), ASP.NET MVC…
    • 6. Крупные модернизации• Внедрение ORM• Преобразование объектов в XML• DI container• Переходим на ASP.NET MVC
    • 7. You we are here
    • 8. Сборок совсем мало http://www.flickr.com/photos/lofink/4501610335/
    • 9. Сегодняшниепроблемы проекта
    • 10. Сложен reuse частей проекта http://hq-wallpapers.info/tag/Карточный%20домик
    • 11. Unit tests не работают https://picasaweb.google.com/lh/photo/bdJ2w6x9L1H7kUzDsDSyIg
    • 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
    • 13. Неясно, куда класть код http://www.flickr.com/photos/lofink/4501610335/
    • 14. Проблемы – у разработчиков• Люди боятся• Люди не понимают• Людям сложно У кода нет проблем: работает и не падает.
    • 15. Основная беда –монолитность кода
    • 16. God-классы• Куча функционала, тысячи строк• Со временем только растут Зло!
    • 17. Публичные статические поля• Singleton.Instance• Context.Current Зло!
    • 18. «Магическое» конфигурирование• Неявное, по первому обращению• В конструкторе через глобальный сервис• В статическом конструкторе • Жесть! Зло!
    • 19. Слишком большие проекты• 1000 классов на 9 проектов• 600 классов – в 2 проектах• Проекты на ~50 классов живут явно лучше других Зло!
    • 20. «Борода» детектед http://www.kiter.by/2010/07/blog-post.html
    • 21. Прости, любимая,так получилось... «Очень синяя борода» - Творческое Объединение «Экран».
    • 22. Надо «расчесать» код http://www.nrk.no/kultur-og-underholdning/1.7321778
    • 23. Призывы не работают http://www.flickr.com/photos/lofink/4501610335/
    • 24. Конкретные цели: тестопригодный код маленькие пэкеджи
    • 25. Наши текущие проблемы
    • 26. Слишком много NHibernate• За 5 лет проник повсеместно• Конфигурируется «магически»• Текущая сессия – в контексте запроса• Все классы лезут туда напрямую• Вспомогательный статический класс зависит от HttpRuntime
    • 27. Ближайшие цели• Не лазать в базу через контекст запроса • Только по прямой ссылке • Не лазать из методов доменных объектов• Подготовиться к другому ORM
    • 28. Решение• Домен – в отдельный пакет• Убрать логику из доменных объектов *• Сделать обертку для сессии• Передавать обертку в сервисы явно* Уточнение будет позже
    • 29. «Анемичная» доменная модель• Модель без поведений• Фаулер не одобряе: • Нужен ОРМ • Нет инкапсуляции и полиморфизма • Скатываемся в процедурный стиль
    • 30. Поведение в методеobj.Publish() – инкапсуляцияPublish() везде разный – полиморфизм
    • 31. Настройка под заказчика• У разных клиентов – разные требования к Article.Publish().
    • 32. Command pattern
    • 33. В среднесрочной перспективе:• Убираем логику из доменных объектов• Реализуем её командами• Делаем контейнер домена
    • 34. Запись данных гораздо сложнее чтения
    • 35. CRUD головного мозга http://cthulhucrochet.blogspot.com/2010/09/time-to-switch-to-garlic-shampoo.html
    • 36. CQRS• Command-Query Responsibility Segregation• Грег Янг• Начнем с разделения чтения и записи
    • 37. Стратегия разделения на куски ? ??
    • 38. Паттерн vs. АнтипаттернПопробуй Никогда решить так вот так не делай!
    • 39. Вопросы, пожалуйста Андрей Майоров BYTE-force xor@byte-force.com twitter.com/xorets
    • 40. addconf.ru
    • 41. Пожалуйста, поставьте оценку моему докладу.Ваше мнение очень важно. Спасибо!