Objektsammensætning - Object composition

I datalogi er objektsammensætning en måde at kombinere objekter eller datatyper til mere komplekse. Almindelige slags kompositioner er objekter, der bruges i objektorienteret programmering , taggede fagforeninger , sæt , sekvenser og forskellige grafstrukturer . Objektsammensætninger vedrører, men er ikke det samme som datastrukturer.

Objektsammensætning refererer til den logiske eller konceptuelle struktur af informationen, ikke implementeringen eller den fysiske datastruktur, der bruges til at repræsentere den. For eksempel adskiller en sekvens sig fra et sæt, fordi rækkefølgen af ​​de sammensatte genstande (blandt andet) betyder noget for førstnævnte, men ikke for sidstnævnte. Datastrukturer som arrays , sammenkædede lister , hash-tabeller og mange andre kan bruges til at implementere en af ​​dem. Måske forvirrende bruges nogle af de samme udtryk til både datastrukturer og kompositter. For eksempel kan " binært træ " henvise til enten: som en datastruktur er det et middel til at få adgang til en lineær sekvens af emner, og de faktiske placeringer af emner i træet er irrelevante (træet kan omarrangeres internt, uanset hvordan man kan lide det, uden at ændre dens betydning). Som en objektsammensætning er positionerne imidlertid relevante, og ændring af dem vil ændre betydningen (som for eksempel i kladogrammer ).

Programmeringsteknik

Objektorienteret programmering er baseret på objekter til at indkapsle data og adfærd. Det bruger to hovedteknikker til samling og komponering af funktionalitet i mere komplekse teknikker, undertypning og objektsammensætning. Objektsammensætning handler om at kombinere objekter i sammensatte objekter og samtidig sikre indkapsling af hvert objekt ved hjælp af deres veldefinerede grænseflade uden synlighed af deres indre. I denne henseende adskiller objektsammensætningen sig fra datastrukturer, som ikke håndhæver indkapsling.

Objektsammensætning kan også handle om en gruppe af flere relaterede objekter, såsom et sæt eller en sekvens af objekter. Delegationen kan berige sammensætningen ved at videresende anmodninger eller opkald til det vedlagte sammensatte objekt til en af ​​dens interne komponenter.

klassebaserede og typede programmeringssprog kan typer opdeles i sammensatte og ikke-sammensatte typer, og komposition kan betragtes som et forhold mellem typer: et objekt af en sammensat type (f.eks. Bil ) " har " objekter af andre typer ( fx hjul ). Når et sammensat objekt indeholder flere underobjekter af samme type, kan de tildeles til bestemte roller , ofte adskilt af navne eller tal. For eksempel en punkt kunne objekt indeholde 3 tal, der hver repræsenterer afstanden langs en anden akse, som 'x', 'y' og 'z'. Undersøgelsen af ​​del-hele relationer generelt er mereologi .

Komposition skal skelnes fra subtyping , hvilket er processen med at føje detaljer til en generel datatype for at skabe en mere specifik datatype. For eksempel kan biler være en bestemt type køretøj: bil er et køretøj . Subtyping beskriver ikke et forhold mellem forskellige objekter, men siger i stedet, at objekter af en type samtidig er objekter af en anden type. Undersøgelsen af ​​sådanne forhold er ontologi .

I prototype- baserede programmeringssprog som JavaScript kan objekter dynamisk arve adfærd fra et prototype-objekt i øjeblikket med deres instantiering. Komposition skal skelnes fra prototyping: det nyligt instantierede objekt arver sammensætningen af ​​sin prototype, men det kan selv være komponeret alene.

Kompositobjekter kan repræsenteres ved opbevaring ved samlokalisering af de sammensatte objekter, ved samlokalisering af referencer eller på mange andre måder. Elementer inden for et sammensat objekt kan henvises til som attributter , felter , medlemmer , egenskaber eller andre navne, og den resulterende sammensætning som sammensat type , lagerregistrering , struktur , tuple eller en brugerdefineret type (UDT) . For detaljer, se aggregeringsafsnittet nedenfor.

UML-modelleringsteknik

En cykelklasse repræsenteret i UML med tre egenskaber: sadel, hjul og dele, hvor de to sidst har en flerhed, der angiver flere objekter
Objektsammensætning ved hjælp af UML-egenskaber til at komponere objekter

I UML- modellering kan objekter sammensættes konceptuelt uafhængigt af implementeringen med et programmeringssprog. Der er fire måder at komponere objekter i UML: ejendom, tilknytning, sammenlægning og sammensætning:

  • En ejendom repræsenterer en attribut for klassen.
  • En tilknytning repræsenterer et semantisk forhold mellem forekomster af de tilknyttede klasser. Medlemsslutningen af ​​en forening svarer til en ejendom i den tilknyttede klasse.
  • En aggregering er en slags tilknytning, der modellerer et forhold mellem del / helhed mellem et aggregat (helhed) og en gruppe af relaterede komponenter (dele).
  • En sammensætning, også kaldet en sammensat sammenlægning, er en slags sammenlægning, der modellerer en del / hel-relation mellem en sammensat (helhed) og en gruppe af eksklusivt ejede dele.

