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

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

Контрактное программирование (design by contract (DbC), programming by contract, contract-based programming) — это метод проектирования программного обеспечения. Он предполагает, что проектировщик должен определить формальные, точные и верифицируемые спецификации интерфейсов для компонентов системы. При этом, кроме обычного определения абстрактных типов данных, также используются предусловия, постусловия и инварианты. Данные спецификации называются "контрактами" в соответствии с концептуальной метафорой условий и ответственности в гражданско-правовых договорах.

Содержание

История

Термин предложил Бертран Мейер в связи с разработкой языка Eiffel. Контрактное программирование выросло из формальной верификации, формальной спецификации и логики Хоара. Контрактное программирование — это не только простая метафора, указывающая способ проектирования. Условия, облегчающие применение контрактного программирования:

Описание

Основная идея контрактного программирования — это модель взаимодействия элементов программной системы, основывающаяся на идее взаимных обязательств и преимуществ. Как и в бизнесе, клиент и поставщик действуют в соответствии с определённым контрактом. Контракт некоторого метода или функции может включать в себя:

  • конкретные обязательства, которые любой клиентский модуль должен выполнить перед вызовом метода — предусловия, которые дают преимущество для поставщика — он может не проверять выполнение предусловий;
  • конкретные свойства, которые должны присутствовать после выполнения метода — постусловия, которые входят в обязательства поставщика;
  • обязательства по выполнению конкретных свойств — инвариантов, которые должны выполняться при получении поставщиком сообщения, а также при выходе из метода.

Многие языки программирования позволяют учитывать такие обязательства. Контрактное программирование подразумевает эти требования критическими для корректности программ, поэтому они должны быть утверждены при проектировании. Таким образом, контрактное программирование предписывает начинать писать код с написания формальных утверждений корректности (assertions).

В объектно-ориентированном программировании контракт метода обычно включает следующую информацию:

  • возможные типы входных данных и их значение;
  • типы возвращаемых данных и их значение;
  • условия возникновения исключений, их типы и значения;
  • присутствие побочного эффекта метода;
  • предусловия, которые могут быть ослаблены (но не усилены) в подклассах;
  • постусловия, которые могут быть усилены (но не ослаблены) в подклассах;
  • инварианты, которые могут быть усилены (но не ослаблены) в подклассах;
  • (иногда) гарантии производительности, например, временная сложность или сложность по памяти.

При использовании контрактов сам код не обязан проверять их выполнение. Обычно в таких случаях в коде делают жёсткое падение[уточнить]fail hard»), таким образом облегчая отладку выполнения контрактов. Во многих языках, таких как C, C++, Delphi, PHP, такое поведение реализуется оператором assert. В релизовом варианте кода это поведение может быть сохранено, либо проверки могут быть убраны чтобы повысить производительность.

Юнит-тесты проверяют модуль изолированно от других, проверяя, что модуль удовлетворяет предположениям контракта, а также свои контракты выполняют используемые им модули. Интеграционные тесты проверяют, что модули работают корректно вместе.

Контрактное программирование может повысить уровень повторного использования кода, поскольку обязательства модуля чётко документированы. Вообще, контракт модуля можно рассматривать также как способ документации программного обеспечения.

Реализация в языках программирования

Поддержка DbC на языковом уровне

Языки, изначально поддерживающие средства для контрактного программирования:

Поддержка DbC с помощью сторонних библиотек

  • C и C++ посредством CTESK, библиотеки Contract++, препроцессора DBC for C, GNU Nana или компилятора C++ от Digital Mars.
  • C# посредством Code Contracts
  • Java посредством JavaTESK, iContract2, Contract4J, jContractor, Jcontract, C4J, CodePro Analytix, STclass, Jass preprocessor, OVal with AspectJ, Java Modeling Language (JML), SpringContracts для Spring Framework, или Modern Jass, Custos с использованием AspectJ, JavaDbC с использованием AspectJ, cofoja (разработанная[2] компанией Google).
  • JavaScript посредством Cerny.js или ecmaDebug.
  • Lisp
    • Common Lisp с помощью макросов или протокола метаобъектов CLOS.
    • Scheme посредством расширения PLT, а именно тот факт, что любое нарушение контракта должно указывать на виновного и иметь точное объяснение.[1]
  • Nemerle с помощью макросов.
  • Perl с помощью CPAN-модулей Class::Contract (Damian Conway) или Carp::Datum (Raphael Manfredi).
  • Python с помощью пакета zope.interface, PyDBC или Contracts for Python.
  • Ruby с помощью DesignByContract (от Brian McCallister), Ruby DBC или ruby-contract.

Общие инструменты

Примечания

  1. , Bright, Walter D Programming Language, Contract Programming. Digital Mars (20 августа 2006). Архивировано из первоисточника 21 марта 2012. Проверено 6 октября 2006.
  2. David Morgan, Andreas Leitner and Nhat Minh Le Contracts for Java  (англ.) (4 February 2011). Архивировано из первоисточника 21 марта 2012. Проверено 12 июня 2011.

См. также

Тестирование на основе модели


Wikimedia Foundation. 2010.

Игры ⚽ Нужен реферат?

Полезное


Смотреть что такое "Контрактное программирование" в других словарях:

  • Аспектно-ориентированное программирование — Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная …   Википедия

  • Доказательное программирование — использовавшаяся в 1980 х годах в академических кругах технология разработки программ для ЭВМ с доказательствами правильности доказательствами отсутствия ошибок в программах (понимая, в рамках данной теории, ошибки как несоответствия между… …   Википедия

  • SOLID (объектно-ориентированное программирование) — У этого термина существуют и другие значения, см. Solid. SOLID это аббревиатура пяти основных принципов дизайна классов в объектно ориентированном проектировании  Single responsibility, Open closed, Liskov substitution, Interface segregation …   Википедия

  • Сравнение языков программирования — Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей.  Условные обозначения  …   Википедия

  • Lisaac — Класс языка: объектно ориентированный прототипный Появился в: 2003 Автор(ы): Benoît Sonntag Релиз: 0.13.1 (Спецификация) (February 17, 2008) Типизация …   Википедия

  • Парадигма — (Paradigm) Определение парадигмы, история возникновения парадигмы Информация об определении парадигмы, история возникновения парадигмы Содержание Содержание История возникновения Частные случаи (лингвистика) Управленческая парадигма Парадигма… …   Энциклопедия инвестора

  • Cobra (язык программирования) — У этого термина существуют и другие значения, см. Cobra (значения). Cobra Класс языка: мультипарадигмальный: объектно ориентированный Появился в: 2006 Автор(ы): Чак Эстербрук Расширение файлов: .cobra …   Википедия

  • D (язык программирования) — У этого термина существуют и другие значения, см. D. D Семантика: мультипарадигменный: императивное, объектно ориентированное, обобщённое программирование Тип исполнения: компилятор Появился в: 1999 Автор(ы) …   Википедия

  • Разработка через тестирование — Разработка программного обеспечения Процесс разработки ПО Шаги процесса Анализ • Проектирование • Программирование • Докумен …   Википедия

  • Отладка программы — Отладка  этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки. Чтобы понять, где возникла ошибка, приходится : узнавать текущие значения переменных; выяснять, по какому пути выполнялась… …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»