Programarea contractelor
Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de
versiunea revizuită la 1 decembrie 2014; verificările necesită
33 de modificări .
Programarea prin contract ( design by contract (DbC), programarea prin contract , programarea pe bază de contract ) este o metodă de proiectare software . Acesta sugerează că proiectantul trebuie să definească specificații de interfață formale , precise și verificabile pentru componentele sistemului. În acest caz, pe lângă definiția obișnuită a tipurilor de date abstracte , sunt utilizate și precondiții , postcondiții și invarianți . Aceste specificații sunt denumite „contracte” în conformitate cu metafora conceptuală a termenilor și responsabilităților din contractele de drept civil .
Istorie
Termenul a fost propus de Bertrand Meyer în legătură cu dezvoltarea limbajului Eiffel . Programarea contractelor a luat naștere din verificarea formală , specificațiile formale și logica lui Hoare . Programarea prin contract nu este doar o simplă metaforă pentru proiectarea unei căi. Condiții care facilitează utilizarea programării contractuale:
Descriere
Ideea principală a programării contractelor este un model de interacțiune între elementele unui sistem software bazat pe ideea de obligații și beneficii reciproce . Ca și în afaceri, clientul și furnizorul funcționează în baza unui contract specific . Contractul unei metode sau funcție poate include:
- obligații specifice pe care orice modul client trebuie să le îndeplinească înainte de a apela metoda - precondiții , care oferă un avantaj furnizorului - este posibil să nu verifice îndeplinirea precondițiilor;
- proprietăți specifice care trebuie să fie prezente după executarea metodei - postcondiții , care sunt incluse în obligațiile furnizorului;
- obligații de a îndeplini proprietăți specifice - invarianți care trebuie îndepliniți atunci când furnizorul de mesaje primește mesajul, precum și atunci când metoda iese.
Multe limbaje de programare permit ca astfel de obligații să fie luate în considerare. Programarea contractelor presupune că aceste cerințe sunt esențiale pentru corectitudinea programelor, așa că trebuie aprobate în timpul proiectării. Astfel, programarea contractuală prescrie să începeți scrierea codului prin scrierea aserțiunilor formale de corectitudine (aserțiuni).
În programarea orientată pe obiecte , un contract de metodă include de obicei următoarele informații:
- posibilele tipuri de date de intrare și semnificația acestora;
- returnează tipurile de date și semnificația acestora;
- condițiile de apariție a excepțiilor , tipurile și valorile acestora;
- prezența unui efect secundar al metodei;
- precondiții care pot fi slăbite (dar nu consolidate) în subclase;
- postcondiții, care pot fi întărite (dar nu slăbite) în subclase;
- invariante care pot fi întărite (dar nu slăbite) în subclase;
- (uneori) garanții de performanță, cum ar fi complexitatea timpului sau complexitatea memoriei .
Când se utilizează contracte, codul în sine nu este necesar pentru a verifica executarea acestora. De obicei, în astfel de cazuri, se face o cădere dură în cod[ clarify ] (" fail-fast "), ușurând astfel depanarea execuției contractelor. În multe limbi precum C , C++ , Delphi , PHP , acest comportament este implementat de assert. În versiunea finală a codului, acest comportament poate fi păstrat sau verificările pot fi eliminate pentru a îmbunătăți performanța.
Testele unitare testează un modul în mod izolat, verificând dacă modulul satisface ipotezele contractului și că modulele pe care le folosește își îndeplinesc contractele. Testele de integrare verifică dacă modulele funcționează corect împreună.
Programarea prin contract poate crește reutilizarea codului deoarece obligațiile modulului sunt documentate în mod clar. În general, contractul de modul poate fi gândit și ca o modalitate de documentare a software-ului .
Implementare în limbaje de programare
Suport DbC la nivel de limbă
Limbi care suportă nativ instrumente de programare contract:
Suport DbC cu biblioteci terțe
- C și C++ prin CTESK , biblioteca Contract++ , preprocesorul DBC pentru C , GNU Nana sau compilatorul Digital Mars C++ .
- C# prin Contracte de cod
- Treci prin dbc
- Java prin JavaTESK , iContract2, Contract4J , jContractor , Jcontract, C4J , CodePro Analytix, STclass , preprocesor Jass, OVal cu AspectJ, Java Modeling Language (JML), SpringContracts for Spring Framework sau Modern Jass , Custos (link indisponibil) folosind AspectJ , JavaDbC folosind AspectJ, cofoja (dezvoltat [3] de Google ).
- JavaScript prin Cerny.js Arhivat 27 iunie 2007 la Wayback Machine , dbc-code-contracts sau ecmaDebug .
- Lisp
- Common Lisp folosind macrocomenzi sau protocolul metaobiect CLOS .
- Schemă prin extinderea PLT, și anume faptul că orice încălcare a contractului trebuie să indice vinovatul și să aibă o explicație precisă. [unu]
- Nemerle cu macro-uri.
- Perl folosind modulele CPAN Class::Contract (Damian Conway) sau Carp::Datum (Raphael Manfredi).
- PHP cu PHPDeal
- Python folosind pachetul zope.interface, PyDBC, PyContracts sau Contracts for Python.
- Ruby cu DesignByContract (de Brian McCallister), Ruby DBC sau ruby-contract.
- Rugină cu biblioteca Hoare [4]
- Vala cu GLib
Instrumente generale
Note
- ↑ Walter, Bright D Programming Language, Contract Programming . Digital Mars (1 noiembrie 2014). Data accesului: 1 decembrie 2014. Arhivat din original pe 28 noiembrie 2014. (nedefinit)
- ↑ Scala Standard Library Docs - Assertions . EPFL. Preluat la 12 ianuarie 2020. Arhivat din original la 25 decembrie 2019. (nedefinit)
- ↑ David Morgan, Andreas Leitner și Nhat Minh Le. Contracte pentru Java (engleză) (4 februarie 2011). Consultat la 12 iunie 2011. Arhivat din original pe 21 martie 2012.
- ↑ GitHub - nrc/libhoare: Design by contract style assertions for Rust . Preluat la 24 februarie 2019. Arhivat din original la 12 octombrie 2018. (nedefinit)
Vezi și