SlideShare a Scribd company logo
1 of 61
Проектирование по контракту DmytroMindra RnD Tech Lead LohikaLabs Киев, 2011
Дополнение к докладу ВАЖНО: Можно работать на Visual Studio 2010 Professional.  Для этого ставятся Code ContractsStandard Edition. Будет доступно все, кроме статического анализа. В Code Contracts Premium Edition доступен статический анализ контрактов.
© Drake Emko & Jen Brodzik, 2001
© Drake Emko & Jen Brodzik, 2001
© Drake Emko & Jen Brodzik, 2001
Northeast Blackout Северо-восточное  отключение света 14 августа2003 12:15 p.m. Оператор компании MISO отключает систему  	   прогнозирования проблем, чтобы подправить  	   вручную данные и забывает ее включить в  	   автоматическом режиме. 2:02 p.m. Отказала первая линия 345 кВ 2:14 p.m. Отказ системы оповещения (основной и резервной) 3:05 p.m. Отказ второй линии 345 кВ 3:17 p.m. Падение напряжения. Срабатывают контроллеры  	и перераспределяют нагрузку. 3:32 p.m. В результате перераспределения нагрузки  	выходит из строя еще одна линия 345 кВ.  	Начинается каскадный выход из строя  	перегруженных линий. Т.к. компании MISO и FirstEnergy не предупредили соседей о проблемах.
4:13 p.m. 	Конец каскадных отключений.  256 электростанций отключены. 55 миллионов людей без электричества  более  24 часов.
Ariane 5 (501) 4 июня 1996 года
37секунд полета US$370-500миллионовубытка US$ 7 миллиардовна разработку Задержка миссии ЕКА на 4года 64-bit floating point  => 16-bit signed integer Как же дублирование систем ? Резервная система пала жертвой той же ошибки. Главный модуль остался без данных. И принял неверное решение.
56 запусков 2 неудачных 2 частично неудачных 52 удачных запуска ЕКА запустили спутники при помощи Arian 5? Нет. Использовался Союз Фрегат.
Ошибки в медицинском ПО Therac-25 c 1985 по 1987 6 несчастных случаев по вине ПО.[15] По ошибке программы MultidataSystemsInternational погибло 8 человек. 20 получили высокую дозу радиации. Физиотерапевты, ответственные за ручную проверку дозы, обвинены в убийстве. [15]
Так должно быть
А так есть
ОПАСНАЯ ТОРГОВЛЯ ФРУКТАМИ
    public interface IFruit {}        public interface IFruitService    {        IFruit GetFruit();    }         public class Fruit:IFruit { }    public class FruitService : IFruitService {         public IFruit GetFruit(){            return new Fruit();        }     } Абстракции Реализации
    public class FruitDealer    {        private readonly IFruitService _fruitService;        private double _dealerMoney;                public FruitDealer(IFruitService fruitService)        {            _fruitService = fruitService;        }        public IFruit SellFruit(double money)        {            _dealerMoney += money;            return _fruitService.GetFruit();        }    } Частные  поля Конструктор money<=0 ? Важный метод NullReferenceExceptional ? FruitDealerdealer = new FruitDealer(null); /* Some of code */ IFruitfruit = dealer.SellFruit(-10);
