Контрактное программирование | это... Что такое Контрактное программирование? (original) (raw)

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

Содержание

История

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

Описание

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

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

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

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

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

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

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

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

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

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

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

Примечания

  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.

См. также

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