design by contract basics

28
Проектирование по контракту Сергей Тепляков, Visual C# MVP .NET Architect at Luxoft SergeyTeplyakov.blogspot.com 4-я конференция .NET разработчиков 28 апреля 2012

Upload: sergey-teplyakov

Post on 10-May-2015

990 views

Category:

Documents


0 download

DESCRIPTION

Slides from dotnetconf conference about design by contract.

TRANSCRIPT

Page 1: Design by Contract basics

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

Сергей Тепляков, Visual C# MVP.NET Architect at Luxoft

SergeyTeplyakov.blogspot.com

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

Page 2: Design by Contract basics

Контракты

http://www.flickr.com/photos/lofink/4501610335/

Page 3: Design by Contract basics

О чем поговорим?

• Базовые понятия контрактного программирования• Практические аспекты• Ограничения контрактов

Page 4: Design by Contract basics

Определение

Проектирование по контракту (Design by Contract, DbC) – это формализация отношений между программным компонентом и его клиентами

Page 5: Design by Contract basics

А нужно ли это?

Page 6: Design by Contract basics

Что скажите?

public interface IRepository{    Customer GetCustomer(string id);    void SaveCustomer(Customer c);}

Page 7: Design by Contract basics

Стандартное решение

• «Комментарии не лгут»• На крайний случай «Use the Source

Luke!»

Page 8: Design by Contract basics

Давайте добавим немного формальности!

Page 9: Design by Contract basics

О корректности ПО

• Код сам по себе, не является корректным или некорректным!• Важна спецификация• «Задокументированный баг – это

фича!»

Page 10: Design by Contract basics

Утверждения в контрактах

• Предусловия• Постусловия• Инвариант класса• Утверждения• Инвариант цикла (Eiffel specific)

Page 11: Design by Contract basics

Внедрение спецификации в код

class Repository : IRepository{    public Customer GetCustomer(string id)    {        Contract.Requires(id != null);        Contract.Ensures( Contract.Result<Customer>() != null);    }}

Page 12: Design by Contract basics

Нарушения утверждений

• Нарушение предусловия – «баг» в клиенте коде• Нарушение постусловия, инварианта

или утверждения – «баг» в сервисе

Page 13: Design by Contract basics

Инструменты DbC

• Утверждения• Статический анализатор• Документация (DRY)

Page 14: Design by Contract basics

Контракты – это общее понятие, которое покрывает многие

известные ОО принципы

Page 15: Design by Contract basics

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

...если для каждого объекта o1 типа S существует объект o2 типа T такой, что для всех программ P, определенных в терминах T, поведение P не изменяется при замене o2 на o1, то S является подтипом (subtype) для T.

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

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

Page 17: Design by Contract basics

Метод Add

• ICollection.Add• IList.Add• Может ли метод добавлять 2

элемента?• Или не добавлять ни одного?

Page 18: Design by Contract basics

Правила наследования

• Наследник может• ослабевать предусловие• усиливать постусловие

• Инварианты суммируются

Page 19: Design by Contract basics

Отношение между типами

Page 20: Design by Contract basics

Ковариантность по типу возвращаемого значения

Page 21: Design by Contract basics

Другие примеры

• .NET/C#• Ковариантность массивов в .NET• Ковариантность/контравариантность

делегатов и интерфейсов• Java/C++• Ковариантность исключений• Ковариантность возвращаемых типов

Page 22: Design by Contract basics

Контракты vs Защитное программирование

Проверка предусловий

(2 открытых метода)

Проверка при каждом обращении к полю (27 мест!)

Page 23: Design by Contract basics

Code Contracts

• Частичная поддержка в .NET 4.0• Устанавливается отдельно:• Статический анализатор• Rewriter• Генератор документации

Page 24: Design by Contract basics

Утверждения и входные данные

Page 25: Design by Contract basics

Ограничения DbC

• Аккуратнее со статическим анализатором!• Не переусердствуйте в

формализации• Частичная поддержка Code Contracts

в .NET Framework

Page 26: Design by Contract basics

Важнейшие принципы DbC

• Разделение ответственности• Упрощение обязанностей• Обобщение существующих понятий• Формализация отношений

Page 27: Design by Contract basics

Дополнительные материалы

• Бертран Мейер, “Объектно-ориентированное конструирование программных систем”

• С. Тепляков, “Проектирование по контракту”, RSDN Magazine #1-2010• Programming Stuff. “Альтернативная проверка предусловий в

Code Contracts”• Programming Stuff. “Принцип замещения Лисков и контракты”• Programming Stuff. “Как не надо писать код”• Александр Бындю. “Дополнение к LSP”

Page 28: Design by Contract basics

Спасибо за внимание

Сергей Тепляков, Visual C# MVP.NET Architect at Luxoft

[email protected]://sergeyteplyakov.blogspot.com/