public class FruitDealer    {        private readonly IFruitService _fruitService;        private double _dealerMoney;                public FruitDealer(IFruitService fruitService)         {             _fruitService = fruitService;        }        public IFruit SellFruit(double money)        {                         _dealerMoney += money;            return _fruitService.GetFruit();        }    } // fruitService should not be null if (fruitService==null)      	throw new ArgumentNullException("fruitService"); // money should be >0 if (money<=0) 	throw new ArgumentOutOfRangeException("money");
Недостатки Код с исключениями плохо подходит в качестве контрактов так как плохо читается. Этот подход невозможно привязать к интерфейсам. При перегрузке методов в наследниках придется заново прописывать проверки. Проверками невозможно/сложно управлять.
Проекированиепо контракту
Проектирование по контракту Не только хорошее слово А также нужное дело И зарегистрированная торговая марка Design by Contract
Design by ContractTM Бертран Мейер Автор проектирования по контракту и языка Eifel.  Автор 11 книг Включая“Object-Oriented Software Construction” Первое издание: 1988 Второе издание: 1997
Контракт – это … метод проектирования программного обеспечения. Он предполагает, что проектировщик должен определить формальные, точные и верифицируемые спецификации интерфейсов для компонентов системы. При этом, кроме обычного определения абстрактных типов данных, также используются предусловия, постусловия и инварианты. Данные спецификации называются "контрактами" в соответствии с концептуальной метафорой условий и ответственностей в бизнес-контрактах. (wikipedia)
Предусловия Проверяют правильно соблюдены ли условия контракта клиентом. Все ли параметры переданы и правильные ли им присвоены значения. GIGO (англ. GarbageIn, GarbageOut, «Мусор на входе — мусор на выходе») 
Постусловия Проверяют возвращает ли поставщик именно то, что предписано контрактом. «Правильность»  результата так сказать.
Инварианты Инварианты проверяют не был ли поврежден поставщик в процессе выполнения метода. Соответствует ли его состояние после вызова метода контракту. И соответственно готов ли он к дальнейшей работе.
Пример на EIFEL deposit (amount: INTEGER) is  require  non_negative: amount > 0  do  		balance := balance + amount  ensure  		updated: balance = old balance + amount end
С ЧЕГО НАЧАТЬ ?
Нужна Visual Studio 2010 (Premium , Ultimate) Декларативные контракты включеныв .NET 4.0 (System.Diagnostics.Contracts) Для полноценной работы нужно установить инструменты (CodeContract Tools). Инструменты включают в себя: generate runtime checking from the contracts(ccrewrite) do a static check that verifies contracts at compile-time (cccheck) add contracts to the XML documentation files (ccdoc) LOCATION: [Program Files]icrosoftontractsinbr />
Где наш диллер
Наш первый контракт public class FruitDealer { private readonlyIFruitService_fruitService; private double _dealerMoney;         public FruitDealer(IFruitServicefruitService)         { Contract.Requires(fruitService!=null); _fruitService = fruitService;         }         public IFruitSellFruit(double money) { Contract.Requires(money > 0); Contract.Ensures(Contract.Result<IFruit>()!=null);             _dealerMoney += money;             return _fruitService.GetFruit();         }     } Контракт Обязательстваклиента Обязательства поставщика
Проверка №1 FruitDealerdealer1 = new FruitDealer(null);
Проверка №2 FruitDealerdealer2 = new FruitDealer(new FruitService()); IFruitfruit2 = dealer2.SellFruit(-10);
После установки инструментов появится новая вкладка
System.Diagnostics.Contracts Contract Attributes ContractClassAttribute ContractClassForAttribute ContractInvariantMethodAttribute ContractPublicPropertyNameAttribute ContractReferenceAssemblyAttribute ContractRuntimeIgnoredAttribute ContractVerificationAttribute PureAttribute ( is not enforced by analysis tools ) ContractFailedEventArgs ContractFailureKind (enum)
Основные методы Pre-conditions: 	Requires Post-conditions: 	Ensures Invariants: 		Invariant See also: 	EnsuresOnThrow<TException> 			Requires<TException>
Давайте сравним     public class Customer {        private int _ID;        public int ID        {            get            {                return _ID;            }             		  set            {                		    if (value <= 0) throw new ArgumentException();                 		     _ID = value;            }        }} public class Customer{    private int _ID;    public int ID    {        get        {            return _ID;        }        set         { Contract.Requires(value > 0);            		 		 _ID = value;        }    }} Было Стало
Первая демонстрация
Что там внутри ?
Processing collections Integer range ForAll(Int32, Int32, Predicate<Int32>) Exists(Int32, Int32, Predicate<Int32>) Collection ForAll<T>(IEnumerable<T>, Predicate<T>) Exists<T>(IEnumerable<T>, Predicate<T>)
Демонстрация работы с коллекциями
Проверка результатов OldValue<T> Result<T> ValueAtReturn<T>
Демонстрация проверки результатов
Другие методы Assert – Проверка условия Assume – Влияет на статическую проверку, добавляя утверждение в базу фактов статического анализатора. Влияет только на статический анализ. Во время выполнения трактуется как Assert. [3] EndContractBlock  - for legacy contracts
Assert & Assume public void Invoke()  {  int x = CalculateSomeValues();  // Tell the checker to verify whether // x>0.  // (The checker might  //  be unable to do it.)  Contract.Assert( x>0 );  // Rest of the code  } public void Invoke() {  int x = CalculateSomeValues();  // Explicitly tell the checker that  //x>0  Contract.Assume( x>0 ); // Rest of the code  }
Наследование Два правила[7] При наследовании и перегрузке метода, а также при реализации интерфейса, контракты наследуются. Нельзя добавить предусловия,но можно усилить постусловия и добавить инварианты.  E.g was require x>10 Added require x>100 Now x = 20 fulfills 1st require but violates 2nd;
Демонстрация: наследование и ловушки
Обработка ContractFailed Contract.ContractFailed +=  ContractContractFailed; static void ContractContractFailed( 		object sender, ContractFailedEventArgs e) { 		e.SetHandled(); // exception handledConsole.WriteLine(e.Message);}
ДемонстрацияContractFailed
custom contracts &custom rewriters methods public static class RuntimeFailureMethods {  public static void Requires(bool cond, string userMsg, string condText) { }  public static void Ensures(bool cond, string userMsg, string condText) { }… } See user manual 7.7. (page 34) [12]
Code snippets crContract.Requires(...); ce 		Contract.Ensures(...); ci 		Contract.Invariant(...); More in user manual 6.3. (page 26) [12]
ВНЕДРЕНИЕ
Code Contracts инструкция страница 18 Нужна валидацияя аргументов в релизном коде нет да Допустимо использование contract tools нет да Используем предусловия везде. Включаем контракты только для дебага Requires<Ex> на публичных методах Requires везде Runtime на всех билдах Только предусловия и только на публичных методах. If-throw на публичных методах Помечаем их EndContractBlock Используем Requires везде Runtime checking только для отладочных сборок
Как внедрять ? Только в тех случаях, когда другие разработчики могут  пользоваться поставляемыми вами библиотеками. Только на публичных внешних методах. Только предусловия. Можно применять другие практики. Это инструмент разработчика.
Выводы и перспективы CodeContracts активно развивается В BCL активно используются CodeContracts Статическая проверка CodeContracts могут положительно повлиять на архитектуру Дополнение к документации Еще один хороший инструмент 	( Не единственный, а один из)
PEX Path-based program exploration
Демонстрация PEX
СПАСИБО ! Вопросы ?
Книги Touch of Class: learning to program well with objects and contracts Object-Oriented Software Construction Object-Oriented Software Construction Bertrand Meyer 1988,1997
Ссылки [1] Design by Contract - A Conversation with Bertrand Meyer, Part II by Bill Venners http://www.artima.com/intv/contracts.html [2] Defensive programming http://en.wikipedia.org/wiki/Defensive_programming [3] Dino Esposito, Code Contracts Preview: Preconditions http://dotnetslackers.com/articles/net/Code-Contracts-Preview-Preconditions.aspx [4] Dino Esposito, Code Contracts Preview: PostConditions http://dotnetslackers.com/articles/net/Code-Contracts-Preview-PostConditions.aspx [5] Dino Esposito, Code Contracts Preview: Invariants http://dotnetslackers.com/articles/net/Code-Contracts-Preview-Invariants.aspx [6] Dino Esposito, Code Contracts Preview: Assert & Assume http://dotnetslackers.com/articles/net/Code-Contracts-Preview-Assert-Assume.aspx [7] Jon Skeet, Code Contracts in C# http://www.infoq.com/articles/code-contracts-csharp [8] Design by Contract - Wikipedia http://en.wikipedia.org/wiki/Design_by_contract [9] Precondition - Wikipedia http://en.wikipedia.org/wiki/Precondition [10] Postcondition - Wikipedia http://en.wikipedia.org/wiki/Postcondition [11] Invariant - Wikipedia http://en.wikipedia.org/wiki/Invariant_(computer_science) [12] Code Contracts User Manual http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf [13] Code contracts and inheritance http://stefanoricciardi.com/2009/07/17/code-contracts-and-inheritance/ [14] Assertions in Managed Code http://msdn.microsoft.com/en-us/library/ttcc4x86.aspx [15] History's Worst Software Bugs http://www.wired.com/software/coolapps/news/2005/11/69355?currentPage=2

More Related Content

What's hot

Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыPlatonov Sergey
 
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Ontico
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
Dependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectDependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectakrakovetsky
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Модульная структура
Модульная структураМодульная структура
Модульная структураDenis Tsvettsih
 
Mikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsMikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsCiklum
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Yulia Tsisyk
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Sigma Software
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6Technopark
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++Mikhail Shcherbakov
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программированиеDenis Tsvettsih
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.Mikhail Shcherbakov
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3. Mikhail Shcherbakov
 
цсноп 2 11_1_vital
цсноп 2 11_1_vitalцсноп 2 11_1_vital
цсноп 2 11_1_vitalIrina Hahanova
 

What's hot (20)

Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Dependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectDependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInject
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 
Mikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsMikhail Valkov_Antipatterns
Mikhail Valkov_Antipatterns
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программирование
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
 
цсноп 2 11_1_vital
цсноп 2 11_1_vitalцсноп 2 11_1_vital
цсноп 2 11_1_vital
 

Viewers also liked

XP Days Ukraine 2014 - Refactoring legacy code
XP Days Ukraine 2014 - Refactoring legacy codeXP Days Ukraine 2014 - Refactoring legacy code
XP Days Ukraine 2014 - Refactoring legacy codeDmytro Mindra
 
Владимир Билоненко "Рецензирование кода"
Владимир Билоненко "Рецензирование кода"Владимир Билоненко "Рецензирование кода"
Владимир Билоненко "Рецензирование кода"Yandex
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIIlya Chesnokov
 
Безболезненное удаление сервиса
Безболезненное удаление сервисаБезболезненное удаление сервиса
Безболезненное удаление сервисаIlya Chesnokov
 
Автоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST APIАвтоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST APIPavel Asanov
 
Двухкратный публичный code review, Евгения Фирсова (Яндекс)
Двухкратный публичный code review, Евгения Фирсова (Яндекс)Двухкратный публичный code review, Евгения Фирсова (Яндекс)
Двухкратный публичный code review, Евгения Фирсова (Яндекс)Ontico
 
Atlassian Stash - Новый взгляд на Git-репозитории
Atlassian Stash - Новый взгляд на Git-репозиторииAtlassian Stash - Новый взгляд на Git-репозитории
Atlassian Stash - Новый взгляд на Git-репозиторииMaxim Kuzmich
 
Михаил Давыдов — Code Style
Михаил Давыдов — Code StyleМихаил Давыдов — Code Style
Михаил Давыдов — Code StyleYandex
 
Владимир Билоненко "Как мы делаем code review"
Владимир Билоненко "Как мы делаем code review"Владимир Билоненко "Как мы делаем code review"
Владимир Билоненко "Как мы делаем code review"Yandex
 
Crucible или почему для Code Review нужна не только голова, но и инструмент
Crucible или почему для Code Review нужна не только голова, но и инструментCrucible или почему для Code Review нужна не только голова, но и инструмент
Crucible или почему для Code Review нужна не только голова, но и инструментMaxim Kuzmich
 
Об очередях (AMQP)
Об очередях (AMQP)Об очередях (AMQP)
Об очередях (AMQP)Ilya Chesnokov
 
Повышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кодаПовышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кодаAleksandr Makhomet
 
Опыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаОпыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаIlya Chesnokov
 
Технический долг: взгляд и действия со стороны QA / QC&AT
Технический долг: взгляд и действия со стороны QA / QC&ATТехнический долг: взгляд и действия со стороны QA / QC&AT
Технический долг: взгляд и действия со стороны QA / QC&ATCodeFest
 
Все о бекенде мобильных приложений Badoo
Все о бекенде мобильных приложений BadooВсе о бекенде мобильных приложений Badoo
Все о бекенде мобильных приложений BadooCodeFest
 
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.Badoo Development
 
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...SQALab
 

Viewers also liked (19)

XP Days Ukraine 2014 - Refactoring legacy code
XP Days Ukraine 2014 - Refactoring legacy codeXP Days Ukraine 2014 - Refactoring legacy code
XP Days Ukraine 2014 - Refactoring legacy code
 
Владимир Билоненко "Рецензирование кода"
Владимир Билоненко "Рецензирование кода"Владимир Билоненко "Рецензирование кода"
Владимир Билоненко "Рецензирование кода"
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PI
 
Безболезненное удаление сервиса
Безболезненное удаление сервисаБезболезненное удаление сервиса
Безболезненное удаление сервиса
 
Автоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST APIАвтоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST API
 
Двухкратный публичный code review, Евгения Фирсова (Яндекс)
Двухкратный публичный code review, Евгения Фирсова (Яндекс)Двухкратный публичный code review, Евгения Фирсова (Яндекс)
Двухкратный публичный code review, Евгения Фирсова (Яндекс)
 
Atlassian Stash - Новый взгляд на Git-репозитории
Atlassian Stash - Новый взгляд на Git-репозиторииAtlassian Stash - Новый взгляд на Git-репозитории
Atlassian Stash - Новый взгляд на Git-репозитории
 
Михаил Давыдов — Code Style
Михаил Давыдов — Code StyleМихаил Давыдов — Code Style
Михаил Давыдов — Code Style
 
Владимир Билоненко "Как мы делаем code review"
Владимир Билоненко "Как мы делаем code review"Владимир Билоненко "Как мы делаем code review"
Владимир Билоненко "Как мы делаем code review"
 
Crucible или почему для Code Review нужна не только голова, но и инструмент
Crucible или почему для Code Review нужна не только голова, но и инструментCrucible или почему для Code Review нужна не только голова, но и инструмент
Crucible или почему для Code Review нужна не только голова, но и инструмент
 
Code review psyhology
Code review psyhologyCode review psyhology
Code review psyhology
 
Об очередях (AMQP)
Об очередях (AMQP)Об очередях (AMQP)
Об очередях (AMQP)
 
C# everywhere
C# everywhereC# everywhere
C# everywhere
 
Повышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кодаПовышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кода
 
Опыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаОпыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервиса
 
Технический долг: взгляд и действия со стороны QA / QC&AT
Технический долг: взгляд и действия со стороны QA / QC&ATТехнический долг: взгляд и действия со стороны QA / QC&AT
Технический долг: взгляд и действия со стороны QA / QC&AT
 
Все о бекенде мобильных приложений Badoo
Все о бекенде мобильных приложений BadooВсе о бекенде мобильных приложений Badoo
Все о бекенде мобильных приложений Badoo
 
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
 
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
 

Similar to Code Contracts ABC 16.04.2011

Обзор платформы B4
Обзор платформы B4Обзор платформы B4
Обзор платформы B4Bars Group
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Надежность ПО и Runtime Verification
Надежность ПО и Runtime VerificationНадежность ПО и Runtime Verification
Надежность ПО и Runtime Verificationru_Parallels
 
Андрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзеАндрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзеElias Fofanov
 
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Yulia Tsisyk
 
Денис Неклюдов. Держи свое приложение на волне новинок. РИФ-Воронеж 2016
Денис Неклюдов. Держи свое приложение на волне новинок. РИФ-Воронеж 2016Денис Неклюдов. Держи свое приложение на волне новинок. РИФ-Воронеж 2016
Денис Неклюдов. Держи свое приложение на волне новинок. РИФ-Воронеж 2016РИФ-Воронеж
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
отладка Mpi приложений
отладка Mpi приложенийотладка Mpi приложений
отладка Mpi приложенийMichael Karpov
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»MskDotNet Community
 
Инструкция по настройке сервиса виртуальное рабочее место на базе планшета I...
Инструкция по настройке сервиса  виртуальное рабочее место на базе планшета I...Инструкция по настройке сервиса  виртуальное рабочее место на базе планшета I...
Инструкция по настройке сервиса виртуальное рабочее место на базе планшета I...Елена Кузовкина
 
Парсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clangПарсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clangcorehard_by
 
20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliaminComputer Science Club
 
Классификация экономико-технических атак. Спикер: Григорий Васильков
Классификация экономико-технических атак. Спикер: Григорий ВасильковКлассификация экономико-технических атак. Спикер: Григорий Васильков
Классификация экономико-технических атак. Спикер: Григорий ВасильковCyber Fund
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложенийAndrew Mayorov
 
Теории и практики функционального программирования.
Теории и практики функционального программирования.Теории и практики функционального программирования.
Теории и практики функционального программирования.Dev2Dev
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterAleksandr Tarasov
 
Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0akrakovetsky
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?etyumentcev
 

Similar to Code Contracts ABC 16.04.2011 (20)

Обзор платформы B4
Обзор платформы B4Обзор платформы B4
Обзор платформы B4
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Надежность ПО и Runtime Verification
Надежность ПО и Runtime VerificationНадежность ПО и Runtime Verification
Надежность ПО и Runtime Verification
 
Андрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзеАндрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзе
 
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
 
UA Mobile 2012
UA Mobile 2012UA Mobile 2012
UA Mobile 2012
 
Денис Неклюдов. Держи свое приложение на волне новинок. РИФ-Воронеж 2016
Денис Неклюдов. Держи свое приложение на волне новинок. РИФ-Воронеж 2016Денис Неклюдов. Держи свое приложение на волне новинок. РИФ-Воронеж 2016
Денис Неклюдов. Держи свое приложение на волне новинок. РИФ-Воронеж 2016
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
отладка Mpi приложений
отладка Mpi приложенийотладка Mpi приложений
отладка Mpi приложений
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Инструкция по настройке сервиса виртуальное рабочее место на базе планшета I...
Инструкция по настройке сервиса  виртуальное рабочее место на базе планшета I...Инструкция по настройке сервиса  виртуальное рабочее место на базе планшета I...
Инструкция по настройке сервиса виртуальное рабочее место на базе планшета I...
 
Парсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clangПарсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clang
 
20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin
 
Классификация экономико-технических атак. Спикер: Григорий Васильков
Классификация экономико-технических атак. Спикер: Григорий ВасильковКлассификация экономико-технических атак. Спикер: Григорий Васильков
Классификация экономико-технических атак. Спикер: Григорий Васильков
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложений
 
Теории и практики функционального программирования.
Теории и практики функционального программирования.Теории и практики функционального программирования.
Теории и практики функционального программирования.
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot Starter
 
Android service
Android serviceAndroid service
Android service
 
Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?
 

More from Dmytro Mindra

Introduction to Value Planning for iHUB
Introduction to Value Planning for iHUBIntroduction to Value Planning for iHUB
Introduction to Value Planning for iHUBDmytro Mindra
 
Mastering public speaking skills
Mastering public speaking skillsMastering public speaking skills
Mastering public speaking skillsDmytro Mindra
 
Odessa .NET User Group - Kinect v2
Odessa .NET User Group - Kinect v2Odessa .NET User Group - Kinect v2
Odessa .NET User Group - Kinect v2Dmytro Mindra
 
Building Windows Phone 8 Games With Unity3d
Building Windows Phone 8 Games With Unity3dBuilding Windows Phone 8 Games With Unity3d
Building Windows Phone 8 Games With Unity3dDmytro Mindra
 
IT Brunch - SpecFlow and Gherkin by Example
IT Brunch - SpecFlow and Gherkin by ExampleIT Brunch - SpecFlow and Gherkin by Example
IT Brunch - SpecFlow and Gherkin by ExampleDmytro Mindra
 
Odessa Pluralsight Study Group 28.11.2012
Odessa Pluralsight Study Group 28.11.2012Odessa Pluralsight Study Group 28.11.2012
Odessa Pluralsight Study Group 28.11.2012Dmytro Mindra
 
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Dmytro Mindra
 
Compilable Specifications - XPDays Ukraine 2012
Compilable Specifications - XPDays Ukraine 2012Compilable Specifications - XPDays Ukraine 2012
Compilable Specifications - XPDays Ukraine 2012Dmytro Mindra
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript Dmytro Mindra
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptDmytro Mindra
 
Lean Lego Game for Agileee 2012
Lean Lego Game for Agileee 2012Lean Lego Game for Agileee 2012
Lean Lego Game for Agileee 2012Dmytro Mindra
 
Lohika .Net Day - What's new in Windows Azure
Lohika .Net Day - What's new in Windows AzureLohika .Net Day - What's new in Windows Azure
Lohika .Net Day - What's new in Windows AzureDmytro Mindra
 
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Dmytro Mindra
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Dmytro Mindra
 
Lean Software Development
Lean Software DevelopmentLean Software Development
Lean Software DevelopmentDmytro Mindra
 
Craftsmanship - XP Days 2011
Craftsmanship - XP Days 2011Craftsmanship - XP Days 2011
Craftsmanship - XP Days 2011Dmytro Mindra
 
Odessa .NET User Group - 10.11.2011 - Applied Code Generation
Odessa .NET User Group - 10.11.2011 - Applied Code Generation Odessa .NET User Group - 10.11.2011 - Applied Code Generation
Odessa .NET User Group - 10.11.2011 - Applied Code Generation Dmytro Mindra
 
IT Brunch - 12.11.2011 - Myths about Design
IT Brunch - 12.11.2011 - Myths about DesignIT Brunch - 12.11.2011 - Myths about Design
IT Brunch - 12.11.2011 - Myths about DesignDmytro Mindra
 

More from Dmytro Mindra (20)

Introduction to Value Planning for iHUB
Introduction to Value Planning for iHUBIntroduction to Value Planning for iHUB
Introduction to Value Planning for iHUB
 
Mastering public speaking skills
Mastering public speaking skillsMastering public speaking skills
Mastering public speaking skills
 
Odessa .NET User Group - Kinect v2
Odessa .NET User Group - Kinect v2Odessa .NET User Group - Kinect v2
Odessa .NET User Group - Kinect v2
 
Building Windows Phone 8 Games With Unity3d
Building Windows Phone 8 Games With Unity3dBuilding Windows Phone 8 Games With Unity3d
Building Windows Phone 8 Games With Unity3d
 
IT Brunch - SpecFlow and Gherkin by Example
IT Brunch - SpecFlow and Gherkin by ExampleIT Brunch - SpecFlow and Gherkin by Example
IT Brunch - SpecFlow and Gherkin by Example
 
Odessa Pluralsight Study Group 28.11.2012
Odessa Pluralsight Study Group 28.11.2012Odessa Pluralsight Study Group 28.11.2012
Odessa Pluralsight Study Group 28.11.2012
 
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
 
Compilable Specifications - XPDays Ukraine 2012
Compilable Specifications - XPDays Ukraine 2012Compilable Specifications - XPDays Ukraine 2012
Compilable Specifications - XPDays Ukraine 2012
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
 
Lean Lego Game for Agileee 2012
Lean Lego Game for Agileee 2012Lean Lego Game for Agileee 2012
Lean Lego Game for Agileee 2012
 
Lohika .Net Day - What's new in Windows Azure
Lohika .Net Day - What's new in Windows AzureLohika .Net Day - What's new in Windows Azure
Lohika .Net Day - What's new in Windows Azure
 
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012
 
Lean Software Development
Lean Software DevelopmentLean Software Development
Lean Software Development
 
Craftsmanship - XP Days 2011
Craftsmanship - XP Days 2011Craftsmanship - XP Days 2011
Craftsmanship - XP Days 2011
 
Agile architecture
Agile architectureAgile architecture
Agile architecture
 
DCI
DCIDCI
DCI
 
Odessa .NET User Group - 10.11.2011 - Applied Code Generation
Odessa .NET User Group - 10.11.2011 - Applied Code Generation Odessa .NET User Group - 10.11.2011 - Applied Code Generation
Odessa .NET User Group - 10.11.2011 - Applied Code Generation
 
IT Brunch - 12.11.2011 - Myths about Design
IT Brunch - 12.11.2011 - Myths about DesignIT Brunch - 12.11.2011 - Myths about Design
IT Brunch - 12.11.2011 - Myths about Design
 

Code Contracts ABC 16.04.2011

  • 1. Проектирование по контракту DmytroMindra RnD Tech Lead LohikaLabs Киев, 2011
  • 2. Дополнение к докладу ВАЖНО: Можно работать на Visual Studio 2010 Professional. Для этого ставятся Code ContractsStandard Edition. Будет доступно все, кроме статического анализа. В Code Contracts Premium Edition доступен статический анализ контрактов.
  • 3. © Drake Emko & Jen Brodzik, 2001
  • 4. © Drake Emko & Jen Brodzik, 2001
  • 5. © Drake Emko & Jen Brodzik, 2001
  • 6. Northeast Blackout Северо-восточное отключение света 14 августа2003 12:15 p.m. Оператор компании MISO отключает систему прогнозирования проблем, чтобы подправить вручную данные и забывает ее включить в автоматическом режиме. 2:02 p.m. Отказала первая линия 345 кВ 2:14 p.m. Отказ системы оповещения (основной и резервной) 3:05 p.m. Отказ второй линии 345 кВ 3:17 p.m. Падение напряжения. Срабатывают контроллеры и перераспределяют нагрузку. 3:32 p.m. В результате перераспределения нагрузки выходит из строя еще одна линия 345 кВ. Начинается каскадный выход из строя перегруженных линий. Т.к. компании MISO и FirstEnergy не предупредили соседей о проблемах.
  • 7. 4:13 p.m. Конец каскадных отключений. 256 электростанций отключены. 55 миллионов людей без электричества более 24 часов.
  • 8. Ariane 5 (501) 4 июня 1996 года
  • 9. 37секунд полета US$370-500миллионовубытка US$ 7 миллиардовна разработку Задержка миссии ЕКА на 4года 64-bit floating point  => 16-bit signed integer Как же дублирование систем ? Резервная система пала жертвой той же ошибки. Главный модуль остался без данных. И принял неверное решение.
  • 10. 56 запусков 2 неудачных 2 частично неудачных 52 удачных запуска ЕКА запустили спутники при помощи Arian 5? Нет. Использовался Союз Фрегат.
  • 11.
  • 12. Ошибки в медицинском ПО Therac-25 c 1985 по 1987 6 несчастных случаев по вине ПО.[15] По ошибке программы MultidataSystemsInternational погибло 8 человек. 20 получили высокую дозу радиации. Физиотерапевты, ответственные за ручную проверку дозы, обвинены в убийстве. [15]
  • 13.
  • 19. public class FruitDealer    {        private readonly IFruitService _fruitService;        private double _dealerMoney;                public FruitDealer(IFruitService fruitService)         {             _fruitService = fruitService;        }        public IFruit SellFruit(double money)        {              _dealerMoney += money;            return _fruitService.GetFruit();        }    } // fruitService should not be null if (fruitService==null) throw new ArgumentNullException("fruitService"); // money should be >0 if (money<=0) throw new ArgumentOutOfRangeException("money");
  • 20. Недостатки Код с исключениями плохо подходит в качестве контрактов так как плохо читается. Этот подход невозможно привязать к интерфейсам. При перегрузке методов в наследниках придется заново прописывать проверки. Проверками невозможно/сложно управлять.
  • 22. Проектирование по контракту Не только хорошее слово А также нужное дело И зарегистрированная торговая марка Design by Contract
  • 23. Design by ContractTM Бертран Мейер Автор проектирования по контракту и языка Eifel. Автор 11 книг Включая“Object-Oriented Software Construction” Первое издание: 1988 Второе издание: 1997
  • 24. Контракт – это … метод проектирования программного обеспечения. Он предполагает, что проектировщик должен определить формальные, точные и верифицируемые спецификации интерфейсов для компонентов системы. При этом, кроме обычного определения абстрактных типов данных, также используются предусловия, постусловия и инварианты. Данные спецификации называются "контрактами" в соответствии с концептуальной метафорой условий и ответственностей в бизнес-контрактах. (wikipedia)
  • 25. Предусловия Проверяют правильно соблюдены ли условия контракта клиентом. Все ли параметры переданы и правильные ли им присвоены значения. GIGO (англ. GarbageIn, GarbageOut, «Мусор на входе — мусор на выходе») 
  • 26. Постусловия Проверяют возвращает ли поставщик именно то, что предписано контрактом. «Правильность» результата так сказать.
  • 27. Инварианты Инварианты проверяют не был ли поврежден поставщик в процессе выполнения метода. Соответствует ли его состояние после вызова метода контракту. И соответственно готов ли он к дальнейшей работе.
  • 28. Пример на EIFEL deposit (amount: INTEGER) is require non_negative: amount > 0 do balance := balance + amount ensure updated: balance = old balance + amount end
  • 30. Нужна Visual Studio 2010 (Premium , Ultimate) Декларативные контракты включеныв .NET 4.0 (System.Diagnostics.Contracts) Для полноценной работы нужно установить инструменты (CodeContract Tools). Инструменты включают в себя: generate runtime checking from the contracts(ccrewrite) do a static check that verifies contracts at compile-time (cccheck) add contracts to the XML documentation files (ccdoc) LOCATION: [Program Files]icrosoftontractsinbr />
  • 32. Наш первый контракт public class FruitDealer { private readonlyIFruitService_fruitService; private double _dealerMoney; public FruitDealer(IFruitServicefruitService) { Contract.Requires(fruitService!=null); _fruitService = fruitService; } public IFruitSellFruit(double money) { Contract.Requires(money > 0); Contract.Ensures(Contract.Result<IFruit>()!=null); _dealerMoney += money; return _fruitService.GetFruit(); } } Контракт Обязательстваклиента Обязательства поставщика
  • 33. Проверка №1 FruitDealerdealer1 = new FruitDealer(null);
  • 34. Проверка №2 FruitDealerdealer2 = new FruitDealer(new FruitService()); IFruitfruit2 = dealer2.SellFruit(-10);
  • 35. После установки инструментов появится новая вкладка
  • 36. System.Diagnostics.Contracts Contract Attributes ContractClassAttribute ContractClassForAttribute ContractInvariantMethodAttribute ContractPublicPropertyNameAttribute ContractReferenceAssemblyAttribute ContractRuntimeIgnoredAttribute ContractVerificationAttribute PureAttribute ( is not enforced by analysis tools ) ContractFailedEventArgs ContractFailureKind (enum)
  • 37. Основные методы Pre-conditions: Requires Post-conditions: Ensures Invariants: Invariant See also: EnsuresOnThrow<TException> Requires<TException>
  • 38. Давайте сравним     public class Customer {        private int _ID;        public int ID        {            get            {                return _ID;            }             set            {                 if (value <= 0) throw new ArgumentException();                 _ID = value;            }        }} public class Customer{    private int _ID;    public int ID    {        get        {            return _ID;        }        set         { Contract.Requires(value > 0);             _ID = value;        }    }} Было Стало
  • 41. Processing collections Integer range ForAll(Int32, Int32, Predicate<Int32>) Exists(Int32, Int32, Predicate<Int32>) Collection ForAll<T>(IEnumerable<T>, Predicate<T>) Exists<T>(IEnumerable<T>, Predicate<T>)
  • 45. Другие методы Assert – Проверка условия Assume – Влияет на статическую проверку, добавляя утверждение в базу фактов статического анализатора. Влияет только на статический анализ. Во время выполнения трактуется как Assert. [3] EndContractBlock - for legacy contracts
  • 46. Assert & Assume public void Invoke() { int x = CalculateSomeValues(); // Tell the checker to verify whether // x>0. // (The checker might // be unable to do it.) Contract.Assert( x>0 ); // Rest of the code } public void Invoke() { int x = CalculateSomeValues(); // Explicitly tell the checker that //x>0 Contract.Assume( x>0 ); // Rest of the code }
  • 47. Наследование Два правила[7] При наследовании и перегрузке метода, а также при реализации интерфейса, контракты наследуются. Нельзя добавить предусловия,но можно усилить постусловия и добавить инварианты. E.g was require x>10 Added require x>100 Now x = 20 fulfills 1st require but violates 2nd;
  • 49. Обработка ContractFailed Contract.ContractFailed +=  ContractContractFailed; static void ContractContractFailed( object sender, ContractFailedEventArgs e) {  e.SetHandled(); // exception handledConsole.WriteLine(e.Message);}
  • 51. custom contracts &custom rewriters methods public static class RuntimeFailureMethods {  public static void Requires(bool cond, string userMsg, string condText) { }  public static void Ensures(bool cond, string userMsg, string condText) { }… } See user manual 7.7. (page 34) [12]
  • 52. Code snippets crContract.Requires(...); ce Contract.Ensures(...); ci Contract.Invariant(...); More in user manual 6.3. (page 26) [12]
  • 54. Code Contracts инструкция страница 18 Нужна валидацияя аргументов в релизном коде нет да Допустимо использование contract tools нет да Используем предусловия везде. Включаем контракты только для дебага Requires<Ex> на публичных методах Requires везде Runtime на всех билдах Только предусловия и только на публичных методах. If-throw на публичных методах Помечаем их EndContractBlock Используем Requires везде Runtime checking только для отладочных сборок
  • 55. Как внедрять ? Только в тех случаях, когда другие разработчики могут пользоваться поставляемыми вами библиотеками. Только на публичных внешних методах. Только предусловия. Можно применять другие практики. Это инструмент разработчика.
  • 56. Выводы и перспективы CodeContracts активно развивается В BCL активно используются CodeContracts Статическая проверка CodeContracts могут положительно повлиять на архитектуру Дополнение к документации Еще один хороший инструмент ( Не единственный, а один из)
  • 57. PEX Path-based program exploration
  • 60. Книги Touch of Class: learning to program well with objects and contracts Object-Oriented Software Construction Object-Oriented Software Construction Bertrand Meyer 1988,1997
  • 61. Ссылки [1] Design by Contract - A Conversation with Bertrand Meyer, Part II by Bill Venners http://www.artima.com/intv/contracts.html [2] Defensive programming http://en.wikipedia.org/wiki/Defensive_programming [3] Dino Esposito, Code Contracts Preview: Preconditions http://dotnetslackers.com/articles/net/Code-Contracts-Preview-Preconditions.aspx [4] Dino Esposito, Code Contracts Preview: PostConditions http://dotnetslackers.com/articles/net/Code-Contracts-Preview-PostConditions.aspx [5] Dino Esposito, Code Contracts Preview: Invariants http://dotnetslackers.com/articles/net/Code-Contracts-Preview-Invariants.aspx [6] Dino Esposito, Code Contracts Preview: Assert & Assume http://dotnetslackers.com/articles/net/Code-Contracts-Preview-Assert-Assume.aspx [7] Jon Skeet, Code Contracts in C# http://www.infoq.com/articles/code-contracts-csharp [8] Design by Contract - Wikipedia http://en.wikipedia.org/wiki/Design_by_contract [9] Precondition - Wikipedia http://en.wikipedia.org/wiki/Precondition [10] Postcondition - Wikipedia http://en.wikipedia.org/wiki/Postcondition [11] Invariant - Wikipedia http://en.wikipedia.org/wiki/Invariant_(computer_science) [12] Code Contracts User Manual http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf [13] Code contracts and inheritance http://stefanoricciardi.com/2009/07/17/code-contracts-and-inheritance/ [14] Assertions in Managed Code http://msdn.microsoft.com/en-us/library/ttcc4x86.aspx [15] History's Worst Software Bugs http://www.wired.com/software/coolapps/news/2005/11/69355?currentPage=2