Forholdet mellem aggregatet og dets komponenter er et svagt "has-a" -forhold: Komponenterne kan være en del af flere aggregater, kan fås gennem andre objekter uden at gå gennem aggregatet og kan overleve det samlede objekt. Komponentobjektets tilstand udgør stadig en del af det samlede objekt.

Forholdet mellem kompositten og dens dele er et stærkt ”has-a” forhold: Det sammensatte objekt har det eneste " ansvar for eksistensen og opbevaringen af ​​de sammensatte objekter ", det sammensatte objekt kan højst være en del af en sammensat, og " Hvis et sammensat objekt slettes, slettes alle dets delforekomster, der er objekter, sammen med det ". Således i UML har komposition en mere snæver betydning end den sædvanlige objektsammensætning.

Forbindelse mellem flere cykler, der hver har en ejer;  Sammensætning af en cykel med rammedele, der fremstiller cyklen;  og sammenlægning af en cykel med dens hjul, som findes uden cyklen
UML-notation til tilknytning, sammensætning og sammenlægning

Den grafiske notation repræsenterer:

  • ejendommen som et indtastet element i boksen i den indesluttende klasse,
  • foreningen som en klar linje mellem de tilknyttede klasser,
  • den aggregering som en ikke-udfyldt diamant på siden af aggregatet og en fuldt optrukket linie,
  • sammensætningen som en fyldt diamant på siden af ​​kompositten og en solid linje.


Særlige formularer

Indeslutning

Sammensætning, der bruges til at gemme flere forekomster af den sammensatte datatype, kaldes indeslutning. Eksempler på sådanne containere er arrays , associative arrays , binære træer og sammenkædede lister .

I UML er indeslutning afbildet med en flerhed på 0 .. * eller 1 .. *, hvilket indikerer, at det sammensatte objekt er sammensat af et ukendt antal forekomster af den sammensatte klasse.

Rekursiv sammensætning

Objekter kan sammensættes rekursivt, og deres type kaldes derefter rekursiv type . Eksempler inkluderer forskellige slags træer , DAG'er og grafer . Hver knude i et træ kan være en gren eller et blad; med andre ord, hver node er et træ på samme tid, når det tilhører et andet træ.

I UML er rekursiv sammensætning afbildet med en tilknytning, sammenlægning eller sammensætning af en klasse med sig selv.

Sammensat mønster

Det sammensatte designmønster er et objektorienteret design baseret på sammensatte typer, der kombinerer rekursiv komposition og indeslutning for at implementere komplekse del-hele hierarkier.

Sammensatte typer i C

Dette er et eksempel på sammensætningen i C .

struct Person
{
  int age;
  char name[20];
  enum {job_seeking, professional, non_professional, retired, student} employment;
};

I dette eksempel kombineres de primitive (ikke-sammensatte) typer int , enum {job_seeking, professional, non_professional, pensioneret, student } og den sammensatte array type char [] for at danne den sammensatte struktur Person . Hver personstruktur "har derefter" en alder, navn og en beskæftigelsestype.

Tidslinje for komposition på forskellige sprog

C kalder en post for en struktur eller struktur; objektorienterede sprog som Java , Smalltalk og C ++ holder ofte deres poster skjult inde i objekter ( klasseinstanser ); sprog i ML- familien kalder dem simpelthen poster. COBOL var det første udbredte programmeringssprog, der understøttede poster direkte; ALGOL 68 fik det fra COBOL, og Pascal fik det mere eller mindre indirekte fra ALGOL 68. Common Lisp leverer strukturer og klasser (sidstnævnte via Common Lisp Object System ).

1959 - COBOL
      01  customer-record.
        03  customer-number     pic 9(8) comp.
        03  customer-name.
          05  given-names       pic x(15).
          05  initial-2         pic x.
          05  surname           pic x(15).
        03  customer-address.
          05  street.
            07  street-name     pic x(15).
              09  house-number  pic 999 comp.
          05  city              pic x(10).
          05  country-code      pic x(3).
          05  postcode          pic x(8).
        03  amount-owing        pic 9(8) comp.
1960 - ALGOL 60

Arrays var den eneste sammensatte datatype i Algol 60 .

1964 - PL / I
dcl 1 newtypet based (P);
 2 (a, b, c) fixed bin(31),
 2 (i, j, k) float,
 2 r ptr;
allocate newtypet;
1968 - ALGOL 68
int max = 99;
mode newtypet = [0..9] [0..max]struct (
 long real a, b, c, short int i, j, k, ref real r
);
newtypet newarrayt = (1, 2, 3, 4, 5, 6, heap real := 7)

For eksempel kan en sammenkædet liste erklæres som:

mode node = union (real, int, compl, string),
 list = struct (node val, ref list next);

For ALGOL 68 vises kun typenavnet til venstre for ligestillingen, og især er konstruktionen lavet - og kan læses - fra venstre mod højre uden hensyn til prioriteter.

