Kontraktsprogrammering
Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från
versionen som granskades den 1 december 2014; kontroller kräver
33 redigeringar .
Kontraktsprogrammering ( design by contract (DbC), programmering genom kontrakt , kontraktsbaserad programmering ) är en mjukvarudesignmetod . Det föreslår att designern måste definiera formella , exakta och verifierbara gränssnittsspecifikationer för systemkomponenter. I det här fallet används förutom den vanliga definitionen av abstrakta datatyper även preconditions , postconditions och invarianter . Dessa specifikationer kallas "kontrakt" i enlighet med den konceptuella metaforen om villkor och ansvar i civilrättsliga avtal .
Historik
Termen föreslogs av Bertrand Meyer i samband med utvecklingen av Eiffelspråket . Kontraktsprogrammering växte fram ur formell verifiering , formell specifikation och Hoares logik . Kontraktsprogrammering är inte bara en enkel metafor för att designa ett sätt. Villkor som underlättar användningen av avtalsprogrammering:
Beskrivning
Huvudidén med kontraktsprogrammering är en modell för interaktion mellan elementen i ett mjukvarusystem baserat på idén om ömsesidiga skyldigheter och fördelar . Som i affärer arbetar kunden och leverantören under ett specifikt avtal . Kontraktet för någon metod eller funktion kan innehålla:
- specifika skyldigheter som en kundmodul måste uppfylla innan metoden anropas - förutsättningar , som ger en fördel för leverantören - den får inte kontrollera att förutsättningarna uppfylls;
- specifika egenskaper som måste finnas efter genomförandet av metoden - postvillkor , som ingår i leverantörens skyldigheter;
- skyldigheter att uppfylla specifika egenskaper - invarianter som måste uppfyllas när meddelandeleverantören tar emot meddelandet, samt när metoden avslutas.
Många programmeringsspråk tillåter att sådana skyldigheter beaktas. Kontraktsprogrammering innebär att dessa krav är avgörande för att programmen är korrekta, så de måste godkännas under utformningen. Kontraktsprogrammering föreskriver alltså att börja skriva kod genom att skriva formella påståenden om riktighet (påståenden).
I objektorienterad programmering innehåller ett metodkontrakt vanligtvis följande information:
- möjliga indatatyper och deras betydelse;
- returnera datatyper och deras betydelse;
- villkor för förekomsten av undantag , deras typer och värden;
- närvaron av en bieffekt av metoden;
- förutsättningar som kan försvagas (men inte stärkas) i underklasser;
- postvillkor, som kan förstärkas (men inte försvagas) i underklasser;
- invarianter som kan förstärkas (men inte försvagas) i underklasser;
- (ibland) prestandagarantier, såsom tidskomplexitet eller minneskomplexitet .
Vid användning av kontrakt krävs inte själva koden för att kontrollera deras exekvering. Vanligtvis görs i sådana fall ett hårt fall i koden[ clarify ] (" fail-fast "), vilket gör det lättare att felsöka utförandet av kontrakt. På många språk som C , C++ , Delphi , PHP implementeras detta beteende av assert. I den slutliga versionen av koden kan detta beteende bevaras, eller så kan kontrollerna tas bort för att förbättra prestandan.
Enhetstester testar en modul isolerat och verifierar att modulen uppfyller kontraktets antaganden och att modulerna den använder uppfyller sina kontrakt. Integrationstest verifierar att moduler fungerar korrekt tillsammans.
Kontraktsprogrammering kan öka kodåteranvändningen eftersom modulens skyldigheter är tydligt dokumenterade. Generellt sett kan modulkontraktet också ses som ett sätt att dokumentera programvara .
Implementering i programmeringsspråk
DbC-stöd på språknivå
Språk som stöder kontraktsprogrammeringsverktyg:
DbC-stöd med tredje parts bibliotek
- C och C++ via CTESK , Contract++-biblioteket , DBC för C -förprocessor , GNU Nana eller Digital Mars C++-kompilatorn .
- C# genom Code Contracts
- Gå via dbc
- Java via JavaTESK , iContract2, Contract4J , jContractor , Jcontract, C4J , CodePro Analytix, STclass , Jass preprocessor, OVal with AspectJ, Java Modeling Language (JML), SpringContracts for Spring Framework , eller Modern Jass , Custos (otillgänglig länk ) med hjälp av AspectJ JavaDbC med AspectJ, cofoja (utvecklad [3] av Google ).
- JavaScript via Cerny.js Arkiverad 27 juni 2007 på Wayback Machine , dbc-code-contracts eller ecmaDebug .
- Läspa
- Common Lisp med makron eller CLOS -metaobject-protokollet .
- Schema genom att förlänga PLT, nämligen det faktum att eventuella avtalsbrott måste peka på den skyldige och ha en exakt förklaring. [ett]
- Nemerle med makron.
- Perl använder CPAN -modulerna Class::Contract (Damian Conway) eller Carp::Datum (Raphael Manfredi).
- PHP med PhpDeal
- Python med paketet zope.interface, PyDBC, PyContracts eller Contracts for Python.
- Ruby med DesignByContract (av Brian McCallister), Ruby DBC, eller ruby-contract.
- Rosta med Hoare-biblioteket [4]
- Vala med GLib
Allmänna verktyg
Anteckningar
- ↑ Walter, Bright D-programmeringsspråk, kontraktsprogrammering . Digital Mars (1 november 2014). Datum för åtkomst: 1 december 2014. Arkiverad från originalet den 28 november 2014. (obestämd)
- ↑ Scala Standard Library Docs - Påståenden . EPFL. Hämtad 12 januari 2020. Arkiverad från originalet 25 december 2019. (obestämd)
- ↑ David Morgan, Andreas Leitner och Nhat Minh Le. Kontrakt för Java (engelska) (4 februari 2011). Hämtad 12 juni 2011. Arkiverad från originalet 21 mars 2012.
- ↑ GitHub - nrc/libhoare: Design by contract style assertions for Rust . Hämtad 24 februari 2019. Arkiverad från originalet 12 oktober 2018. (obestämd)
Se även