Jump to content

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

Проектирование по контрактной схеме

Проектирование по контракту ( DbC ), также известное как контрактное программирование , программирование по контракту и программирование по контракту , — это подход к проектированию программного обеспечения .

обеспечения определять формальные , точные и проверяемые спецификации интерфейса для программных компонентов , которые расширяют обычное определение абстрактных типов данных предусловиями Он предписывает разработчикам программного , постусловиями и инвариантами . Эти спецификации называются «контрактами» в соответствии с концептуальной метафорой условий и обязательств деловых контрактов.

Подход DbC предполагает, что все клиентские компоненты , которые вызывают операцию на серверном компоненте, будут соответствовать предварительным условиям, указанным как необходимые для этой операции.

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

Этот термин был придуман Бертраном Мейером в связи с разработкой им языка программирования Eiffel и впервые описан в различных статьях, начиная с 1986 года. [ 1 ] [ 2 ] [ 3 ] и два последовательных издания (1988, 1997) его книги «Объектно-ориентированное построение программного обеспечения» . Eiffel Software подала заявку на регистрацию товарного знака Design by Contract в декабре 2003 года, и она была удовлетворена в декабре 2004 года. [ 4 ] [ 5 ] Нынешним владельцем этой торговой марки является Eiffel Software. [ 6 ] [ 7 ]

Проектирование по контракту уходит корнями в работу над формальной верификацией , формальной спецификацией и логикой Хоара . Оригинальные вклады включают в себя:

Описание

[ редактировать ]

Центральная идея DbC — это метафора того, как элементы программной системы взаимодействуют друг с другом на основе взаимных обязательств и выгод . Эта метафора пришла из деловой жизни, где «клиент» и «поставщик» договариваются о «контракте», который определяет, например, что:

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

Аналогично, если в объектно метод класса - ориентированном программировании предоставляет определенную функциональность, он может:

Контракт семантически эквивалентен тройке Хоара , которая формализует обязательства. Это можно резюмировать «тремя вопросами», на которые проектировщик должен неоднократно ответить в договоре:

  • Что предусматривает контракт?
  • Что гарантирует договор?
  • Что сохраняет контракт?

Многие языки программирования имеют средства для создания утверждений подобных . Однако DbC считает, что эти контракты настолько важны для корректности программного обеспечения , что они должны быть частью процесса проектирования. По сути, DbC рекомендует сначала писать утверждения . [ нужна ссылка ] Контракты могут быть написаны с помощью комментариев к коду , реализованы с помощью набора тестов или и то, и другое, даже если для контрактов не существует специальной языковой поддержки.

Понятие контракта распространяется на уровень метода/процедуры; контракт для каждого метода обычно содержит следующую информацию: [ нужна ссылка ]

Подклассам в иерархии наследования разрешено ослаблять предусловия (но не усиливать их) и усиливать постусловия и инварианты (но не ослаблять их). Эти правила приблизительно соответствуют поведенческим подтипам .

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

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

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

Свойство DbC «жесткий отказ» упрощает отладку поведения контракта, поскольку предполагаемое поведение каждого метода четко указано.

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

Проектирование по контракту также определяет критерии правильности программного модуля:

  • Если инвариант класса И предусловие истинны до того, как клиент позвонит поставщику, то инвариант И постусловие будет истинным после завершения обслуживания.
  • При обращении к поставщику программный модуль не должен нарушать предварительные условия поставщика.

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

Влияние на производительность

[ редактировать ]

Условия контракта никогда не должны нарушаться во время выполнения безошибочной программы. Поэтому контракты обычно проверяются только в режиме отладки во время разработки программного обеспечения. Позже в выпуске проверки контрактов отключаются для максимизации производительности.

Во многих языках программирования контракты реализуются с помощью Assert . Утверждения по умолчанию компилируются в режиме выпуска в C/C++ и аналогичным образом деактивируются в C#. [ 8 ] и Ява.

Запуск интерпретатора Python с «-O» (для «оптимизировать») в качестве аргумента также приведет к тому, что генератор кода Python не будет выдавать какой-либо байт-код для утверждений. [ 9 ]

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

Связь с тестированием программного обеспечения

[ редактировать ]

Проектирование по контракту не заменяет обычные стратегии тестирования, такие как модульное тестирование , интеграционное тестирование и тестирование системы . Скорее, оно дополняет внешнее тестирование внутренними самотестами, которые можно активировать как для изолированных тестов, так и в рабочем коде на этапе тестирования.

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

Использование утверждений можно рассматривать как форму тестового оракула , способ тестирования проекта путем реализации контракта.

