SlideShare a Scribd company logo
КОНТРАКТНОЕ
ПРОГРАММИРОВАНИЕ
Самунь Виктор
Имеющиеся проблемы в Perl
• Perl слабо типизирован
• Тип данных определяется динамически
• Слабые возможности прототипов функций
Проблемы при программировании
• Изменение API
• Изменение типов данных
• Проверка данных
• Контекст
Решение проблем (возможное)
• Документация
• Тестирование
Контрактное программирование
• Метод проектирования ПО


• Предложено Бертраном Мейером при разработке Eiffel
• 1986 год


• Возникло из:
   • Формальной спецификации
   • Формальной верификации
   • Логики Хоара


• По контракту можно сгенерировать документацию
Что задаёт контракт?
• Типы данных
• Предусловие   (precondition)
• Инвариант     (invariant)
• Постусловие   (postcondition)
Последовательность проверки
1.   Предусловие
2.   Инвариант
3.   Вызов функции
4.   Инвариант
5.   Постусловие
Какие языки имеют нужные средства?
• Eiffel          • C (DBC for C)
•D                • C++ (Contract++)
• Spec#           • C# (Code Contracts)
• SeC             • Java (jContractor)
•…                • Perl (Class::Contract)
                  •…
Class::Contract
Определение классов
package ClassName;
contract {
  # Спецификация атрибутов и методов
  # класса ClassName
};
Конструктор и деструктор
contract {
  ctor ‘new’;
    impl { ... };

  dtor;
    impl { ... };
};

$x = new MyClass;
Инварианты класса
contract {
  invar { ... };
    failmsg ‘Contract failed on %s’;
};
Определение атрибутов
contract {
  attr ‘scalar_attr’;
  attr ‘yet_scalar’ => SCALAR;
  attr ‘array_attr’ => ARRAY;
  attr ‘hash_attr’ => HASH;
  attr ‘obj_attr’ => SomeClass;
};
Определение методов
contract {
  method ‘my_method’;
    impl { ... };
};

&self
Пред- и пост- условия (атрибуты)
contract {
  attr ‘my_attr’;
    pre { ... };
      failmsg ‘Fail Message’;
    post { ... };
      failmsg ‘Fail Message’;
};

&value
&old
Пред- и пост- условия (методы)
contract {
  method ‘my_meth’;
    pre { ... };
      failmsg ‘Fail Message’;
    post { ... };
      failmsg ‘Fail Message’;
    impl { ... };
};

&self
&old
Пример
package MyClass;
use Class::Contract;

contract {
  ctor 'new';

 attr 'val' => SCALAR;
   pre { $_[0] =~ /^d*$/; };

 method 'm1';
   pre { $_ [0] =~ /^d+0$/ };
   impl { ${self->val} += $_ [0]; };

  method 'm2';
    impl { ${self->val} ++; };
    post { ${self->val} < 100; };
};
Пример

use MyClass;        use MyClass;

$x = new MyClass;   $x = new MyClass;
$x->m1 (40);        $x->m1 (400);
print ${$x->val};   print ${$x->val};
$x->m2;             $x->m2;
print ${$x->val};   print ${$x->val};

> perl 1.pl         > perl 1.pl
40                  400
41                  Post-condition at
                    MyClass.pm line 16 failed
                     at 1.pl line 6
Что есть ещё?
• Sub::Contract
• Class::Agreement
Спасибо за внимание!
     Вопросы?

More Related Content

What's hot

Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
Ilia Shishkov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
Pavel Tsukanov
 
Rambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеров
RAMBLER&Co
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
Sergey Platonov
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
Moscow.pm
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Sergey Platonov
 
What’s New in PHP7?
What’s New in PHP7?What’s New in PHP7?
What’s New in PHP7?
GlobalLogic Ukraine
 
Haskell
HaskellHaskell
Haskell
DevDay
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grailsguest32215a
 
JavaScript. Basics (in russian)
JavaScript. Basics (in russian)JavaScript. Basics (in russian)
JavaScript. Basics (in russian)Mikhail Davydov
 
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work» Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
LogeekNightUkraine
 
Concepts lite
Concepts liteConcepts lite
Concepts lite
Platonov Sergey
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Platonov Sergey
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
corehard_by
 
