SlideShare a Scribd company logo
1 of 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/

More Related Content

Viewers also liked

C# .net lecture 4 win forms
C# .net lecture 4 win formsC# .net lecture 4 win forms
C# .net lecture 4 win formsDoron Raifman
 
NHibernate. Диагностирование и решение конфликтов одновременной записи данных
NHibernate. Диагностирование и решение конфликтов одновременной записи данныхNHibernate. Диагностирование и решение конфликтов одновременной записи данных
NHibernate. Диагностирование и решение конфликтов одновременной записи данныхAlexander Byndyu
 
Структурирование тестов по принципу Arrange-Act-Assert
Структурирование тестов по принципу Arrange-Act-AssertСтруктурирование тестов по принципу Arrange-Act-Assert
Структурирование тестов по принципу Arrange-Act-AssertAlexander Byndyu
 
C# Desktop. Занятие 08.
C# Desktop. Занятие 08.C# Desktop. Занятие 08.
C# Desktop. Занятие 08.Igor Shkulipa
 

Viewers also liked (7)

C# .net lecture 4 win forms
C# .net lecture 4 win formsC# .net lecture 4 win forms
C# .net lecture 4 win forms
 
NHibernate. Диагностирование и решение конфликтов одновременной записи данных
NHibernate. Диагностирование и решение конфликтов одновременной записи данныхNHibernate. Диагностирование и решение конфликтов одновременной записи данных
NHibernate. Диагностирование и решение конфликтов одновременной записи данных
 
Practical CQRS
Practical CQRSPractical CQRS
Practical CQRS
 
Структурирование тестов по принципу Arrange-Act-Assert
Структурирование тестов по принципу Arrange-Act-AssertСтруктурирование тестов по принципу Arrange-Act-Assert
Структурирование тестов по принципу Arrange-Act-Assert
 
Design & Process Models
Design & Process ModelsDesign & Process Models
Design & Process Models
 
NPAPI
NPAPINPAPI
NPAPI
 
C# Desktop. Занятие 08.
C# Desktop. Занятие 08.C# Desktop. Занятие 08.
C# Desktop. Занятие 08.
 

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

