Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Синяя Борода.
История одного проекта

     Андрей Майоров
         BYTE-force
     twitter.com/xorets
Agenda
•   Детали проекта
•   В чем сложности?
•   Почему так получилось?
•   Как исправлять ситуацию?
http://www.flickr.com/photos/lofink/4501610335/
Использование и развитие
• Используется в наших веб-проектах
• Развивается по остаточному
  принципу
История развития
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…
Крупные модернизации
•   Внедрение ORM
•   Преобразование объектов в XML
•   DI container
•   Переходим на ASP.NET MVC
You we are here
Сборок совсем мало




                http://www.flickr.com/photos/lofink/4501610335/
Сегодняшние
проблемы проекта
Сложен reuse частей проекта




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




                 https://picasaweb.google.com/lh/photo/bdJ2w6x9L1H7kUzDsDSyIg
Сложно развивать систему




     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
Неясно, куда класть код




                    http://www.flickr.com/photos/lofink/4501610335/
Проблемы – у разработчиков
• Люди боятся
• Люди не понимают
• Людям сложно

   У кода нет проблем:
   работает и не падает.
Основная беда –
монолитность кода
God-классы
• Куча функционала, тысячи строк
• Со временем только растут



                           Зло!
Публичные статические поля
• Singleton.Instance
• Context.Current



                       Зло!
«Магическое» конфигурирование
• Неявное, по первому обращению
• В конструкторе через глобальный
  сервис
• В статическом конструкторе
  • Жесть!
                        Зло!
Слишком большие проекты
• 1000 классов на 9 проектов
• 600 классов – в 2 проектах
• Проекты на ~50 классов живут явно
  лучше других
                         Зло!
«Борода» детектед




                    http://www.kiter.by/2010/07/blog-post.html
Прости, любимая,
так получилось...




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




                 http://www.nrk.no/kultur-og-underholdning/1.7321778
Призывы не работают




                 http://www.flickr.com/photos/lofink/4501610335/
Конкретные цели:
    тестопригодный код
    маленькие пэкеджи
Наши текущие проблемы
Слишком много NHibernate
•   За 5 лет проник повсеместно
•   Конфигурируется «магически»
•   Текущая сессия – в контексте запроса
•   Все классы лезут туда напрямую
•   Вспомогательный статический
    класс зависит от HttpRuntime
Ближайшие цели
• Не лазать в базу через контекст запроса
  • Только по прямой ссылке
  • Не лазать из методов доменных объектов
• Подготовиться к другому ORM
Решение
•   Домен – в отдельный пакет
•   Убрать логику из доменных объектов *
•   Сделать обертку для сессии
•   Передавать обертку в сервисы явно

* Уточнение будет позже
«Анемичная» доменная модель
• Модель без поведений
• Фаулер не одобряе:
  • Нужен ОРМ
  • Нет инкапсуляции и полиморфизма
  • Скатываемся в процедурный стиль
Поведение в методе
obj.Publish() –
  инкапсуляция
Publish() везде разный –
  полиморфизм
Настройка под заказчика




• У разных клиентов – разные требования
  к Article.Publish().
Command pattern
В среднесрочной перспективе:
• Убираем логику из доменных объектов
• Реализуем её командами
• Делаем контейнер домена
Запись данных гораздо
   сложнее чтения
CRUD головного мозга




            http://cthulhucrochet.blogspot.com/2010/09/time-to-switch-to-garlic-shampoo.html
CQRS
• Command-Query Responsibility
  Segregation
• Грег Янг
• Начнем с разделения чтения и
  записи
Стратегия разделения на куски
            ? ??
Паттерн vs. Антипаттерн



Попробуй    Никогда
  решить    так
 вот так    не делай!
Вопросы, пожалуйста
   Андрей Майоров
       BYTE-force
  xor@byte-force.com
   twitter.com/xorets
addconf.ru
Пожалуйста, поставьте
 оценку моему докладу.

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

        Спасибо!

More Related Content

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

Editor's Notes

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