Нетривиальная обработка ошибок
Нетривиальная обработка ошибокНетривиальная обработка ошибок
Нетривиальная обработка ошибок
oelifantiev
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
Python Meetup
 

What's hot (18)

Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Rambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеров
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
What’s New in PHP7?
What’s New in PHP7?What’s New in PHP7?
What’s New in PHP7?
 
Haskell
HaskellHaskell
Haskell
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
JavaScript. Basics (in russian)
JavaScript. Basics (in russian)JavaScript. Basics (in russian)
JavaScript. Basics (in russian)
 
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work» Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
 
Concepts lite
Concepts liteConcepts lite
Concepts lite
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
Нетривиальная обработка ошибок
Нетривиальная обработка ошибокНетривиальная обработка ошибок
Нетривиальная обработка ошибок
 
Zagursky
ZagurskyZagursky
Zagursky
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 

Viewers also liked

Использование Mojolicious::Plugin::AnyData в тестовом режиме проекта
Использование Mojolicious::Plugin::AnyData в тестовом режиме проектаИспользование Mojolicious::Plugin::AnyData в тестовом режиме проекта
Использование Mojolicious::Plugin::AnyData в тестовом режиме проектаIlya Zelenchuk
 
Nginx.pm
Nginx.pmNginx.pm
Nginx.pm
Ilya Zelenchuk
 
Потоки в перле изнутри
Потоки в перле изнутриПотоки в перле изнутри
Потоки в перле изнутри
Ilya Zelenchuk
 
Wcf faq
Wcf faqWcf faq
Wcf faq
Rajoo Jha
 
Функциональные тесты на Perl
Функциональные тесты на PerlФункциональные тесты на Perl
Функциональные тесты на Perl
Ilya Zelenchuk
 
Wanas Strategic Sustainability Prez
Wanas Strategic Sustainability PrezWanas Strategic Sustainability Prez
Wanas Strategic Sustainability Prez
Crystal Grover
 
Perl и SPDY
Perl и SPDYPerl и SPDY
Perl и SPDY
Ilya Zelenchuk
 
Tale Comenius Paco for Bori
Tale Comenius Paco for BoriTale Comenius Paco for Bori
Tale Comenius Paco for Bori
fimarcab
 
Coro - реальные потоки в Perl
Coro - реальные потоки в PerlCoro - реальные потоки в Perl
Coro - реальные потоки в Perl
Ilya Zelenchuk
 

Viewers also liked (9)

Использование Mojolicious::Plugin::AnyData в тестовом режиме проекта
Использование Mojolicious::Plugin::AnyData в тестовом режиме проектаИспользование Mojolicious::Plugin::AnyData в тестовом режиме проекта
Использование Mojolicious::Plugin::AnyData в тестовом режиме проекта
 
Nginx.pm
Nginx.pmNginx.pm
Nginx.pm
 
Потоки в перле изнутри
Потоки в перле изнутриПотоки в перле изнутри
Потоки в перле изнутри
 
Wcf faq
Wcf faqWcf faq
Wcf faq
 
Функциональные тесты на Perl
Функциональные тесты на PerlФункциональные тесты на Perl
Функциональные тесты на Perl
 
Wanas Strategic Sustainability Prez
Wanas Strategic Sustainability PrezWanas Strategic Sustainability Prez
Wanas Strategic Sustainability Prez
 
Perl и SPDY
Perl и SPDYPerl и SPDY
Perl и SPDY
 
Tale Comenius Paco for Bori
Tale Comenius Paco for BoriTale Comenius Paco for Bori
Tale Comenius Paco for Bori
 
Coro - реальные потоки в Perl
Coro - реальные потоки в PerlCoro - реальные потоки в Perl
Coro - реальные потоки в Perl
 

Similar to Контрактное программирование

2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Scorex framework
Scorex frameworkScorex framework
Scorex framework
Dmitry Meshkov
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
Platonov Sergey
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
Andrey Karpov
 
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint Kyiv
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Ivan Tsyganov
 
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Ontico
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript Dmytro Mindra
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
SQALab
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptDmytro Mindra
 
Опыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаОпыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервиса
Ilya Chesnokov
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
Open-IT
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
Alexander Gornik
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 

Similar to Контрактное программирование (20)

2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Scorex framework
Scorex frameworkScorex framework
Scorex framework
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
 
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
 
Опыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаОпыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервиса
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 

Контрактное программирование