![Page 1: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/1.jpg)
Практика применения подходов ив проектах
Руслан Гатиятов Дроид Лабс
![Page 2: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/2.jpg)
- Явность- Поддерживаемость- Расширяемость- Безопасность- Стабильность- Предсказуемость- Масштабируемость- Тестируемость
Требования к коду
![Page 3: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/3.jpg)
от кОсновные проблемы- сильная связанность кода- неявность кода- сложно тестировать медленные тесты-- хуки в коде- кто должен быть тоньшеПервый опыт- проект
![Page 4: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/4.jpg)
![Page 5: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/5.jpg)
![Page 6: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/6.jpg)
- Entity- Value Object- Aggregate- Service- Repository- Factory- Domain events
![Page 7: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/7.jpg)
Проблемыкак формировать слои
- так ли вы поняли что такоеа вы случаем не перепутали икак часто вы общаетесь с экспертами
- можете ли вы абстрагироваться от предыдущего опыта изабыть все его практики
- все больше недоступны- о базе данных нужно думать в последнюю очередь- сообщество против вас
![Page 8: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/8.jpg)
Первые попытки:- неправильное разделение приложения на модули (по
таблицам БД)- слой сериализации данных- отказ от использования callbacks в моделях- отказ от использования валидаций- добавление репозитариев-оберток над ActiveRecord
Этапы эволюции
![Page 9: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/9.jpg)
- стало больше неправильных классов, связанность кода меньше- отсутствует application layer- неправильные bounded contexts- отсутствие - сложно читаемый код! не ruby-way!
obj = A::B::C::D.newobj.perform_operation
- тестировать все также сложно (попытка инъекций через конструктор) def users_repository Repositories::Users.new end
- models и repositories не разделены
Первые результаты
![Page 10: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/10.jpg)
- полный отказ от ActiveRecord, переход на datamapper (Sequel)- четкое выделение application, domain, infrastructure слоев- ubiquitous language- отказ от любых общих названий Services, Base*, *Manager- правильное выделение bounded contexts- внедрение dependency injection- быстрые, понятные, поддерживамые тесты (TDD стандарт)- база - данных деталь реализации- строгий режим работы с АПИ (application layer стал понятным)- осознание, что write model != read model. Смотрим в сторону CQRS.- отказ от devise и прочих стандартных гемов- и наконец-то! rails - деталь реализации
Переосмысление
![Page 11: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/11.jpg)
Внедрение
![Page 12: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/12.jpg)
Формы запросов
![Page 13: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/13.jpg)
ActiveRecord:Model
DDD:CommandHandlerEntityFactoryValidatorsRepositoryDAODataMapperEntity
![Page 14: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/14.jpg)
![Page 15: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/15.jpg)
- каждый модуль помещается - это отдельный gem- легко переиспользовать- просто тестировать- несколько комманд работают одновременно
![Page 16: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/16.jpg)
для тестов
![Page 17: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/17.jpg)
- строгий код (код подскажет, когда вы ошибаетесь)- не тестируйте стек фреймворка (он уже протестирован)- активно используйте DI в тестах- применяйте SOLID принципы- выделяйте из приложения микросервисы (SOA)- оборачивайте все внешние гемы в DI классы- DI классы stateless- читайте форумы java и .Net
Еще практики
![Page 18: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/18.jpg)
- умение общаться с доменным экспертом- понимание и применение ООП- активное применение TDD- практика применения принципов SOLID
Порог вхождения, чтобы начать нормально работать:Для junior-разработчика 2-3 месяцаДля middle-разработчика 2-3 недели
Требования к команде
![Page 19: 2015-12-05 Руслан Гатиятов - Практика применения подходов DDD и CQRS в Ruby-проектах](https://reader031.vdocuments.net/reader031/viewer/2022030303/587b2d561a28ab057d8b56e9/html5/thumbnails/19.jpg)
Спасибо за внимание