2. Дополнение к докладу ВАЖНО: Можно работать на Visual Studio 2010 Professional. Для этого ставятся Code ContractsStandard Edition. Будет доступно все, кроме статического анализа. В Code Contracts Premium Edition доступен статический анализ контрактов.
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 часов.
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]
20. Недостатки Код с исключениями плохо подходит в качестве контрактов так как плохо читается. Этот подход невозможно привязать к интерфейсам. При перегрузке методов в наследниках придется заново прописывать проверки. Проверками невозможно/сложно управлять.
22. Проектирование по контракту Не только хорошее слово А также нужное дело И зарегистрированная торговая марка Design by Contract
23. Design by ContractTM Бертран Мейер Автор проектирования по контракту и языка Eifel. Автор 11 книг Включая“Object-Oriented Software Construction” Первое издание: 1988 Второе издание: 1997
24. Контракт – это … метод проектирования программного обеспечения. Он предполагает, что проектировщик должен определить формальные, точные и верифицируемые спецификации интерфейсов для компонентов системы. При этом, кроме обычного определения абстрактных типов данных, также используются предусловия, постусловия и инварианты. Данные спецификации называются "контрактами" в соответствии с концептуальной метафорой условий и ответственностей в бизнес-контрактах. (wikipedia)
25. Предусловия Проверяют правильно соблюдены ли условия контракта клиентом. Все ли параметры переданы и правильные ли им присвоены значения. GIGO (англ. GarbageIn, GarbageOut, «Мусор на входе — мусор на выходе»)
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(); } } Контракт Обязательстваклиента Обязательства поставщика
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; } }} Было Стало
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;
54. Code Contracts инструкция страница 18 Нужна валидацияя аргументов в релизном коде нет да Допустимо использование contract tools нет да Используем предусловия везде. Включаем контракты только для дебага Requires<Ex> на публичных методах Requires везде Runtime на всех билдах Только предусловия и только на публичных методах. If-throw на публичных методах Помечаем их EndContractBlock Используем Requires везде Runtime checking только для отладочных сборок
55. Как внедрять ? Только в тех случаях, когда другие разработчики могут пользоваться поставляемыми вами библиотеками. Только на публичных внешних методах. Только предусловия. Можно применять другие практики. Это инструмент разработчика.
56. Выводы и перспективы CodeContracts активно развивается В BCL активно используются CodeContracts Статическая проверка CodeContracts могут положительно повлиять на архитектуру Дополнение к документации Еще один хороший инструмент ( Не единственный, а один из)
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