1970 - Pascal
type
 a = array [1..10] of integer;
 b = record
  a, b, c: real;
  i, j, k: integer;
 end;
1972 - K&R C
#define max 99
struct newtypet {
  double a, b, c;
  float r;
  short i, j, k;
} newarrayt[10] [max + 1];
1977 - FORTRAN 77

Fortran 77 har arrays, men manglede nogen formelle definitioner af record / struktur. Typisk blev sammensatte strukturer bygget op ved hjælp af EQUIVALENCE eller COMMON udsagn:

       CHARACTER NAME*32, ADDR*32, PHONE*16
       REAL OWING
       COMMON /CUST/NAME, ADDR, PHONE, OWING
1983 - Ada
type Cust is
 record
  Name  : Name_Type;
  Addr  : Addr_Type;
  Phone : Phone_Type;
  Owing : Integer range 1..999999;
 end record;

Ada 95 bragte OOP-koncepter gennem taggede typer (svarende til en C ++ - klasse), Ada 2012 tilføjede understøttelse af substitutionsbekræftelse gennem klassekontrakter.

1983 - C ++
const int max = 99;
class {
  public:
  double a, b, c;
  float &r;
  short i, j, k;
}newtypet[10] [max + 1];
1991 - Python
max = 99
class NewTypeT:
    def __init__(self):
        self.a = self.b = self.c = 0
        self.i = self.j = self.k = 0.0
# Initialise an example array of this class.
newarrayt = [[NewTypeT() for i in range(max + 1)] for j in range(10)]
1992 - FORTRAN 90

Arrays og strenge blev arvet fra FORTRAN 77, og et nyt reserveret ord blev introduceret: type

type newtypet
 double precision a, b, c
 integer*2 i, j, k
* No pointer type REF REAL R
 end type

type (newtypet) t(10, 100)

FORTRAN 90 opdaterede og inkluderede FORTRAN IVs koncept kaldet NAMELIST.

INTEGER :: jan = 1, feb = 2, mar = 3, apr = 4
NAMELIST / week / jan, feb, mar, apr
1994 - ANSI Common Lisp

Common Lisp giver strukturer, og ANSI Common Lisp-standard tilføjede CLOS-klasser.

(defclass some-class ()
  ((f :type float)
   (i :type integer)
   (a :type (array integer (10)))))

For flere detaljer om sammensætning i C / C ++, se Composite type .

Aggregering

Aggregering adskiller sig fra almindelig sammensætning, da den ikke indebærer ejerskab. Når kompositionen ødelægges, er de indeholdte objekter også i komposition. Samlet set er dette ikke nødvendigvis sandt. For eksempel ejer et universitet forskellige afdelinger (f.eks. Kemi ), og hver afdeling har et antal professorer. Hvis universitetet lukker, vil afdelingerne ikke længere eksistere, men professorerne i disse afdelinger vil fortsat eksistere. Derfor kan et universitet ses som en sammensætning af afdelinger, mens afdelinger har en samling af professorer. Derudover kunne en professor arbejde i mere end en afdeling, men en afdeling kunne ikke være en del af mere end et universitet.

Komposition implementeres normalt således, at et objekt indeholder et andet objekt. For eksempel i C ++ :

class Professor;  // Defined elsewhere

class Department {
 public:
  Department(const std::string& title): title_(title) {}

 private:
  // Aggregation: |Professors| may outlive the |Department|.
  std::vector<std::weak_ptr<Professor>> members_;
  const std::string title_;
};


class University {
 public:
  University() = default;

 private:
  // Composition: |Department|s exist only as long as the faculty exists.
  std::vector<Department> faculty_ = {
      Department("chemistry"),
      Department("physics"),
      Department("arts"),
  };
};

Samlet set kan objektet kun indeholde en reference eller markør til objektet (og ikke have livstidsansvar for det).

Undertiden kaldes aggregering som sammensætning, når forskellen mellem almindelig sammensætning og aggregering er uvigtig.

Ovenstående kode ville omdannes til følgende UML-klassediagram:

Aggregation-Composition3.png

Aggregering i COM

Aggregering i COM

I Microsofts komponentobjektmodel betyder aggregering, at et objekt eksporterer, som om det var deres ejer, en eller flere grænseflader til et andet objekt, det ejer. Formelt ligner dette mere sammensætning eller indkapsling end aggregering. I stedet for at implementere de eksporterede grænseflader ved at kalde grænsefladerne for det ejede objekt eksporteres grænsefladerne for det ejede objekt selv. Det ejede objekt er ansvarlig for at sikre, at metoderne til de grænseflader, der er nedarvet fra IUnknown, faktisk påkalder ejerens tilsvarende metoder. Dette er for at garantere, at ejerens referencetælling er korrekt, og alle ejerens grænseflader er tilgængelige via den eksporterede grænseflade, mens ingen andre (private) grænseflader til det ejede objekt er tilgængelige.

Se også

Referencer

eksterne links