Design by Contract basics

Preview:

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.

Sergey
Может добавить рисунок? P - программу, объекты o1 и o2?

Принцип замещения Лисков

Метод 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.comhttp://sergeyteplyakov.blogspot.com/

Recommended