Языковая поддержка

[ редактировать ]

Языки с встроенной поддержкой

[ редактировать ]

Языки, которые изначально реализуют большинство функций DbC, включают:

Кроме того, стандартная комбинация методов в Common Lisp Object System имеет квалификаторы метода :before, :after и :around которые позволяют, помимо прочего, писать контракты в качестве вспомогательных методов.

Языки со сторонней поддержкой

[ редактировать ]

Для существующих языков программирования без собственного дизайна были разработаны различные библиотеки, препроцессоры и другие инструменты по контрактной поддержке:

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Мейер, Бертран: Проектирование по контракту , Технический отчет TR-EI-12/CO, Interactive Software Engineering Inc., 1986 г.
  2. ^ Мейер, Бертран: Проектирование по контракту , в «Достижениях в объектно-ориентированной разработке программного обеспечения» , ред. Д. Мандриоли и Б. Мейер, Прентис Холл, 1991, стр. 1–50.
  3. ^ Мейер, Бертран: « Применение «проектирования по контракту» », в Computer (IEEE), 25, 10 октября 1992 г., стр. 40–51.
  4. ^ «Регистрация Ведомства США по патентам и товарным знакам «ДИЗАЙН ПО КОНТРАКТУ» » . Архивировано из оригинала 21 декабря 2016 г. Проверено 22 июня 2009 г. [ мертвая ссылка ]
  5. ^ «Регистрация в Ведомстве по патентам и товарным знакам США графического дизайна со словами «Дизайн по контракту» » . Архивировано из оригинала 21 декабря 2016 г. Проверено 22 июня 2009 г. [ мертвая ссылка ]
  6. ^ «Статус товарного знака и поиск документов — 78342277» . Получение заявки на регистрацию и регистрацию товарного знака USPTO .
  7. ^ «Статус товарного знака и поиск документов — 78342308» . Получение заявки на регистрацию и регистрацию товарного знака USPTO .
  8. ^ «Утверждения в управляемом коде» . Сеть разработчиков Microsoft . 15 ноября 2016 г. Архивировано из оригинала 22 августа 2018 г.
  9. ^ Официальная документация Python, утверждение утверждения
  10. ^ Брайт, Уолтер (1 ноября 2014 г.). «Язык программирования D, контрактное программирование» . Цифровой Марс . Проверено 10 ноября 2014 г.
  11. ^ Ходжес, Ник. «Пишите более чистый и качественный код с помощью контрактов классов в Delphi Prism» . Эмбаркадеро Технологии. Архивировано из оригинала 26 апреля 2021 года . Проверено 20 января 2016 г.
  12. ^ Финдлер, Контракты Феллейзена для функций высшего порядка
  13. ^ «Документация стандартной библиотеки Scala — утверждения» . ЭПФЛ . Проверено 24 мая 2019 г.
  14. ^ Строгая типизация как еще одно «обеспечение соблюдения контракта» в Scala, см. обсуждение на scala-lang.org/ .
  15. ^ «Кодекс контрактов» . Сеть разработчиков Microsoft . Архивировано из оригинала 15 ноября 2018 года.
  16. ^ «Спецификация проверки компонента» . beanvalidation.org .
  17. ^ «Помощь экспертов по тестированию программного обеспечения | Ресурсы Parasoft» (PDF) . Архивировано (PDF) из оригинала 9 октября 2022 г.
  18. ^ «Архивная копия» (PDF) . Архивировано из оригинала (PDF) 28 марта 2016 г. Проверено 25 марта 2016 г. {{cite web}}: CS1 maint: архивная копия в заголовке ( ссылка ) стр. 2
  19. ^ «Нет шансов выпустить под лицензией Apache/Eclipse/MIT/BSD? · Проблема № 5 · nhatminhle/cofoja» . Гитхаб .

Библиография

[ редактировать ]
  • Митчелл, Ричард и МакКим, Джим: Проектирование по контракту: на примере , Аддисон-Уэсли, 2002 г.
  • Викикнига , описывающая DBC, близкую к исходной модели.
  • Макнил, Эшли: Структура семантики поведенческих контрактов . Материалы второго международного семинара по моделированию поведения: основы и приложения (BM-FA '10). ACM, Нью-Йорк, США, 2010. В этой статье обсуждаются обобщенные понятия контракта и взаимозаменяемости .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 454eda330f321aa6e22df3ad8cb5da7a__1715000940
URL1:https://arc.ask3.ru/arc/aa/45/7a/454eda330f321aa6e22df3ad8cb5da7a.html
Заголовок, (Title) документа по адресу, URL1:
Design by contract - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)