Ugrás a tartalomhoz

object composition

A Wikiszótárból, a nyitott szótárból


Főnév

object composition (tsz. object compositions)

  1. (informatika) A composition (kompozíció) az objektum-orientált programozás egyik alapvető elve. A C++-ban az objektum kompozíció azt jelenti, hogy egy osztály egy másik osztály példányát tagváltozóként tartalmazza, és ő maga felelős annak létrehozásáért és életciklusáért. Ez erős „has-a” kapcsolat, ahol a tartalmazott objektum a tartalmazó részének tekintendő.



🧱 Kompozíció jellemzői

  • Erős kapcsolat: a komponált (tartalmazott) objektum az egész része.
  • A komponált objektum a tartalmazó objektummal együtt jön létre és szűnik meg.
  • A tartalmazott objektum tipikusan érték szerint (nem pointerként) szerepel.
  • A tartalmazó osztály teljes felelősséggel tartozik a komponált objektumért.



🧩 Példa: Kompozíció C++-ban

#include <iostream>
using namespace std;

class Engine {
public:
    void start() const {
        cout << "Engine started." << endl;
    }
};

class Car {
private:
    Engine engine;  // Kompozíció: Car birtokolja az Engine-t

public:
    void start() {
        cout << "Car starting..." << endl;
        engine.start();  // Eléri a komponált objektumot
    }
};
int main() {
    Car myCar;
    myCar.start();
}

Ebben a példában:

  • A Car automatikusan létrehozza az Engine példányt.
  • Ha a Car példány megszűnik, az Engine is automatikusan megsemmisül.
  • A Car és Engine között szoros életciklus-kötés van → kompozíció.



🆚 Kompozíció vs Aggregáció

Tulajdonság Kompozíció Aggregáció
Kapcsolat típusa Szoros (erős tulajdonlás) Laza (használat, nem birtoklás)
Objektum példányosítása Belül (érték szerint) Kívülről átadott (pointer/reference)
Életciklus Együtt jön létre és szűnik meg Független életciklus
Felelősség Tartalmazó objektumé Külső, hívó oldali
Példa Engine engine; Engine* engine; vagy Engine& e;



🛠 Kompozíció és inicializálás

A komponált objektumokat a tartalmazó osztály konstruktor inicializáló listájában érdemes inicializálni:

class Car {
private:
    Engine engine;
public:
    Car() : engine() {}  // engine példányosítása az inicializáló listában
};

Ha az Engine nem rendelkezik alapértelmezett konstruktorral, akkor kötelező is megadni:

class Engine {
    int horsepower;
public:
    Engine(int hp) : horsepower(hp) {}
};

class Car {
    Engine engine;
public:
    Car() : engine(150) {}  // Megadjuk az Engine példányosítását
};

🎯 Miért előnyös a kompozíció?

  • Egyszerű életciklus-kezelés: nem kell törölni, elég ha a gazda objektum megszűnik.
  • Jobb kapszulázás: a komponált objektum privát, csak a tartalmazón keresztül elérhető.
  • Erős logikai kapcsolat: a részek nem értelmezhetők a „teljes” objektum nélkül.
  • Biztonságosabb memóriahasználat: nem kell manuálisan foglalkozni a memóriakezeléssel.



💡 Tipikus példák

  • Egy House osztály tartalmazhat Room objektumokat:

    class Room { /* ... */ };
    class House {
        Room livingRoom;
        Room kitchen;
    };
    
  • Egy Book osztály tartalmazhat Page objektumokat.

  • Egy Person osztály tartalmazhat Name objektumot, vagy Address objektumot.



🧠 Kompozíció a „prefer composition over inheritance” elv része

A modern C++ programozásban gyakori ajánlás:

„Inkább használj kompozíciót, mint öröklést”

Miért?

  • Az öröklés szoros és merev kapcsolat.
  • A kompozíció rugalmas, dinamikusan változtatható, és jobb újrafelhasználhatóságot nyújt.
  • A kompozícióval modulárisan felépített osztályok jönnek létre → jobb karbantarthatóság.



⚠️ Hibák, amiket el kell kerülni

  • Ne próbáld a kompozíciót pointerrel vagy dinamikus memóriával utánozni, hacsak nem muszáj → ez inkább aggregációhoz hasonlít.
  • Ne tegyél túl sok dolgot a komponált objektumokba – tartsd őket egyszerű és koherens egységeknek.



🧾 Összefoglalás (TL;DR)

  • A kompozíció egy erős, szoros kapcsolat két osztály között.
  • A tartalmazó osztály teljes kontrollal és felelősséggel bír a komponált objektum felett.
  • Hasznos, ha a komponált objektum logikailag az egész része.
  • Biztonságosabb és rugalmasabb, mint az öröklés sok esetben.
  • A modern objektum-orientált tervezés egyik leggyakrabban ajánlott mintája.