Download - Проектирование по контракту
Проектирование по контракту
Сергей Тепляков, 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
http://sergeyteplyakov.blogspot.com/