Metaobjekt - Metaobject

I datalogi er et metaobjekt et objekt, der manipulerer, opretter, beskriver eller implementerer objekter (inklusive sig selv). Objektet, som metaobjektet vedrører, kaldes basisobjektet. Nogle oplysninger, som et metaobjekt kan definere, inkluderer basisobjektets type , interface , klasse , metoder , attributter , parse-træ osv. Metaobjekter er eksempler på datalogisk begreb refleksion , hvor et system har adgang (normalt på kørselstid) til dets egen intern struktur. Refleksion gør det muligt for et system i det væsentlige at omskrive sig selv i farten og ændre sin egen implementering, når det udføres.

Metaobject-protokol

En metaobjektprotokol (MOP) giver ordforrådet ( protokol ) til at få adgang til og manipulere strukturen og opførslen af objektsystemer . Typiske funktioner i en metaobject-protokol inkluderer:

  • Opret eller slet en ny klasse
  • Opret en ny ejendom eller metode
  • Få en klasse til at arve fra en anden klasse ("ændre klassestrukturen")
  • Generer eller skift koden, der definerer metoderne for en klasse

Metaobject-protokollen er i modstrid med Bertrand Meyers åbne / lukkede princip , som fastslår, at softwareobjektsystemer skal være åbne for udvidelse, men lukkes til modifikation . Dette princip skelner effektivt mellem at udvide et objekt ved at tilføje det og at modificere et objekt ved at omdefinere det, idet det foreslås, at førstnævnte er en ønskelig kvalitet (" objekter skal kunne udvides til at opfylde kravene i fremtidige brugssager "), mens sidstnævnte er uønsket (" objekter skal give en stabil grænseflade, der ikke er underlagt opsummeret revision "). Metaobject-protokol udsætter derimod gennemsigtigt den interne sammensætning af objekter og hele objektsystemet med hensyn til selve systemet. I praksis betyder det, at programmører kan bruge objekter til at omdefinere sig selv, muligvis på ganske komplekse måder.

Desuden er metaobject-protokollen ikke kun en grænseflade til en "underliggende" implementering; snarere, gennem metaobject protokol objektet systemet rekursivt implementeret i form af en meta -object system, som selv er teoretisk implementeret i form af en meta -metaobject system og så videre, indtil en vilkårlig base case (en konsistent tilstand objektsystemets ) bestemmes, idet protokollen som sådan er det rekursive funktionelle forhold mellem disse implementeringsniveauer.

Implementering af objektsystemer på en sådan måde åbner muligheden for radikalt diskretionært redesign, hvilket giver dyb fleksibilitet, men indfører muligvis komplekse eller vanskelige at forstå metastabilitetsproblemer (for eksempel må objektsystemet ikke destruktivt opdatere sin egen metaobjektprotokol - dens interne selv- repræsentation - men den potentielle destruktivitet af nogle opdateringer er ikke trivielt at forudsige og kan være svært at argumentere for), afhængigt af den rekursive dybde, som de ønskede ændringer udbredes til. Af denne grund bruges metaobject-protokol, når den findes på et sprog, normalt sparsomt og til specialiserede formål såsom software, der transformerer anden software eller sig selv på sofistikerede måder, for eksempel i reverse engineering.

Kørselstid og kompileringstid

Når kompilering ikke er tilgængelig under kørsel, er der yderligere komplikationer for implementeringen af ​​metaobject-protokollen. For eksempel er det muligt at ændre typehierarkiet med en sådan protokol, men det kan medføre problemer for kode kompileret med en alternativ klassemodeldefinition. Nogle miljøer har fundet innovative løsninger til dette, fx ved at håndtere metaobjektproblemer på kompileringstidspunktet. Et godt eksempel på dette er OpenC ++ . Den Semantic Web objektorienterede model er mere dynamisk end de fleste standard objektsystemer og er i overensstemmelse med runtime metaobject protokoller. For eksempel forventes det, at klasser i Semantic Web-modellen ændrer deres forhold til hinanden, og der er en særlig inferensmotor kendt som en klassifikator, der kan validere og analysere udviklende klassemodeller.

Anvendelse

Den første metaobject-protokol var på det objektorienterede programmeringssprog Smalltalk, der blev udviklet ved Xerox PARC . Den fælles Lisp Object System (CLOS) kom senere og var påvirket af Smalltalk protokol samt ved Brian C. Smith 's oprindelige undersøgelser på 3-Lisp som en uendelig tårn af bedømmere. CLOS-modellen tillader i modsætning til Smalltalk-modellen en klasse at have mere end en superklasse ; dette øger yderligere kompleksitet i spørgsmål som at løse klassens hierarkis afstamning på en eller anden objektinstans. CLOS giver også mulighed for dynamisk multimethodforsendelse , som håndteres via generiske funktioner snarere end meddelelser, der passerer som i Smalltalks enkeltforsendelse . Den mest indflydelsesrige bog, der beskriver semantikken og implementeringen af ​​metaobject-protokollen i Common Lisp, er The Art of the Metaobject Protocol af Gregor Kiczales et al.

Metaobject-protokoller bruges også i vid udstrækning i softwaretekniske applikationer. I stort set alle kommercielle CASE, re-engineering og integrerede udviklingsmiljøer er der en eller anden form for metaobject-protokol til at repræsentere og manipulere designartefakterne.

En metaobject-protokol er en måde at implementere aspektorienteret programmering på . Mange af de tidlige grundlæggere af MOP'er, herunder Gregor Kiczales , er siden gået videre til at være de primære fortalere for aspektorienteret programmering. Kiczales et al. af PARC blev hyret til at designe AspectJ til Java , et sprog der ikke har en native metaobject-protokol.

Se også

Referencer

eksterne links