SlideShare una empresa de Scribd logo
1 de 28
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/

Más contenido relacionado

Destacado

гдоу 20 автор.пособия
гдоу 20 автор.пособиягдоу 20 автор.пособия
гдоу 20 автор.пособияudaloy
 
территория детского сада как образовательное пространство
территория детского сада  как образовательное пространствотерритория детского сада  как образовательное пространство
территория детского сада как образовательное пространствоudaloy
 
воисты цсгд 500
воисты цсгд 500воисты цсгд 500
воисты цсгд 500udaloy
 
№406
№406№406
№406udaloy
 
проект здоровья
проект здоровьяпроект здоровья
проект здоровьяudaloy
 
итоги работы нмц макарова
итоги работы нмц макароваитоги работы нмц макарова
итоги работы нмц макароваudaloy
 
Void safety on Kiev ALT.NET
Void safety on Kiev ALT.NETVoid safety on Kiev ALT.NET
Void safety on Kiev ALT.NETSergey Teplyakov
 
Тонкости асинхронного программирования
Тонкости асинхронного программированияТонкости асинхронного программирования
Тонкости асинхронного программированияSergey Teplyakov
 
MS SWIT 2013 Design for Testability
MS SWIT 2013 Design for TestabilityMS SWIT 2013 Design for Testability
MS SWIT 2013 Design for TestabilitySergey Teplyakov
 
презентация проектов 2010
презентация проектов 2010презентация проектов 2010
презентация проектов 2010udaloy
 
мо по игре пушкинского района
мо по игре пушкинского районамо по игре пушкинского района
мо по игре пушкинского районаudaloy
 
Ppt web3
Ppt web3Ppt web3
Ppt web3udaloy
 

Destacado (19)

гдоу 20 автор.пособия
гдоу 20 автор.пособиягдоу 20 автор.пособия
гдоу 20 автор.пособия
 
территория детского сада как образовательное пространство
территория детского сада  как образовательное пространствотерритория детского сада  как образовательное пространство
территория детского сада как образовательное пространство
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
воисты цсгд 500
воисты цсгд 500воисты цсгд 500
воисты цсгд 500
 
530
530530
530
 
№406
№406№406
№406
 
407
407407
407
 
464
464464
464
 
проект здоровья
проект здоровьяпроект здоровья
проект здоровья
 
итоги работы нмц макарова
итоги работы нмц макароваитоги работы нмц макарова
итоги работы нмц макарова
 
Visual studio toolbox
Visual studio toolboxVisual studio toolbox
Visual studio toolbox
 
Void safety on Kiev ALT.NET
Void safety on Kiev ALT.NETVoid safety on Kiev ALT.NET
Void safety on Kiev ALT.NET
 
Тонкости асинхронного программирования
Тонкости асинхронного программированияТонкости асинхронного программирования
Тонкости асинхронного программирования
 
MS SWIT 2013 Design for Testability
MS SWIT 2013 Design for TestabilityMS SWIT 2013 Design for Testability
MS SWIT 2013 Design for Testability
 
презентация проектов 2010
презентация проектов 2010презентация проектов 2010
презентация проектов 2010
 
мо по игре пушкинского района
мо по игре пушкинского районамо по игре пушкинского района
мо по игре пушкинского района
 
Ppt web3
Ppt web3Ppt web3
Ppt web3
 

Similar a Design by Contract basics

Повышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииПовышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииCEE-SEC(R)
 
C++ осень 2012 лекция 12
C++ осень 2012 лекция 12C++ осень 2012 лекция 12
C++ осень 2012 лекция 12Technopark
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практикеDenis Tuchin
 
Никита Ремизов - Введение в разработку ТЗ
Никита Ремизов - Введение в разработку ТЗНикита Ремизов - Введение в разработку ТЗ
Никита Ремизов - Введение в разработку ТЗDrupalSPB
 
Игорь Кашкута
Игорь КашкутаИгорь Кашкута
Игорь КашкутаCodeFest
 
MSDevCon 2016 DevOps Impact on Architecture
MSDevCon 2016 DevOps Impact on ArchitectureMSDevCon 2016 DevOps Impact on Architecture
MSDevCon 2016 DevOps Impact on ArchitectureSergey Baranov
 
Рефакторинг и второе рождение проекта на примере Zend Framework 2.0
Рефакторинг и второе рождение проекта на примере Zend Framework 2.0Рефакторинг и второе рождение проекта на примере Zend Framework 2.0
Рефакторинг и второе рождение проекта на примере Zend Framework 2.0AlexeyParhomenko
 
Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsAnton Vidishchev
 
Миграция кода с Magento 1 на Magento 2
Миграция кода с Magento 1 на Magento 2Миграция кода с Magento 1 на Magento 2
Миграция кода с Magento 1 на Magento 2Elogic Magento Development
 
Разработка в долг
Разработка в долгРазработка в долг
Разработка в долгVitebsk Miniq
 
Путь к чистому и компактному коду исполняемых спецификаций
Путь к чистому и компактному коду исполняемых спецификацийПуть к чистому и компактному коду исполняемых спецификаций
Путь к чистому и компактному коду исполняемых спецификацийVagif Abilov
 
Benefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controllBenefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controllMykyta Hopkalo
 
Что вас ждет на пути реализации Soa (Битрикс отступает)
Что вас ждет на пути реализации Soa (Битрикс отступает)Что вас ждет на пути реализации Soa (Битрикс отступает)
Что вас ждет на пути реализации Soa (Битрикс отступает)Василий Савунов
 
Виктор Розаев - Как не сломать обратную совместимость в Public API
Виктор Розаев - Как не сломать обратную совместимость в Public APIВиктор Розаев - Как не сломать обратную совместимость в Public API
Виктор Розаев - Как не сломать обратную совместимость в Public APIMoscowJS
 
