SlideShare a Scribd company logo
1 of 69
DDD + TDD + MVP + GoF + PoEAA= Love! Евгений Сорокин Антон Бевзюк 9декабря 2009
Содержание Intro DDD MVP/MVVM TDD DSL GoF/PoEAA … Profit!
Intro
Кто мы такие? Программируем Руководимразработкой Обучаемстудентовсотрудников
Портфолио отдела Бизнес-приложения 7 лет в Agile 20 человек .NET SAP Business Intelligence
Самый большой agile-проект 32 проекта 140 000 строк кода 5000+ юнит тестов
DDDDomain-Driven Design
Почему DDD Сложный бизнес процесс
DDD Общий язык Выделенный домен
Стандартный DDD
Зависит от технологии Не зависит от технологии
Дизайн Клиент Сервер UI WebService Application Presentation Application Domain Infrastructure Infrastructure DB
Что дает DDD «Чистый» домен Инкапсуляция доменной логики И еще кое-что...
MVP /MVVMModel-View-Presenter / Model-View-ViewModel
Тестирование GUI GUI есть везде Важная часть приложения
Методы тестирования GUI Ручное Автоматическое  LoadRunner TestComplete Юнит-тестирование
Passive View View Presenter Model
Пример
IManagerView public interface IManagerView {    List<Manager> Managers { set; }    Manager SelectedManager { get; set; }    List<Employee> Employees { set; }    Notification Add { set; }    Notification Edit { set; }    Notification Delete { set; }    Notification Save { set; } }
ManagerPresenterTests [TestMethod] public void CanAddEmployee() { var view = new ManagerViewFake(); var presenter = new ManagerPresenter(view); var manager = Persist.Manager(); view.SelectedManager = manager; view.Add(); Assert.AreEqual(1, view.Employees.Count); }
ManagerPresenter private void IManagerView view; … public void OnAdd() { SelectedManager.Employees.Add(new Employee());    Rebind(); } … private void Rebind() { view.Managers = Managers; view.SelectedManager = SelectedManager; view.Employees = SelectedManager.Employees; }
ManagerView public class ManagerView : IManagerView {    public List<Employee> Employees {       set { employeesListView.DataSource =    			value;       }    }    …    public Notification Add { get; set; }    …    private void addButton_click(…) {       Add();    } }
Model-View-ViewModel Binding View ViewModel Model
ManagerViewModelTests [TestMethod] public void AddEmployee() { varviewModel = new ManagerViewModel(); var manager = Create.Manager(); viewModel.Managers = new [] {manager}; viewModel.SelectedManager = manager; viewModel.Add(); Assert.AreEqual(1,	viewModel.Employees.Count); }
ManagerViewModel public class ManagerViewModel {    List<Manager> Managers { get; private set; }    Manager SelectedManager { get; set; }    List<Employee> Employees {        get { return SeelctedManager.Employees; }     } …    Notification Add { get; private set; } …    private void OnAdd() { SelectedManager.Employees.Add(new Employee());    } }
ManagerView
Что дает MVP/MVVM Тестирование Presentation
TDDTest-Driven Development
Мифы о TDD ,[object Object]
TDD == объем работы * 2
TDD == 100% тестовое покрытие
TDD == серебряная пуля,[object Object]
Тестируем все Код Конфигурацию Хранимые процедуры GUI binding
Тестируем код [TestMethod] public void CanConvertMoney() { var service = new ExchangeRatesServiceFake() 		.UsdCosts(1, "USD") 		.UsdCosts(29M, "RUR"); var money = new Money(5, "RUR"); Assert.AreEqual( 		new Money(5/29M, "USD"),  money.Convert("USD", service)); }
Тестируем конфигурацию
Тестируем конфигурацию [TestMethod] public void CorrectConnectionString() { vardataContext = new DataContext(); StringAssert.Contains( “Correct connection string”,    dataContext.Connection.ConnectionString, “Please change connection string in DataContext to ConnectionString."); }
Тестируем хранимые процедуры [TestMethod] public void GetYearSales() { DataContextUtils.Insert(new order { order_date = "2009-01-01", order_items = { 		new order_item {amount = 5, price = 10.00M}, 		new order_item {amount = 2, price = 20.00M}, 	}); var sales = 	DataContext.pr_get_year_sales(2009).Single(); Assert.AreEqual(7, sales.total_amount); Assert.AreEqual(5*10M + 2*20M, sales.total_sum); }
Тестируем GUI binding
Тестируем GUI binding public void EmployeeViewBindingsAreOk() { var expected = new[] { 		new BindingData("managers", "DataMember", "Managers", typeof (EmployeeViewModel)), 		new BindingData(“managers", "SelectedItem", "SelectedManager", typeof (EmployeeViewModel)), 		new BindingData("employees", "DataMember", "Employees", typeof (EmployeeViewModel)), 		new BindingData("add", "Action", "CreateEmployee", typeof (EmployeeViewModel)), 		new BindingData("edit", "Action", "EditEmployee", typeof (EmployeeViewModel)), 		new BindingData("delete", "Action", "DeleteEmployee", typeof (EmployeeViewModel)), 		new BindingData("save", "Action", "Save", typeof (EmployeeViewModel)), 	}; var view = new EmployeeView(); BindingAssert.Matches(expected, view); }
Имена тестов [TestClass] EmployeePresenterTests {  [TestMethod]CanSelectEmployee(){…} [TestMethod]ItWorksTest(){…} }
Имена тестов [TestClass] WhenAddEmployee {   [TestMethod]AddedEmployeeSelectedByDefault(){…} }
Что дает TDD Простота Гибкость Поддерживаемость Тестируемость 5000+ тестов за 1 минуту
DSLDomain Specific Language
DSL new DateTime(2009, 11, 12) 12.11.of2009(); public static DateTime of2009(this double ddMM) { var day = (int) Math.Round(ddMM, 0); var month = (int) Math.Round(ddMM*100, 0)  			- day * 100;    return new DateTime(2009, month, day); }
DSL var month = new CalendarMonth(2009, 10); var month = Oct.of2009(); internal static class Oct {    public static CalendarMonth of2009 {       get {           return new CalendarMonth(2009, 10);        }    } }
DSL var customer = new Customer(); customer.Name = “VasyaPupkin”; var order = new  Order(); order.Customer = customer; order.Date = new DateTime(2009, 10, 11); varorderItem = new orderItem();  orderItem.Product = new Product(“Chips”); orderItem.Amount = 3; orderItem.Price = 45.30; order.Items.Add(orderItem); orderItem.Product = new Product(“Beer”); orderItem.Amount = 3; orderItam.Price = 20.50; order.Items.Add(orderItem);
DSL var order = new OrderBuilder() 	.WithCustomer(“VasyaPupkin”) 	.WithDate(11.10.of2009()) 	.WithLineItem() 		.WithProduct(“Chips”) 		.WithAmount(3) 		.WithPrice(45.30) 	.WithLineItem() 		.WithProduct(“Beer”) 		.WithAmount(3) 		.WithPrice(20.50) 	.GetResult();
GoF / PoEAAGang of Four / Patterns of Enterprise Application Architecture
Зачем паттерны?
Спецификация Динамические фильтры InfrastructureFacade.Get<T>(   Specification<T> specification) Дублирование условий
Спецификация // if order is critical if (order.Amount >= 1000000) {    … }
Спецификация public class CriticalOrder {    public boolIsSatisfiedBy(Order order) {       return order.Amount >= 1000000;    } }
Спецификация public class CriticalOrder {    private readonlyintminimalAmount;    public CriticalOrder(intminimalAmount) { this.minimalAmount = minimalAmount;    }    public boolIsSatisfiedBy(Order order) {       return order.Customer.Type == CustomerType.KeyCustomer && order.Amount >= minimalAmount;    } }
Композитные спецификации var specification = new CriticalOrder( CustomerType.KeyCustomer,  200000) & new SoldTo(new Country("Russia")) & new AsOf(2009);
Что дают шаблоны Повторное использование Расширяемость Гибкость SOLID
Profit!
Результатыдля разработчиков Хорошая оценка Microsoft Тестируемость Поддерживаемость Гибкость дизайна Концептуальная целостность Повторное использование
Результаты для бизнеса Нет регрессионных багов Гибкость требований Быстрая разработка Легкость при обсуждении требований
Резюме DDD MVP/MVVM TDD DSL GoF/PoEAA … Profit!
?
Антон Бевзюк Anton.Bevzjuk@intel.com Евгений Сорокин Evgeny.Sorokin@intel.com Для журналистов: parus@intel.com
Backup
Не все гладко Передача другой команде Производительность Безопасность Тяжелый solution
MSBuild Deploy Сборка приложения Прогон тестов Деплой файлов Запуск SQLScript Разные конфигурации для DEV/CONS/PROD Nightly Build Метрики CheckIn Рассылка результатов
Continuous Integration MSBuild Частый деплой Разные environments Безопасность
ClickOnce
ReSharper

More Related Content

Similar to Tdd + Ddd + Mvp + Go F + Po Eaa = Love

Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.ScrumTrek
 
TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...
TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...
TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...Ontico
 
Введение в Microsoft Silverlight 3.0
Введение в Microsoft Silverlight 3.0Введение в Microsoft Silverlight 3.0
Введение в Microsoft Silverlight 3.0akrakovetsky
 
Руководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из SeleniumРуководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из SeleniumUladzimir Kryvenka
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Ivan Tsyganov
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн2ГИС Технологии
 
Dev & test на windows azure
Dev & test на windows azureDev & test на windows azure
Dev & test на windows azureMicrosoft
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Оценка проектов тестирования
Оценка проектов тестированияОценка проектов тестирования
Оценка проектов тестированияRina Uzhevko
 
SCRUMopen Developer Max Kolodezniy
SCRUMopen Developer Max KolodezniySCRUMopen Developer Max Kolodezniy
SCRUMopen Developer Max KolodezniyAlexey Krivitsky
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCAndrew Mayorov
 
Миграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудствоМиграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудствоSQALab
 
Microsoft Visual Studio 2010
Microsoft Visual Studio 2010Microsoft Visual Studio 2010
Microsoft Visual Studio 2010Alexander Babich
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterAleksandr Tarasov
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капляmeet_magento
 

Similar to Tdd + Ddd + Mvp + Go F + Po Eaa = Love (20)

Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.
 
TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...
TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...
TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...
 
Введение в Microsoft Silverlight 3.0
Введение в Microsoft Silverlight 3.0Введение в Microsoft Silverlight 3.0
Введение в Microsoft Silverlight 3.0
 
Руководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из SeleniumРуководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из Selenium
 
RoboGuice
RoboGuiceRoboGuice
RoboGuice
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
 
Dev & test на windows azure
Dev & test на windows azureDev & test на windows azure
Dev & test на windows azure
 
Tdd php
Tdd phpTdd php
Tdd php
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Оценка проектов тестирования
Оценка проектов тестированияОценка проектов тестирования
Оценка проектов тестирования
 
SCRUMopen Developer Max Kolodezniy
SCRUMopen Developer Max KolodezniySCRUMopen Developer Max Kolodezniy
SCRUMopen Developer Max Kolodezniy
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
Android service
Android serviceAndroid service
Android service
 
Миграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудствоМиграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудство
 
Microsoft Visual Studio 2010
Microsoft Visual Studio 2010Microsoft Visual Studio 2010
Microsoft Visual Studio 2010
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot Starter
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капля
 

More from Nikita Filippov

Project Manager - Глупая идея
Project Manager - Глупая идеяProject Manager - Глупая идея
Project Manager - Глупая идеяNikita Filippov
 
Lego симуляция © Alex Krivitsky
Lego симуляция © Alex KrivitskyLego симуляция © Alex Krivitsky
Lego симуляция © Alex KrivitskyNikita Filippov
 
Simple steps to makes great products
Simple steps to makes great productsSimple steps to makes great products
Simple steps to makes great productsNikita Filippov
 
Scrum в Заказной разработке
Scrum в Заказной разработкеScrum в Заказной разработке
Scrum в Заказной разработкеNikita Filippov
 
Innovation games for Agileee
Innovation games for AgileeeInnovation games for Agileee
Innovation games for AgileeeNikita Filippov
 
Who is Scrum Master Today?
Who is Scrum Master Today?Who is Scrum Master Today?
Who is Scrum Master Today?Nikita Filippov
 
Распределенный SCRUM - to be or not to be collocated collocated
Распределенный SCRUM - to be or not to be collocated collocatedРаспределенный SCRUM - to be or not to be collocated collocated
Распределенный SCRUM - to be or not to be collocated collocatedNikita Filippov
 
Командный старт
Командный стартКомандный старт
Командный стартNikita Filippov
 
Rugby, Scrum и командная работа
Rugby, Scrum и командная работаRugby, Scrum и командная работа
Rugby, Scrum и командная работаNikita Filippov
 

More from Nikita Filippov (20)

Project Manager - Глупая идея
Project Manager - Глупая идеяProject Manager - Глупая идея
Project Manager - Глупая идея
 
6 scrum master
6 scrum master6 scrum master
6 scrum master
 
7 retro
7 retro7 retro
7 retro
 
5 risk
5 risk5 risk
5 risk
 
3 story mapping
3 story mapping3 story mapping
3 story mapping
 
2 bmg
2 bmg2 bmg
2 bmg
 
Lego симуляция © Alex Krivitsky
Lego симуляция © Alex KrivitskyLego симуляция © Alex Krivitsky
Lego симуляция © Alex Krivitsky
 
4 woz
4 woz4 woz
4 woz
 
Simple steps to makes great products
Simple steps to makes great productsSimple steps to makes great products
Simple steps to makes great products
 
Vietnam
VietnamVietnam
Vietnam
 
Story mapping
Story mapping Story mapping
Story mapping
 
Vision Crafting
Vision Crafting Vision Crafting
Vision Crafting
 
Lean startup
Lean startupLean startup
Lean startup
 
Customer Development
Customer Development Customer Development
Customer Development
 
Scrum в Заказной разработке
Scrum в Заказной разработкеScrum в Заказной разработке
Scrum в Заказной разработке
 
Innovation games for Agileee
Innovation games for AgileeeInnovation games for Agileee
Innovation games for Agileee
 
Who is Scrum Master Today?
Who is Scrum Master Today?Who is Scrum Master Today?
Who is Scrum Master Today?
 
Распределенный SCRUM - to be or not to be collocated collocated
Распределенный SCRUM - to be or not to be collocated collocatedРаспределенный SCRUM - to be or not to be collocated collocated
Распределенный SCRUM - to be or not to be collocated collocated
 
Командный старт
Командный стартКомандный старт
Командный старт
 
Rugby, Scrum и командная работа
Rugby, Scrum и командная работаRugby, Scrum и командная работа
Rugby, Scrum и командная работа
 

Tdd + Ddd + Mvp + Go F + Po Eaa = Love

Editor's Notes

  1. Call to action:Применение использованных нами практик позволит вам успешно завершить проектТехническая основа agile на платформе MS
  2. ОценкиMS подтверждают
  3. ПрименяемeXtreme Programming (XP)ScrumKanban
  4. Нужно объяснить, почему мы компетентны говорить на заявленную тему. Блин, этот слайд нужно переделать совсем.
  5. Спросить у Дарлин разрешения на фотографию
  6. Перевести
  7. ООПМоделирование реального мираГруппы взаимосвязанных объектов -> паттерны
  8. ООПМоделирование реального мираГруппы взаимосвязанных объектов -> паттерны
  9. Нужно объяснить, почему мы компетентны говорить на заявленную тему. Блин, этот слайд нужно переделать совсем.