Повышение качества тестов и автоматическая валидация 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 to Проектирование по контракту (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
 

More from Alexander Byndyu

Инфраструктура для совместной предпроктной работы IT-компаний и реального ...
Инфраструктура для совместной предпроктной работы IT-компаний и реального ...Инфраструктура для совместной предпроктной работы IT-компаний и реального ...
Инфраструктура для совместной предпроктной работы IT-компаний и реального ...Alexander Byndyu
 
Применение low-code платформ в энтерпрайзе
Применение low-code платформ в энтерпрайзеПрименение low-code платформ в энтерпрайзе
Применение low-code платформ в энтерпрайзеAlexander Byndyu
 
Антихрупкость в IT или как полюбить изменения
Антихрупкость в IT или как полюбить измененияАнтихрупкость в IT или как полюбить изменения
Антихрупкость в IT или как полюбить измененияAlexander Byndyu
 
Карта гипотез как метод стратегического планирования
Карта гипотез как метод стратегического планированияКарта гипотез как метод стратегического планирования
Карта гипотез как метод стратегического планированияAlexander Byndyu
 
Как перейти от проектного мышления к продуктовому. Опыт из заказной разработки
Как перейти от проектного мышления к продуктовому. Опыт из заказной разработкиКак перейти от проектного мышления к продуктовому. Опыт из заказной разработки
Как перейти от проектного мышления к продуктовому. Опыт из заказной разработкиAlexander Byndyu
 
История о том, как техническое задание подменяет цель проекта
История о том, как техническое задание подменяет цель проектаИстория о том, как техническое задание подменяет цель проекта
История о том, как техническое задание подменяет цель проектаAlexander Byndyu
 
Шпаргалка по IT-миру для предпринимателя
Шпаргалка по IT-миру для предпринимателяШпаргалка по IT-миру для предпринимателя
Шпаргалка по IT-миру для предпринимателяAlexander Byndyu
 
Микросервисы, чистый PaaS и конкурс Мисс Россия
Микросервисы, чистый PaaS и конкурс Мисс РоссияМикросервисы, чистый PaaS и конкурс Мисс Россия
Микросервисы, чистый PaaS и конкурс Мисс РоссияAlexander Byndyu
 
IT-директор на аутсорсе
IT-директор на аутсорсеIT-директор на аутсорсе
IT-директор на аутсорсеAlexander Byndyu
 
Бизнес-гибкость через микросервисную архитектуру
Бизнес-гибкость через микросервисную архитектуруБизнес-гибкость через микросервисную архитектуру
Бизнес-гибкость через микросервисную архитектуруAlexander Byndyu
 
Impact Mapping на практике v2
Impact Mapping на практике v2Impact Mapping на практике v2
Impact Mapping на практике v2Alexander Byndyu
 
Кнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаКнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаAlexander Byndyu
 
Пять самых важных составляющих процесса выпуска продуктов
Пять самых важных составляющих процесса выпуска продуктовПять самых важных составляющих процесса выпуска продуктов
Пять самых важных составляющих процесса выпуска продуктовAlexander Byndyu
 
Пять самых важных составляющих процесса выпуска проектов
Пять самых важных составляющих процесса выпуска проектовПять самых важных составляющих процесса выпуска проектов
Пять самых важных составляющих процесса выпуска проектовAlexander Byndyu
 
Impact mapping in practice
Impact mapping in practiceImpact mapping in practice
Impact mapping in practiceAlexander Byndyu
 
Impact Mapping на практике
Impact Mapping на практикеImpact Mapping на практике
Impact Mapping на практикеAlexander Byndyu
 
Customer satisfaction для программистов
Customer satisfaction для программистовCustomer satisfaction для программистов
Customer satisfaction для программистовAlexander Byndyu
 
CQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафорCQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафорAlexander Byndyu
 
Как размножается Sphinx
Как размножается SphinxКак размножается Sphinx
Как размножается SphinxAlexander Byndyu
 

More from Alexander Byndyu (20)

Инфраструктура для совместной предпроктной работы IT-компаний и реального ...
Инфраструктура для совместной предпроктной работы IT-компаний и реального ...Инфраструктура для совместной предпроктной работы IT-компаний и реального ...
Инфраструктура для совместной предпроктной работы IT-компаний и реального ...
 
Применение low-code платформ в энтерпрайзе
Применение low-code платформ в энтерпрайзеПрименение low-code платформ в энтерпрайзе
Применение low-code платформ в энтерпрайзе
 
Антихрупкость в IT или как полюбить изменения
Антихрупкость в IT или как полюбить измененияАнтихрупкость в IT или как полюбить изменения
Антихрупкость в IT или как полюбить изменения
 
Карта гипотез как метод стратегического планирования
Карта гипотез как метод стратегического планированияКарта гипотез как метод стратегического планирования
Карта гипотез как метод стратегического планирования
 
Как перейти от проектного мышления к продуктовому. Опыт из заказной разработки
Как перейти от проектного мышления к продуктовому. Опыт из заказной разработкиКак перейти от проектного мышления к продуктовому. Опыт из заказной разработки
Как перейти от проектного мышления к продуктовому. Опыт из заказной разработки
 
История о том, как техническое задание подменяет цель проекта
История о том, как техническое задание подменяет цель проектаИстория о том, как техническое задание подменяет цель проекта
История о том, как техническое задание подменяет цель проекта
 
Шпаргалка по IT-миру для предпринимателя
Шпаргалка по IT-миру для предпринимателяШпаргалка по IT-миру для предпринимателя
Шпаргалка по IT-миру для предпринимателя
 
Микросервисы, чистый PaaS и конкурс Мисс Россия
Микросервисы, чистый PaaS и конкурс Мисс РоссияМикросервисы, чистый PaaS и конкурс Мисс Россия
Микросервисы, чистый PaaS и конкурс Мисс Россия
 
IT-директор на аутсорсе
IT-директор на аутсорсеIT-директор на аутсорсе
IT-директор на аутсорсе
 
Бизнес-гибкость через микросервисную архитектуру
Бизнес-гибкость через микросервисную архитектуруБизнес-гибкость через микросервисную архитектуру
Бизнес-гибкость через микросервисную архитектуру
 
Impact Mapping на практике v2
Impact Mapping на практике v2Impact Mapping на практике v2
Impact Mapping на практике v2
 
Кнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаКнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продукта
 
Пять самых важных составляющих процесса выпуска продуктов
Пять самых важных составляющих процесса выпуска продуктовПять самых важных составляющих процесса выпуска продуктов
Пять самых важных составляющих процесса выпуска продуктов
 
Пять самых важных составляющих процесса выпуска проектов
Пять самых важных составляющих процесса выпуска проектовПять самых важных составляющих процесса выпуска проектов
Пять самых важных составляющих процесса выпуска проектов
 
Час Кода 2015
Час Кода 2015Час Кода 2015
Час Кода 2015
 
Impact mapping in practice
Impact mapping in practiceImpact mapping in practice
Impact mapping in practice
 
Impact Mapping на практике
Impact Mapping на практикеImpact Mapping на практике
Impact Mapping на практике
 
Customer satisfaction для программистов
Customer satisfaction для программистовCustomer satisfaction для программистов
Customer satisfaction для программистов
 
CQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафорCQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафор
 
Как размножается Sphinx
Как размножается SphinxКак размножается Sphinx
Как размножается Sphinx
 

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

Editor's Notes

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