Алексей Лустин. Непрерывная проверка качества кода.
Алексей Лустин. Непрерывная проверка качества кода.Алексей Лустин. Непрерывная проверка качества кода.
Алексей Лустин. Непрерывная проверка качества кода.ScrumTrek
 
ITmozg, Даниил Павлючков
ITmozg, Даниил ПавлючковITmozg, Даниил Павлючков
ITmozg, Даниил ПавлючковEYevseyeva
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDPavel Tsukanov
 
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs..."How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...Provectus
 
SCRUMopen Developer Max Kolodezniy
SCRUMopen Developer Max KolodezniySCRUMopen Developer Max Kolodezniy
SCRUMopen Developer Max KolodezniyAlexey Krivitsky
 

Similar a Design by Contract basics (20)

Повышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииПовышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документации
 
C++ осень 2012 лекция 12
C++ осень 2012 лекция 12C++ осень 2012 лекция 12
C++ осень 2012 лекция 12
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практике
 
Никита Ремизов - Введение в разработку ТЗ
Никита Ремизов - Введение в разработку ТЗНикита Ремизов - Введение в разработку ТЗ
Никита Ремизов - Введение в разработку ТЗ
 
Игорь Кашкута
Игорь КашкутаИгорь Кашкута
Игорь Кашкута
 
MSDevCon 2016 DevOps Impact on Architecture
MSDevCon 2016 DevOps Impact on ArchitectureMSDevCon 2016 DevOps Impact on Architecture
MSDevCon 2016 DevOps Impact on Architecture
 
Рефакторинг и второе рождение проекта на примере Zend Framework 2.0
Рефакторинг и второе рождение проекта на примере Zend Framework 2.0Рефакторинг и второе рождение проекта на примере Zend Framework 2.0
Рефакторинг и второе рождение проекта на примере Zend Framework 2.0
 
Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET Applications
 
Миграция кода с Magento 1 на Magento 2
Миграция кода с Magento 1 на Magento 2Миграция кода с Magento 1 на Magento 2
Миграция кода с Magento 1 на Magento 2
 
Разработка в долг
Разработка в долгРазработка в долг
Разработка в долг
 
Путь к чистому и компактному коду исполняемых спецификаций
Путь к чистому и компактному коду исполняемых спецификацийПуть к чистому и компактному коду исполняемых спецификаций
Путь к чистому и компактному коду исполняемых спецификаций
 
Benefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controllBenefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controll
 
Что вас ждет на пути реализации Soa (Битрикс отступает)
Что вас ждет на пути реализации Soa (Битрикс отступает)Что вас ждет на пути реализации Soa (Битрикс отступает)
Что вас ждет на пути реализации Soa (Битрикс отступает)
 
Виктор Розаев - Как не сломать обратную совместимость в Public API
Виктор Розаев - Как не сломать обратную совместимость в Public APIВиктор Розаев - Как не сломать обратную совместимость в Public API
Виктор Розаев - Как не сломать обратную совместимость в Public API
 
Алексей Лустин. Непрерывная проверка качества кода.
Алексей Лустин. Непрерывная проверка качества кода.Алексей Лустин. Непрерывная проверка качества кода.
Алексей Лустин. Непрерывная проверка качества кода.
 
ITmozg, Даниил Павлючков
ITmozg, Даниил ПавлючковITmozg, Даниил Павлючков
ITmozg, Даниил Павлючков
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLID
 
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs..."How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
 
C# 3.0
C# 3.0C# 3.0
C# 3.0
 
SCRUMopen Developer Max Kolodezniy
SCRUMopen Developer Max KolodezniySCRUMopen Developer Max Kolodezniy
SCRUMopen Developer Max Kolodezniy
 

Design by Contract basics

Notas del editor

  1. Такие слова, как «формализация» или «спецификация» чужды и страшны большинству разработчиков. Сразу же возникает вопрос: а стоит ли затевать весь этот сыр-бор ради этого? Чем не подходят старые, проверенные временем практики, без всяких там контрактов?
  2. А что если описать отношения между классом (или интерфейсом) и его клиентами более формальным образом.Например, можно сказать, что я сделаю свою работу, но только в том случае, если свою работу сделает вызывающий код.Таким образом, мы четко разделим отношения класса и его клиенты; каждый из них будет точно знать, на что рассчитывать от другой стороны и не будет перепроверять это по десять раз.Кстати, обратите внимание, что я не говорю о тотальной формализации отношений, зачастую достаточно разделить эти обязанности в вашей голове, чтобы такое разделение нашло отражение в вашем коде и дизайне.Но прежде чем переходить к способам разделения ответственностей, давайте рассмотрим еще одну важную характеристику.Я думаю, что многие разработчики спорят друг с другом во время код или дизайн ревью (или с представителями отдела качества) о том, содержит ли баг некоторый фрагмент кода или нет.
  3. Сейчас существует огромное множество различных паттернов, принципов, идиом, которые должны помочь в создании хорошего дизайна. Я ничего не имею, например, против принципов SOLID, но у меня есть совет, как их лучше запомнить и, главное, как ими лучше пользоваться на практике.На самом деле, контрактное программирование (прошу, не путайте с конкретными библиотеками, типа Code Contracts) – это отличный инструмент в борьбе за хороший дизайн.Для начала, давайте рассмотрим один из SOLID принципов: принцип замещения Лисков. Именно на нем строится очень важный аспект любой ОО модели, поскольку он лежит в основе полиморфного поведения.Может стоит сказать о том, что в самой навороченной книге по ООП – в книге Бертрана Мейера описано очень мало разных принципов. Из известных есть только Open Closed.