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

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

Upload: luxoft-training

Post on 28-Mar-2016

233 views

Category:

Documents


0 download

DESCRIPTION

28 апреля 2012 года в формате онлайн докладов прошла конференция .NET разработчиков, на которой представил свой доклад Сергей Тепляков, эксперт Luxoft Training по направлению .Net,С++ и архитектуре приложений.

TRANSCRIPT

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

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

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

SergeyTeplyakov.blogspot.com

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

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

Контракты

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

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

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

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

• Практические аспекты

• Ограничения контрактов

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

Определение

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

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

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

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

Что скажите?

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

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

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

• «Комментарии не лгут»

• На крайний случай «Use the Source Luke!»

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

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

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

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

• Код сам по себе, не является корректным или некорректным!

• Важна спецификация

• «Задокументированный баг – это фича!»

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

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

• Предусловия

• Постусловия

• Инвариант класса

• Утверждения

• Инвариант цикла (Eiffel specific)

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

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

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

Contract.Result<Customer>() != null); } }

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

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

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

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

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

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

• Утверждения

• Статический анализатор

• Документация (DRY)

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

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

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

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

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

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

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

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

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

Метод Add

• ICollection.Add

• IList.Add

• Может ли метод добавлять 2 элемента?

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

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

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

• Наследник может

• ослабевать предусловие

• усиливать постусловие

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

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

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

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

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

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

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

• .NET/C#

• Ковариантность массивов в .NET

• Ковариантность/контравариантность делегатов и интерфейсов

• Java/C++

• Ковариантность исключений

• Ковариантность возвращаемых типов

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

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

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

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

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

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

Code Contracts

• Частичная поддержка в .NET 4.0

• Устанавливается отдельно:

• Статический анализатор

• Rewriter

• Генератор документации

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

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

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

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

• Аккуратнее со статическим анализатором!

• Не переусердствуйте в формализации

• Частичная поддержка Code Contracts в .NET Framework

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

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

• Разделение ответственности

• Упрощение обязанностей

• Обобщение существующих понятий

• Формализация отношений

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

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

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

• С. Тепляков, “Проектирование по контракту”, RSDN Magazine #1-2010

• Programming Stuff. “Альтернативная проверка предусловий в Code Contracts”

• Programming Stuff. “Принцип замещения Лисков и контракты”

• Programming Stuff. “Как не надо писать код”

• Александр Бындю. “Дополнение к LSP”

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

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

Сергей Тепляков, Visual C# MVP

.NET Architect at Luxoft

[email protected]

http://sergeyteplyakov.blogspot.com/