SlideShare a Scribd company logo
Проектирование по контрактуDmytroMindraRnD Tech LeadLohikaLabsКиев, 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 августа200312: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?Нет. Использовался Союз Фрегат.
Code Contracts ABC 16.04.2011
Ошибки в медицинском ПОTherac-25 c 1985 по 1987 6 несчастных случаев по вине ПО.[15]По ошибке программы MultidataSystemsInternational погибло 8 человек. 20 получили высокую дозу радиации. Физиотерапевты, ответственные за ручную проверку дозы, обвинены в убийстве. [15]
Code Contracts ABC 16.04.2011
Так должно быть
А так есть
ОПАСНАЯ ТОРГОВЛЯ ФРУКТАМИ
    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 nullif (fruitService==null)     	throw new ArgumentNullException("fruitService");// money should be >0if (money<=0)	throw new ArgumentOutOfRangeException("money");
НедостаткиКод с исключениями плохо подходит в качестве контрактов так как плохо читается.Этот подход невозможно привязать к интерфейсам.При перегрузке методов в наследниках придется заново прописывать проверки.Проверками невозможно/сложно управлять.
Проекированиепо контракту
Проектирование по контрактуНе только хорошее словоА также нужное делоИ зарегистрированная торговая маркаDesign by Contract
Design by ContractTMБертран МейерАвтор проектирования по контракту и языка Eifel.  Автор 11 книгВключая“Object-Oriented Software Construction”Первое издание: 1988Второе издание: 1997
Контракт – это …метод проектирования программного обеспечения. Он предполагает, что проектировщик должен определить формальные, точные и верифицируемые спецификации интерфейсов для компонентов системы. При этом, кроме обычного определения абстрактных типов данных, также используются предусловия, постусловия и инварианты. Данные спецификации называются "контрактами" в соответствии с концептуальной метафорой условий и ответственностей в бизнес-контрактах. (wikipedia)
ПредусловияПроверяют правильно соблюдены ли условия контракта клиентом. Все ли параметры переданы и правильные ли им присвоены значения.GIGO (англ. GarbageIn, GarbageOut, «Мусор на входе — мусор на выходе») 
ПостусловияПроверяют возвращает ли поставщик именно то, что предписано контрактом. «Правильность»  результата так сказать.
ИнвариантыИнварианты проверяют не был ли поврежден поставщик в процессе выполнения метода. Соответствует ли его состояние после вызова метода контракту. И соответственно готов ли он к дальнейшей работе.
Пример на EIFELdeposit (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]\Microsoft\Contracts\Bin\
Где наш диллер
Наш первый контракт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();        }    }КонтрактОбязательстваклиентаОбязательства поставщика
Проверка №1FruitDealerdealer1 = new FruitDealer(null);
Проверка №2FruitDealerdealer2 = new FruitDealer(new FruitService());IFruitfruit2 = dealer2.SellFruit(-10);
После установки инструментов появится новая вкладка
System.Diagnostics.ContractsContractAttributesContractClassAttributeContractClassForAttributeContractInvariantMethodAttributeContractPublicPropertyNameAttributeContractReferenceAssemblyAttributeContractRuntimeIgnoredAttributeContractVerificationAttributePureAttribute ( is not enforced by analysis tools )ContractFailedEventArgsContractFailureKind (enum)
Основные методыPre-conditions: 	RequiresPost-conditions: 	EnsuresInvariants: 		InvariantSee 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 collectionsInteger rangeForAll(Int32, Int32, Predicate<Int32>)Exists(Int32, Int32, Predicate<Int32>)CollectionForAll<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 & Assumepublic 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>10Added require x>100Now x = 20 fulfills 1st require but violates 2nd;
Демонстрация: наследование и ловушки
Обработка ContractFailedContract.ContractFailed += ContractContractFailed;static void ContractContractFailed(		object sender, ContractFailedEventArgs e) { 		e.SetHandled(); // exception handledConsole.WriteLine(e.Message);}
ДемонстрацияContractFailed
custom contracts &custom rewriters methodspublic 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 snippetscrContract.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 могут положительно повлиять на архитектуруДополнение к документацииЕще один хороший инструмент	( Не единственный, а один из)
PEXPath-based program exploration
Демонстрация PEX
СПАСИБО !Вопросы ?
КнигиTouch of Class: learning to program well with objects and contractsObject-Oriented Software ConstructionObject-Oriented Software ConstructionBertrand Meyer1988,1997
Ссылки[1] Design by Contract - A Conversation with Bertrand Meyer, Part II by Bill Vennershttp://www.artima.com/intv/contracts.html[2] Defensive programminghttp://en.wikipedia.org/wiki/Defensive_programming[3] Dino Esposito, Code Contracts Preview: Preconditionshttp://dotnetslackers.com/articles/net/Code-Contracts-Preview-Preconditions.aspx[4] Dino Esposito, Code Contracts Preview: PostConditionshttp://dotnetslackers.com/articles/net/Code-Contracts-Preview-PostConditions.aspx[5] Dino Esposito, Code Contracts Preview: Invariantshttp://dotnetslackers.com/articles/net/Code-Contracts-Preview-Invariants.aspx[6] Dino Esposito, Code Contracts Preview: Assert & Assumehttp://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 - Wikipediahttp://en.wikipedia.org/wiki/Design_by_contract[9] Precondition - Wikipediahttp://en.wikipedia.org/wiki/Precondition[10] Postcondition - Wikipediahttp://en.wikipedia.org/wiki/Postcondition[11] Invariant - Wikipediahttp://en.wikipedia.org/wiki/Invariant_(computer_science)[12] Code Contracts User Manualhttp://research.microsoft.com/en-us/projects/contracts/userdoc.pdf[13] Code contracts and inheritancehttp://stefanoricciardi.com/2009/07/17/code-contracts-and-inheritance/[14] Assertions in Managed Codehttp://msdn.microsoft.com/en-us/library/ttcc4x86.aspx[15] History's Worst Software Bugshttp://www.wired.com/software/coolapps/news/2005/11/69355?currentPage=2

More Related Content

PPTX
Unit tests final
PPTX
Современный статический анализ кода: что умеет он, чего не умели линтеры
PPTX
PDF
C++ refelection and cats
PDF
Шишки, набитые за 15 лет использования акторов в C++
PPTX
Bytecode
PPTX
Legacy: как победить в гонке (Joker)
PDF
Как работают оптимизации компилятора
Unit tests final
Современный статический анализ кода: что умеет он, чего не умели линтеры
C++ refelection and cats
Шишки, набитые за 15 лет использования акторов в C++
Bytecode
Legacy: как победить в гонке (Joker)
Как работают оптимизации компилятора

What's hot (20)

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

Viewers also liked (19)

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

Similar to Code Contracts ABC 16.04.2011 (10)

PPTX
Design by Contract
PPTX
Проектирование по контракту
PPTX
Design by Contract basics
PPTX
Code Contracts
PPTX
Олег Блохин, Контракт с дьяволом
PDF
Аспектно-Ориентированный Подход
PDF
Надежные смарт контракты #spblockchain
PPTX
TMPA-2013 Tsytelov Trifanov Devexperts
PPTX
Deep Dive C# by Sergey Teplyakov
PPTX
Контрактное программирование
Design by Contract
Проектирование по контракту
Design by Contract basics
Code Contracts
Олег Блохин, Контракт с дьяволом
Аспектно-Ориентированный Подход
Надежные смарт контракты #spblockchain
TMPA-2013 Tsytelov Trifanov Devexperts
Deep Dive C# by Sergey Teplyakov
Контрактное программирование

More from Dmytro Mindra (20)

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

Code Contracts ABC 16.04.2011