Download - Design by Contract basics
![Page 1: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/1.jpg)
Проектирование по контракту
Сергей Тепляков, Visual C# MVP.NET Architect at Luxoft
SergeyTeplyakov.blogspot.com
4-я конференция .NET разработчиков28 апреля 2012
![Page 2: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/2.jpg)
Контракты
http://www.flickr.com/photos/lofink/4501610335/
![Page 3: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/3.jpg)
О чем поговорим?
• Базовые понятия контрактного программирования• Практические аспекты• Ограничения контрактов
![Page 4: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/4.jpg)
Определение
Проектирование по контракту (Design by Contract, DbC) – это формализация отношений между программным компонентом и его клиентами
![Page 5: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/5.jpg)
А нужно ли это?
![Page 6: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/6.jpg)
Что скажите?
public interface IRepository{ Customer GetCustomer(string id); void SaveCustomer(Customer c);}
![Page 7: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/7.jpg)
Стандартное решение
• «Комментарии не лгут»• На крайний случай «Use the Source
Luke!»
![Page 8: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/8.jpg)
Давайте добавим немного формальности!
![Page 9: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/9.jpg)
О корректности ПО
• Код сам по себе, не является корректным или некорректным!• Важна спецификация• «Задокументированный баг – это
фича!»
![Page 10: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/10.jpg)
Утверждения в контрактах
• Предусловия• Постусловия• Инвариант класса• Утверждения• Инвариант цикла (Eiffel specific)
![Page 11: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/11.jpg)
Внедрение спецификации в код
class Repository : IRepository{ public Customer GetCustomer(string id) { Contract.Requires(id != null); Contract.Ensures( Contract.Result<Customer>() != null); }}
![Page 12: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/12.jpg)
Нарушения утверждений
• Нарушение предусловия – «баг» в клиенте коде• Нарушение постусловия, инварианта
или утверждения – «баг» в сервисе
![Page 13: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/13.jpg)
Инструменты DbC
• Утверждения• Статический анализатор• Документация (DRY)
![Page 14: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/14.jpg)
Контракты – это общее понятие, которое покрывает многие
известные ОО принципы
![Page 15: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/15.jpg)
Принцип замещения Лисков
...если для каждого объекта o1 типа S существует объект o2 типа T такой, что для всех программ P, определенных в терминах T, поведение P не изменяется при замене o2 на o1, то S является подтипом (subtype) для T.
![Page 16: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/16.jpg)
Принцип замещения Лисков
![Page 17: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/17.jpg)
Метод Add
• ICollection.Add• IList.Add• Может ли метод добавлять 2
элемента?• Или не добавлять ни одного?
![Page 18: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/18.jpg)
Правила наследования
• Наследник может• ослабевать предусловие• усиливать постусловие
• Инварианты суммируются
![Page 19: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/19.jpg)
Отношение между типами
![Page 20: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/20.jpg)
Ковариантность по типу возвращаемого значения
![Page 21: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/21.jpg)
Другие примеры
• .NET/C#• Ковариантность массивов в .NET• Ковариантность/контравариантность
делегатов и интерфейсов• Java/C++• Ковариантность исключений• Ковариантность возвращаемых типов
![Page 22: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/22.jpg)
Контракты vs Защитное программирование
Проверка предусловий
(2 открытых метода)
Проверка при каждом обращении к полю (27 мест!)
![Page 23: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/23.jpg)
Code Contracts
• Частичная поддержка в .NET 4.0• Устанавливается отдельно:• Статический анализатор• Rewriter• Генератор документации
![Page 24: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/24.jpg)
Утверждения и входные данные
![Page 25: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/25.jpg)
Ограничения DbC
• Аккуратнее со статическим анализатором!• Не переусердствуйте в
формализации• Частичная поддержка Code Contracts
в .NET Framework
![Page 26: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/26.jpg)
Важнейшие принципы DbC
• Разделение ответственности• Упрощение обязанностей• Обобщение существующих понятий• Формализация отношений
![Page 27: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/27.jpg)
Дополнительные материалы
• Бертран Мейер, “Объектно-ориентированное конструирование программных систем”
• С. Тепляков, “Проектирование по контракту”, RSDN Magazine #1-2010• Programming Stuff. “Альтернативная проверка предусловий в
Code Contracts”• Programming Stuff. “Принцип замещения Лисков и контракты”• Programming Stuff. “Как не надо писать код”• Александр Бындю. “Дополнение к LSP”
![Page 28: Design by Contract basics](https://reader036.vdocument.in/reader036/viewer/2022062513/554f47d6b4c905b9508b465e/html5/thumbnails/28.jpg)
Спасибо за внимание
Сергей Тепляков, Visual C# MVP.NET Architect at Luxoft
[email protected]://sergeyteplyakov.blogspot.com/