Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

1,725 views

Published on

Обзор техники программирования по контракту вцелом и подробное рассмотрение Perl-средств - Class::Contract.

Published in: Education
  • Be the first to comment

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

  1. 1. КОНТРАКТНОЕПРОГРАММИРОВАНИЕСамунь Виктор
  2. 2. Имеющиеся проблемы в Perl• Perl слабо типизирован• Тип данных определяется динамически• Слабые возможности прототипов функций
  3. 3. Проблемы при программировании• Изменение API• Изменение типов данных• Проверка данных• Контекст
  4. 4. Решение проблем (возможное)• Документация• Тестирование
  5. 5. Контрактное программирование• Метод проектирования ПО• Предложено Бертраном Мейером при разработке Eiffel• 1986 год• Возникло из: • Формальной спецификации • Формальной верификации • Логики Хоара• По контракту можно сгенерировать документацию
  6. 6. Что задаёт контракт?• Типы данных• Предусловие (precondition)• Инвариант (invariant)• Постусловие (postcondition)
  7. 7. Последовательность проверки1. Предусловие2. Инвариант3. Вызов функции4. Инвариант5. Постусловие
  8. 8. Какие языки имеют нужные средства?• Eiffel • C (DBC for C)•D • C++ (Contract++)• Spec# • C# (Code Contracts)• SeC • Java (jContractor)•… • Perl (Class::Contract) •…
  9. 9. Class::Contract
  10. 10. Определение классовpackage ClassName;contract { # Спецификация атрибутов и методов # класса ClassName};
  11. 11. Конструктор и деструкторcontract { ctor ‘new’; impl { ... }; dtor; impl { ... };};$x = new MyClass;
  12. 12. Инварианты классаcontract { invar { ... }; failmsg ‘Contract failed on %s’;};
  13. 13. Определение атрибутовcontract { attr ‘scalar_attr’; attr ‘yet_scalar’ => SCALAR; attr ‘array_attr’ => ARRAY; attr ‘hash_attr’ => HASH; attr ‘obj_attr’ => SomeClass;};
  14. 14. Определение методовcontract { method ‘my_method’; impl { ... };};&self
  15. 15. Пред- и пост- условия (атрибуты)contract { attr ‘my_attr’; pre { ... }; failmsg ‘Fail Message’; post { ... }; failmsg ‘Fail Message’;};&value&old
  16. 16. Пред- и пост- условия (методы)contract { method ‘my_meth’; pre { ... }; failmsg ‘Fail Message’; post { ... }; failmsg ‘Fail Message’; impl { ... };};&self&old
  17. 17. Пример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; };};
  18. 18. Пример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.pl40 40041 Post-condition at MyClass.pm line 16 failed at 1.pl line 6
  19. 19. Что есть ещё?• Sub::Contract• Class::Agreement
  20. 20. Спасибо за внимание! Вопросы?

×