Проектирование по контракту

Page 1

4-я конференция .NET разработчиков 28 апреля 2012

Проектирование по контракту Сергей Тепляков, Visual C# MVP .NET Architect at Luxoft SergeyTeplyakov.blogspot.com


Контракты

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 Sergey.Teplyakov@gmail.com http://sergeyteplyakov.blogspot.com/


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.