Nettó, kódszerződések

A szerződéstervezés egy ötlet, amelyet az Eiffel programozási nyelvből vettek kölcsön. A .NET 4 System.Diagnostics.Contracts namespace tartalmazza az osztályokat a statikus kódellenőrzésekhez és a futásidejű ellenőrzésekhez, amelyeket minden .NET nyelv használható.

Ezzel a funkcióval meg lehet határozni a módszeren belüli előfeltételeket, utófeltételeket és invariánsokat. Az előfeltételek felsorolják azokat a követelményeket, amelyeknek a paramétereknek meg kell felelniük, a posztondíciók határozzák meg a visszaküldött adatok követelményeit és az invariánsokat - a változók követelményeit a módszeren belül.

A szerződéssel kapcsolatos információkat össze lehet állítani a hibakeresés és a munkakód megadásával. Meghatározhat egy különálló szerződésszerkezetet is, és sok ellenőrzés statikusan is végrehajtható, anélkül, hogy futtatná az alkalmazást.

A szerződések meghatározhatók az interfészeken; ez kényszeríti az interfészek megvalósítását ezen szerződések követelményeinek teljesítése érdekében. Feldolgozás szerszámok szerződések átírható összeszerelés, tesztelés szerződés végrehajtását a kódot végrehajtás működése során az alkalmazást, ellenőrizze a szerződés idején összeállítása és információk hozzáadása szerződéseket a generált XML dokumentumok.

Nettó, kódszerződések

A kódszerződést a szerződés szerinti osztály határozza meg. A módszerben rögzített szerződések minden követelményét, függetlenül attól, hogy ezek előfeltételek vagy kikötések, a módszer elején kell elhelyezni. Ön is hozzárendelhet egy globális eseménykezelőt a Szerződésben nem sikerült eseményhez, amelyet a szerződés futásidejű megsértéséért hívnak meg. A ContractFailedEventArgs típusú e paraméterrel rendelkező SetHandled () hívás leállítja a szokásos viselkedést, ha a kivétel felmerül.

Előfeltétel (szükséges)

Az előfeltételek ellenőrzik a Requires () és Requires (Módosítva) követelményeket() A szerződési osztály használatával meghatározható előfeltételek. A Requires () metódusnak egy Boole-értéket, valamint egy opcionális üzenet-karakterláncot kell átadnia a második paraméterben, amely akkor jelenik meg, ha a feltétel nem teljesül. A következő példa megköveteli, hogy az argumentum min értéke kisebb vagy egyenlő legyen a max argumentum értékével:

Az alább bemutatott szerződés egy ArgumentNullException-t dob, ha az o argumentum nulla. Kivétel nem jön létre, ha a ContractFailed eseménykezelő az eseményt kezeli. Ezenkívül, ha a Projekttulajdonságok ablakban az Ellenőrzés a szerződéses hibára jelölőnégyzet be van jelölve, ahelyett, hogy meghatározott kivételt generálna, a Trace.Assert () módszer a program befejezésére szólít fel:

A hívás szükséges() nem jelöli meg a [feltételes ("CONTRACTS_FULL")] attribútummal, és nem rendelkezik a DEBUG szimbólummal, ezért ez a futásidejű ellenőrzés minden esetben megtörténik. igényel() létrehoz egy speciális kivételt, ha az állapot nem teljesül.

A régi kód óriási tömegében az argumentumokat gyakran ellenőrizzük az if utasítások, kivéve ha a megadott feltétel sérül. A kódszerződések miatt nincs szükség az ellenőrzés visszaírására. Csak egy sornyi kódot adjon hozzá:

Az EndContractBlock () azt írja elő, hogy az előző kódot szerződésként kell feldolgozni. Ha más szerződéses üzemeltetőket használnak, akkor az EndContractBlock () nem szükséges.

Az argumentumként használt gyűjtemények teszteléséhez a Szerződés osztály biztosít Exists () és ForAll () módszereket. A ForAll () módszer a gyűjtemény egyes elemeit ellenőrzi. A következő példa azt vizsgálja, hogy a gyűjtemény minden elemének értéke kisebb-e 12-nél. Az Exists () metódus segítségével ellenőrizheti, hogy a feltétel megfelel-e legalább egy gyűjteményelemnek:

Mindkét módszer, Exists () és ForAll (), túlterheléssel rendelkezik, amely az IE számjegyű helyett két egész számot átvihet - az Inkluzív és az Exkluzív kategóriából. A számtartomány (kivéve az Exkluzív) átkerül a Predicate delegáltra, amelyet a harmadik paraméter határoz meg. A Exists () és a ForAll () előfeltételekkel, posztondíciókkal és invariánsokkal használható.

Testtartás (Biztosítja)

A posztpozíciók meghatározása biztosítja, hogy a megosztott adatokkal és a visszatérési értékekkel kapcsolatos bizonyos feltételek teljesüljenek. És bár bizonyos garanciákat határoztak meg a visszatérési értékekről, mindazonáltal meg kell őket írni a módszer elején; az összes szerződéses követelményt a módszer elején kell meghatározni.

Biztosítja () és biztosítja az OthThrow-ot() Egy postcondíció. A következő szerződés biztosítja, hogy a sharedState változó értéke a módszer végén kevesebb, mint 6. Mielőtt ez az érték módosítható:

Az EnsuresOnThrow segítségével() garantálja, hogy a megosztott állapot megfelel a feltételnek a megadott kivétel létrehozása esetén.

Annak érdekében, hogy biztosítsa a Return értéket az Ensures () szerződéssel, speciális Eredmény érték használható. Itt az int típusú eredményt az eredményes () módszer általános T típusú határozza meg. Az Ensures () szerződés biztosítja, hogy a visszatérési érték kevesebb, mint 6.

Az értéket a régi értékkel is összehasonlíthatja. Ez a 01dValue módszer használatával történik(). amely visszaadja a módszerrel átadott változó eredeti értékét.

invariánsokat

Az invariánsok a változókra vonatkozó szerződéseket a módszer élettartama alatt határozzák meg. A Contract.Requires () megadja a bemeneti követelményeket, a Contract.Ensures () - követelményeket a módszer végére. A Contract.Invariant () meghatározza azokat a feltételeket, amelyeknek teljesülniük kell a módszer élettartama során:

Kapcsolódó cikkek