Třída invariantní - Class invariant - Wikipedia
tento článek potřebuje další citace pro ověření.Srpna 2010) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
v programování konkrétně objektově orientované programování, a invariant třídy (nebo zadejte invariant) je neměnný slouží k omezení předměty a třída. Metody třídy by měl zachovat invariant. Třída neměnná omezuje stav uložený v objektu.
Třída invarianty jsou vytvořeny během výstavby a neustále udržovány mezi voláními na veřejné metody. Kód v rámci funkcí může narušit invarianty, pokud jsou invarianty obnoveny před ukončením veřejné funkce.
Invariant objektu nebo invariant reprezentace je a programování konstrukce sestávající ze sady neměnných vlastností, které zůstávají nekompromisní bez ohledu na stav objekt. Tím je zajištěno, že objekt bude vždy splňovat předdefinované podmínky, a to metody může proto vždy odkazovat na objekt bez rizika vzniku nepřesných předpokladů. Definování invariantů tříd může programátorům a testerům pomoci chytit více chyb během testování softwaru.
Třída invarianty a dědictví
Užitečný účinek invariancí tříd v objektově orientovaném softwaru je zvýšen v přítomnosti dědičnosti. Třídní invarianty se dědí, tj. „Invarianty všech rodičů třídy se vztahují na třídu samotnou.“[1]
Dědičnost může dovolit potomkům tříd změnit data implementace nadřazených tříd, takže by bylo možné, aby třída potomků změnila stav instancí způsobem, který je učinil neplatnými z hlediska nadřazené třídy. Zájem o tento typ špatně se chujícího potomka je jedním z důvodů, proč objektově orientovaní návrháři softwaru dávají přednost složení nad dědičností (tj. dědičnost přeruší zapouzdření).[2]
Protože se však zdědí invariantní třídy, invariantní třída pro jakoukoli konkrétní třídu se skládá z jakýchkoli invariantních tvrzení zakódovaných okamžitě na této třídě ve spojení s všechny invariantní klauze zděděné od rodičů třídy. To znamená, že i když potomci mohou mít přístup k datům implementace svých rodičů, invariant třídy jim může zabránit v manipulaci s těmito daty jakýmkoli způsobem, který za běhu vytvoří neplatnou instanci.
Podpora programovacího jazyka
Tvrzení
Běžné programovací jazyky jako Python,[3] Podpora JavaScript, C ++ a Java tvrzení ve výchozím nastavení, které lze použít k definování invarianty tříd. Běžným vzorem pro implementaci invariants ve třídách je, aby konstruktor třídy vyvolal výjimku, pokud invariant není splněn. Protože metody zachovávají invarianty, mohou převzít platnost invariantu a nemusí jej explicitně kontrolovat.
Nativní podpora
Třída invariant je základní součástí design podle smlouvy. Takže programovací jazyky, které poskytují plnou nativní podpora designu na základě smlouvy, jako Rez, Eiffelova, Ada, a D, bude také poskytovat plnou podporu pro třídní invarianty.
Nepůvodní podpora
Pro C ++, Loki knihovna poskytuje rámec pro kontrolu invariantů tříd, invariantů statických dat a bezpečnosti výjimek.
Pro Javu existuje výkonnější nástroj s názvem Java Modeling Language který poskytuje robustnější způsob definování třídních invariantů.
Příklady
Nativní podpora
D
D programovací jazyk má nativní podporu třídních invariantů i dalších smluvní programování Zde je příklad z oficiální dokumentace.[4]
třída datum { int den; int hodina; neměnný() { tvrdit(den >= 1 && den <= 31); tvrdit(hodina >= 0 && hodina <= 23); }}
Eiffelova
v Eiffelova, invariant třídy se objeví na konci třídy následující za klíčovým slovem neměnný
.
třída DATUMvytvořit udělatVlastnosti {ŽÁDNÝ} - Inicializace udělat (a_day: CELÉ ČÍSLO; hodina: CELÉ ČÍSLO) - Inicializovat `Current 'pomocí` a_day' a `a_hour '. vyžadovat platný_den: a_day >= 1 a a_day <= 31 platná_hodina: hodina >= 0 a hodina <= 23 dělat den := a_day hodina := hodina zajistit day_set: den = a_day hour_set: hodina = hodina konecVlastnosti -- Přístup den: CELÉ ČÍSLO - Den v měsíci pro aktuální hodina: CELÉ ČÍSLO - Hodina dne pro „Aktuální“Vlastnosti - Změna prvku set_day (a_day: CELÉ ČÍSLO) - Nastavit `den 'na` a_day' vyžadovat valid_argument: a_day >= 1 a a_day <= 31 dělat den := a_day zajistit day_set: den = a_day konec set_hour (hodina: CELÉ ČÍSLO) - Nastavit `hodinu 'na` a_hodinu' vyžadovat valid_argument: hodina >= 0 a hodina <= 23 dělat hodina := hodina zajistit hour_set: hodina = hodina konecneměnný platný_den: den >= 1 a den <= 31 platná_hodina: hodina >= 0 a hodina <= 23konec
Nepůvodní podpora
C ++
The Loki (C ++) knihovna poskytuje rámec napsaný uživatelem Richard Sposato pro kontrolu invariantů třídy, invariantů statických dat a bezpečnost výjimek úroveň.
Toto je příklad toho, jak může třída pomocí Loki :: Checker ověřit, že invarianty zůstanou pravdivé i po změně objektu. Příklad používá objekt geopointu k uložení polohy na Zemi jako souřadnice zeměpisné šířky a délky.
Geopointové invarianty jsou:
- zeměpisná šířka nesmí být větší než 90 ° severní šířky.
- zeměpisná šířka nesmí být menší než -90 ° jižně.
- zeměpisná délka nesmí být více než 180 ° na východ.
- zeměpisná délka nesmí být menší než -180 ° západně.
#zahrnout // Potřebné ke kontrole invarianty třídy. #zahrnout <Degrees.hpp>třída GeoPoint { veřejnost: GeoPoint(Stupně zeměpisná šířka, Stupně zeměpisná délka); /// Funkce Move přesune umístění GeoPoint. prázdnota Hýbat se(Stupně zeměpisná šířka_změna, Stupně zeměpisná délka_změna) { // Objekt kontroly volá IsValid při vstupu a výstupu funkce, aby to dokázal // Objekt GeoPoint je platný. Kontrola také zaručuje GeoPoint :: Move // funkce nikdy nevrhne. Zkontrolovat::CheckForNoThrow kontrola(tento, &Je platný); zeměpisná šířka_ += zeměpisná šířka_změna; -li (zeměpisná šířka_ >= 90.0) zeměpisná šířka_ = 90.0; -li (zeměpisná šířka_ <= -90.0) zeměpisná šířka_ = -90.0; zeměpisná délka_ += zeměpisná délka_změna; zatímco (zeměpisná délka_ >= 180.0) zeměpisná délka_ -= 360.0; zatímco (zeměpisná délka_ <= -180.0) zeměpisná délka_ += 360.0; } soukromé: / ** @note CheckFor provádí kontrolu platnosti v mnoha funkcích k určení pokud kód porušil nějaké invarianty, změnil se jakýkoli obsah nebo pokud funkce vyvolala výjimku. */ použitím Zkontrolovat = ::Loki::Zkontrolovat<konst GeoPoint>; /// Tato funkce kontroluje všechny invarianty objektů. bool Je platný() konst { tvrdit(tento != nullptr); tvrdit(zeměpisná šířka_ >= -90.0); tvrdit(zeměpisná šířka_ <= 90.0); tvrdit(zeměpisná délka_ >= -180.0); tvrdit(zeměpisná délka_ <= 180.0); vrátit se skutečný; } Stupně zeměpisná šířka_; /// /// Stupně zeměpisná délka_; /// /// }
Jáva
Toto je příklad invariantní třídy v Programovací jazyk Java s Java Modeling Language Invariant musí platit po dokončení konstruktoru a při vstupu a výstupu všech veřejných členůfunctions. Veřejné členské funkce by měly definovat předpoklad a podmínka abychom zajistili invariantnost třídy.
veřejnost třída datum { int / * @ spec_public @ * / den; int / * @ spec_public @ * / hodina; / * @ invariant day> = 1 && day <= 31; @ * / // invariant třídy / * @ invariantní hodina> = 0 && hodina <= 23; @ * / // invariant třídy /*@ @requires d> = 1 && d <= 31; @ požaduje h> = 0 && h <= 23; @*/ veřejnost datum(int d, int h) { // konstruktor den = d; hodina = h; } /*@ @requires d> = 1 && d <= 31; @ den zabezpečení == d; @*/ veřejnost prázdnota setDay(int d) { den = d; } /*@ @vyžaduje h> = 0 && h <= 23; @hodina hodin == h; @*/ veřejnost prázdnota nastavitHour(int h) { hodina = h; }}
Reference
- ^ Meyer, Bertrand. Objektově orientovaná konstrukce softwaru, druhé vydání, Prentice Hall, 1997, str. 570.
- ^ E. Gamma, R. Helm, R. Johnson a J. Vlissides. Návrhové vzory: Prvky opakovaně použitelného objektově orientovaného softwaru. Addison-Wesley, Reading, Massachusetts, 1995., s. 20.
- ^ Oficiální dokumenty v Pythonu, prosazovat prohlášení
- ^ „Programování smluv - programovací jazyk D“. dlang.org. Citováno 2020-10-29.