Detta papper betraktar mönster [5] som en omvandling från ett "före"-system bestående av en serie klasser (ofta en enda ostrukturerad klass) till ett "efter"-system som består av en samling klasser som organiseras av mönstret. För att bevisa att dessa omvandlingar är formella finesser antar vi en version av Object Calculus [4] som ett semantiskt ramverk. Vi gör uttryckligen de villkor under vilka dessa omvandlingar är formellt korrekta. Vi ger några ytterligare mönster omvandlingar som har kallats "annealing" i VDM ++ världen, som inkluderar införandet av samtidig körning i ett initialt sekventiellt system. Vi visar att dessa mönster kan klassificeras på grundval av en liten uppsättning grundläggande omvandlingar som återspeglas i de tekniker som används för att bevisa att de är korrekta. Designmönster är karakteristiska strukturer av klasser eller objekt som kan återanvändas för att uppnå särskilda designmål på ett elegant sätt. Till exempel, "State" mönster diskuteras i avsnitt 5.1 nedan, ersätter lokala attribut för en klass som registrerar dess tillstånd (i betydelsen en ändlig tillstånd maskin) med ett objekt som ger polymorfisk funktionalitet i stället för villkor beroende på staten. Om mönster ska användas för formella objektorienterade språk och metoder, såsom VDM ++ [2], måste de förhållanden under vilka deras användning leder till ett funktionellt korrekt förfining steg identifieras. Semantiken i objektorienterade system har getts i ett logiskt axiomatiskt ramverk som kallas objektanalys [4]. Här använder vi en förlängning av denna ram som gör det möjligt att använda strukturerade åtgärder som motsvarar programplaneringsspråkförklaringar, för att formulera semantiken i "före" och "efter" versioner av ett system på vilket ett mönster har tillämpats, och visa att "efter" versionen förfinar "före" versionen. Avsnitt 2 introducerar objektkalkylen och syntaxen för VDM ++ [2] som vi kommer att använda för att illustrera mönster. Avsnitt 3, 4 och 5 tar hänsyn till vissa typiska mönster från [5] och andra källor, som behandlar skapelsemönster, strukturella mönster respektive beteendemönster. Avsnitt 6 ger en klassificering av mönster och bevistekniker. En objektkalkyl [4]-teori består av samlingar av typ- och konstantsymboler, attributsymboler (som anger tidsvarierande data), åtgärdssymboler (som anger atomoperationer) och en uppsättning axiom som beskriver typerna av attribut och effekterna, behörighetsbegränsningar och andra dynamiska egenskaper hos åtgärderna. Axiomerna specificeras med hjälp av linjära temporallogiska operatörer: (i nästa tillstånd), u (i tidigare tillstånd), U (stark tills), S (stark sedan), 2 (alltid BCS-FACS Northern Formal Methods Workshop, 1996 FORMALISERING DESIGN PATTERNS i framtiden) och (någon gång i framtiden). Det antas vara ett första ögonblick. Den predikat BEG är sant exakt vid denna tidpunkt. och u är också uttryck konstruktörer. Om e är ett uttryck, betecknar e värdet av e i nästa tidsintervall, medan u e betecknar värdet av e i föregående tidsintervall. Den version som används här är den som definieras i [7] för att ge en semantik till VDM ++. I denna version åtgärder är potentiellt durativ och överlappande, med tillhörande tider!(; i), "(; i) och #(; i) anger respektive tidpunkter då i-th anrop av begärs, aktiverar och avslutar (där i 2 N 1 ). Modal operators } "holds at a time" och ~ "värde at a time" läggs till: '} t hävdar att'håller vid t, medan e~t är värdet av e vid tidpunkten t. För att ge en semantik till en klass C, i exempelvis OMT [11], Syntropy [1] eller VDM ++, definierar vi en teori C som har typsymbolen @C som representerar alla möjliga fall av C, attributsymbol C som representerar alla befintliga objekt i C, och skapande åtgärd nya C (c : @C) och radering åtgärd döda C (c : @C) som respektive lägga till och ta bort c från denna uppsättning. Varje egenskap att objekt c av C formellt representeras av ett attribut att(c : @C) av C (skrivs som c:att för överensstämmelse med standard OO notation) och varje metod handling(x : X) representeras av en handling symbol akt(c : @C; x : X), skriven som c!act(x). Utdataparametrar och lokala metodvariabler representeras också som attributsymboler. Ett ytterligare attribut ingår nu för att representera den nuvarande globala tiden. Lägg märke till att C och nu är klassattribut och nya C och döda C är klasstalan, medan c:att och c!act är på objektnivån. Vi kan definiera effekten av metoder med hjälp av den "kallande" operatören mellan åtgärder: 8 i : N 1 nu = " (; i) : 9 j : N 1 " ( ; j) = " ( ; i)# ( ; j) = # ( ; i) Med andra ord: varje anrop intervall av är också en av. Detta generaliserar Object Calculus formel ) för att ta hänsyn till fallet där båda åtgärderna är durativ, och där kan vara sammansatta. Sammansatta åtgärder definieras för att representera specifikation uttalanden och körbar kod: pre G post P namnger en åtgärd med följande egenskaper: 8 i: N 1 nu = "(; i) ) G}" (; i) 8 i: N 1 nu = "(; i) ) P[att~" (; i)= ( att]} # (; i) Med andra ord, G måste vara sant vid varje aktiveringstidpunkt av, Medan P, med varje "hooked" attribut (att tolkas som värdet att~" (; i) av att vid initieringen av, innehar vid motsvarande uppsägningstid. En ramaxiom, som kallas lokalitet antagande, hävdar att attribut för ett objekt a av C endast kan ändras över intervaller där minst en av de åtgärder a!m (e) av en utför [3]. På samma sätt kan C bara förändras till följd av nya C eller döda C-anrop. Inlämning t 1 := t 2 kan definieras som åtgärden före sant inlägg t 1 = (t 2 där t 1 är en attributsymbol. På samma sätt kan den sekventiella sammansättningen ";" och den parallella sammansättningen "jj" av åtgärder uttryckas som härledda kombinatorer:
I REF, olika mönster är formellt visat sig vara förfining omvandlingar i semantisk betydelse jämfört med en mer infödd / hård-trådad kodning av motsvarande mönster.
Formalising design patterns
{'venue': 'FME 1996', 'journal': None, 'mag_field_of_study': ['Computer Science']}