Upload
sergey-teplyakov
View
991
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Slides from dotnetconf conference about design by contract.
Citation preview
Проектирование по контракту
Сергей Тепляков, Visual C# MVP.NET Architect at Luxoft
SergeyTeplyakov.blogspot.com
4-я конференция .NET разработчиков28 апреля 2012
Контракты
http://www.flickr.com/photos/lofink/4501610335/
О чем поговорим?
• Базовые понятия контрактного программирования• Практические аспекты• Ограничения контрактов
Определение
Проектирование по контракту (Design by Contract, DbC) – это формализация отношений между программным компонентом и его клиентами
А нужно ли это?
Что скажите?
public interface IRepository{ Customer GetCustomer(string id); void SaveCustomer(Customer c);}
Стандартное решение
• «Комментарии не лгут»• На крайний случай «Use the Source
Luke!»
Давайте добавим немного формальности!
О корректности ПО
• Код сам по себе, не является корректным или некорректным!• Важна спецификация• «Задокументированный баг – это
фича!»
Утверждения в контрактах
• Предусловия• Постусловия• Инвариант класса• Утверждения• Инвариант цикла (Eiffel specific)
Внедрение спецификации в код
class Repository : IRepository{ public Customer GetCustomer(string id) { Contract.Requires(id != null); Contract.Ensures( Contract.Result<Customer>() != null); }}
Нарушения утверждений
• Нарушение предусловия – «баг» в клиенте коде• Нарушение постусловия, инварианта
или утверждения – «баг» в сервисе
Инструменты DbC
• Утверждения• Статический анализатор• Документация (DRY)
Контракты – это общее понятие, которое покрывает многие
известные ОО принципы
Принцип замещения Лисков
...если для каждого объекта o1 типа S существует объект o2 типа T такой, что для всех программ P, определенных в терминах T, поведение P не изменяется при замене o2 на o1, то S является подтипом (subtype) для T.
Принцип замещения Лисков
Метод Add
• ICollection.Add• IList.Add• Может ли метод добавлять 2
элемента?• Или не добавлять ни одного?
Правила наследования
• Наследник может• ослабевать предусловие• усиливать постусловие
• Инварианты суммируются
Отношение между типами
Ковариантность по типу возвращаемого значения
Другие примеры
• .NET/C#• Ковариантность массивов в .NET• Ковариантность/контравариантность
делегатов и интерфейсов• Java/C++• Ковариантность исключений• Ковариантность возвращаемых типов
Контракты vs Защитное программирование
Проверка предусловий
(2 открытых метода)
Проверка при каждом обращении к полю (27 мест!)
Code Contracts
• Частичная поддержка в .NET 4.0• Устанавливается отдельно:• Статический анализатор• Rewriter• Генератор документации
Утверждения и входные данные
Ограничения DbC
• Аккуратнее со статическим анализатором!• Не переусердствуйте в
формализации• Частичная поддержка Code Contracts
в .NET Framework
Важнейшие принципы DbC
• Разделение ответственности• Упрощение обязанностей• Обобщение существующих понятий• Формализация отношений
Дополнительные материалы
• Бертран Мейер, “Объектно-ориентированное конструирование программных систем”
• С. Тепляков, “Проектирование по контракту”, RSDN Magazine #1-2010• Programming Stuff. “Альтернативная проверка предусловий в
Code Contracts”• Programming Stuff. “Принцип замещения Лисков и контракты”• Programming Stuff. “Как не надо писать код”• Александр Бындю. “Дополнение к LSP”
Спасибо за внимание
Сергей Тепляков, Visual C# MVP.NET Architect at Luxoft
[email protected]://sergeyteplyakov.blogspot.com/