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/