~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 9060B55385B0E316683915750B9A713F__1715000940 ✰
Заголовок документа оригинал.:
✰ Design by contract - Wikipedia ✰
Заголовок документа перевод.:
✰ Проектирование по контракту - Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Design_by_contract ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/90/3f/9060b55385b0e316683915750b9a713f.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/90/3f/9060b55385b0e316683915750b9a713f__translat.html ✰
Дата и время сохранения документа:
✰ 12.06.2024 04:30:48 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 6 May 2024, at 16:09 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Проектирование по контракту - Википедия 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
Номер скриншота №: 9060B55385B0E316683915750B9A713F__1715000940
URL1:https://en.wikipedia.org/wiki/Design_by_contract
Заголовок, (Title) документа по адресу, URL1:
Design by contract - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)