Проєктування за контрактом (англ. design by contract (DbC), programming by contract, contract-based programming) — методологія розробки програмного забезпечення. Вона вимагає від проєктувальників задавати формальні, точні та такі, що підлягають верифікації, специфікації інтерфейсів програмних компонентів. Окрім задання абстрактних типів даних вимагається також задання передумов, післяумов та інваріантів. Такі специфікації називаються «контрактами» згідно з концептуальною метафорою умов і зобов'язань у бізнесових контрактах.
Підхід DbC передбачає, що всі клієнтські компоненти, які викликають операції на серверних компонентах, повинні відповідати передумовам, визначених як необхідні для цієї операції. Там, де це припущення вважається занадто ризикованим (як у багатоканальних клієнт-серверних або розподілених обчисленнях) обирають протилежний підхід - «безпечне програмування», яке означає, що серверний компонент перевіряє (до або під час обробки запиту клієнта), що всі відповідні передумови дотримані, або відповідає належним повідомленням про помилку, якщо ні.
Історія
Термін був запропонований Бертраном Меєром під час розробки мови Eiffel і описаний в кількох статтях, починаючи з 1986 року, зокрема в статті Design by Contract та двох виданнях його відомої книги Object-Oriented Software Construction [ 2 лютого 2017 у Wayback Machine.]. Проєктування за контрактом засноване на працях з формальної специфікації, формальної верифікації та логіці Гоара.
Контрактне програмування дає чітку концепцію керування процесом проєктування і передбачає:
- використання успадкування та динамічного зв'язування;
- використання обробки винятків;
- можливість автоматичного документування програмного забезпечення.
Опис
Основна ідея контрактного програмування — модель взаємодії елементів програмної системи на основі взаємних зобов'язань та вигод. Це метафора із бізнесу, де «клієнт» та «постачальник» укладають «контракт», що описує наступну поведінку:
- коли «клієнт» використовує «постачальника», то «клієнт» зобов'язаний задовольнити передумови, це є вигодою «постачальника», оскільки звільняє його від виконання контракту в протилежному випадку;
- гарантування виконання післяумови є зобов'язанням «постачальника», та є вигодою «клієнта»;
- виконання деякої умови напочатку і вкінці є гарантуванням збереження інваріанта.
При використанні контрактного програмування воно стає критичним для коректності програми, тому контрактне програмування приписує починати проєктування із визначення контрактів.
В об'єктно-орієнтованому програмуванні контракт методу зазвичай містить:
- вхідні типи даних та їхні можливі значення;
- тип результату та його можливі значення;
- умови виникнення винятків, їхні типи та можливі значення;
- передумови (їх можна послабити, але не посилити в підкласі);
- післяумови (їх можна посилити, але не послабити в підкласі);
- інваріанти;
- побічні ефекти;
- гарантії обмеження споживання ресурсів (часу чи пам'яті).
Контрактне програмування дозволяє підвищити повторне використання коду, оскільки зобов'язання модуля чітко виписані. Контракт модуля можна розглядати як один із способів документування ПЗ.
Підтримка DbC мовами програмування
Мови програмування з нативною підтримкою
Мови, які включають більшість рис DbC:
Мови програмування з підтримкою DbC за допомогою сторонніх бібліотек
Для мов без нативної підтримки DbC розроблені різні бібліотеки, препроцесори та інші інструменти:
- Ada, через GNAT pragmas для передумов та післяумов
- C та , через препроцесор DBC for C, GNU Nana, бібліотеку Contract++, компілятор C++ Digital Mars. Бібліотека Loki надає механізм ContractChecker на відповідність класу DbC
- C# (та інші мови .NET), через Code Contracts (проєкт Microsoft Research, інтегрований в .NET Framework 4.0)
- Groovy, через GContracts
- Java, через OVal з AspectJ, Contracts for Java (Cofoja), Java Modeling Language (JML), Bean Validation (лише пре- та післяумови), valid4j
- JavaScript, через AspectJS (особливо AJS_Validator), Cerny.js, ecmaDebug, jsContract, jscategory
- Common Lisp, через макроси або протокол метаоб'єктів CLOS
- Nemerle, через макроси
- Perl, через CPAN-модулі Class::Contract (Damian Conway) або Carp::Datum (Raphael Manfredi)
- PHP, через PhpDeal, Praspel або ContractLib (Stuart Herbert's)
- Python, через пакети PyContracts, Decontractors, dpcontracts, zope.interface, PyDBC або Contracts for Python
- Ruby, через DesignByContract (Brian McCallister), Ruby DBC, ruby-contract або contracts.ruby
- Rust, через бібліотеку Hoare
Література
- Mitchell, Richard, and McKim, Jim: Design by Contract: by example, Addison-Wesley, 2002.
- Meyer, Bertrand Object-Oriented Software Construction, 2nd Edition, Prentice Hall, 1997.
Примітки
- Meyer, Bertrand: Applying "Design by Contract", in Computer (IEEE), 25, 10, October 1992, pp. 40–51, також доступна online [ 21 вересня 2017 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Proyektuvannya za kontraktom angl design by contract DbC programming by contract contract based programming metodologiya rozrobki programnogo zabezpechennya Vona vimagaye vid proyektuvalnikiv zadavati formalni tochni ta taki sho pidlyagayut verifikaciyi specifikaciyi interfejsiv programnih komponentiv Okrim zadannya abstraktnih tipiv danih vimagayetsya takozh zadannya peredumov pislyaumov ta invariantiv Taki specifikaciyi nazivayutsya kontraktami zgidno z konceptualnoyu metaforoyu umov i zobov yazan u biznesovih kontraktah Proyektuvannya modulya za kontraktom Pidhid DbC peredbachaye sho vsi kliyentski komponenti yaki viklikayut operaciyi na servernih komponentah povinni vidpovidati peredumovam viznachenih yak neobhidni dlya ciyeyi operaciyi Tam de ce pripushennya vvazhayetsya zanadto rizikovanim yak u bagatokanalnih kliyent servernih abo rozpodilenih obchislennyah obirayut protilezhnij pidhid bezpechne programuvannya yake oznachaye sho servernij komponent pereviryaye do abo pid chas obrobki zapitu kliyenta sho vsi vidpovidni peredumovi dotrimani abo vidpovidaye nalezhnim povidomlennyam pro pomilku yaksho ni IstoriyaTermin buv zaproponovanij Bertranom Meyerom pid chas rozrobki movi Eiffel i opisanij v kilkoh stattyah pochinayuchi z 1986 roku zokrema v statti Design by Contract ta dvoh vidannyah jogo vidomoyi knigi Object Oriented Software Construction 2 lyutogo 2017 u Wayback Machine Proyektuvannya za kontraktom zasnovane na pracyah z formalnoyi specifikaciyi formalnoyi verifikaciyi ta logici Goara Kontraktne programuvannya daye chitku koncepciyu keruvannya procesom proyektuvannya i peredbachaye vikoristannya uspadkuvannya ta dinamichnogo zv yazuvannya vikoristannya obrobki vinyatkiv mozhlivist avtomatichnogo dokumentuvannya programnogo zabezpechennya OpisOsnovna ideya kontraktnogo programuvannya model vzayemodiyi elementiv programnoyi sistemi na osnovi vzayemnih zobov yazan ta vigod Ce metafora iz biznesu de kliyent ta postachalnik ukladayut kontrakt sho opisuye nastupnu povedinku koli kliyent vikoristovuye postachalnika to kliyent zobov yazanij zadovolniti peredumovi ce ye vigodoyu postachalnika oskilki zvilnyaye jogo vid vikonannya kontraktu v protilezhnomu vipadku garantuvannya vikonannya pislyaumovi ye zobov yazannyam postachalnika ta ye vigodoyu kliyenta vikonannya deyakoyi umovi napochatku i vkinci ye garantuvannyam zberezhennya invarianta Pri vikoristanni kontraktnogo programuvannya vono staye kritichnim dlya korektnosti programi tomu kontraktne programuvannya pripisuye pochinati proyektuvannya iz viznachennya kontraktiv V ob yektno oriyentovanomu programuvanni kontrakt metodu zazvichaj mistit vhidni tipi danih ta yihni mozhlivi znachennya tip rezultatu ta jogo mozhlivi znachennya umovi viniknennya vinyatkiv yihni tipi ta mozhlivi znachennya peredumovi yih mozhna poslabiti ale ne posiliti v pidklasi pislyaumovi yih mozhna posiliti ale ne poslabiti v pidklasi invarianti pobichni efekti garantiyi obmezhennya spozhivannya resursiv chasu chi pam yati Kontraktne programuvannya dozvolyaye pidvishiti povtorne vikoristannya kodu oskilki zobov yazannya modulya chitko vipisani Kontrakt modulya mozhna rozglyadati yak odin iz sposobiv dokumentuvannya PZ Pidtrimka DbC movami programuvannyaMovi programuvannya z nativnoyu pidtrimkoyu Movi yaki vklyuchayut bilshist ris DbC Ada 2012 Clojure D Eiffel Oxygene kolishnij Chrome Movi programuvannya z pidtrimkoyu DbC za dopomogoyu storonnih bibliotek Dlya mov bez nativnoyi pidtrimki DbC rozrobleni rizni biblioteki preprocesori ta inshi instrumenti Ada cherez GNAT pragmas dlya peredumov ta pislyaumov C ta C cherez preprocesor DBC for C GNU Nana biblioteku Contract kompilyator C Digital Mars Biblioteka Loki nadaye mehanizm ContractChecker na vidpovidnist klasu DbC C ta inshi movi NET cherez Code Contracts proyekt Microsoft Research integrovanij v NET Framework 4 0 Groovy cherez GContracts Java cherez OVal z AspectJ Contracts for Java Cofoja Java Modeling Language JML Bean Validation lishe pre ta pislyaumovi valid4j JavaScript cherez AspectJS osoblivo AJS Validator Cerny js ecmaDebug jsContract jscategory Common Lisp cherez makrosi abo protokol metaob yektiv CLOS Nemerle cherez makrosi Perl cherez CPAN moduli Class Contract Damian Conway abo Carp Datum Raphael Manfredi PHP cherez PhpDeal Praspel abo ContractLib Stuart Herbert s Python cherez paketi PyContracts Decontractors dpcontracts zope interface PyDBC abo Contracts for Python Ruby cherez DesignByContract Brian McCallister Ruby DBC ruby contract abo contracts ruby Rust cherez biblioteku HoareLiteraturaMitchell Richard and McKim Jim Design by Contract by example Addison Wesley 2002 Meyer Bertrand Object Oriented Software Construction 2nd Edition Prentice Hall 1997 PrimitkiMeyer Bertrand Applying Design by Contract in Computer IEEE 25 10 October 1992 pp 40 51 takozh dostupna online 21 veresnya 2017 u Wayback Machine