Geschichte der Frage:
Beide Begriffe – Komposition und Aggregation – stammen aus dem klassischen objektorientierten Design. Sie beschreiben Beziehungen zwischen Objekten: „Teil-Ganzes“, unterscheiden sich jedoch in der Stärke der Verbindung zwischen den Objekten.
Problematik:
In großen Systemen sind Lesbarkeit und Erweiterbarkeit des Codes wichtig. Komposition und Aggregation helfen, sinnvolle Abhängigkeiten zwischen Klassen zu schaffen. Es ist wichtig, den Unterschied zu verstehen – andernfalls kann die Architektur zu starr oder im Gegenteil zu unklar werden.
Lösung:
Komposition – dies ist eine starke Verbindung „Teil-Ganzes“. Wenn ein Objekt nur innerhalb eines anderen Objekts vorhanden ist und außerhalb davon nicht existieren kann. In Python wird ein solches Objekt normalerweise im Container-Klasse erstellt und verwaltet.
Aggregation – dies ist eine schwächere Verbindung. Das Teilobjekt kann unabhängig vom Gesamtobjekt existieren und von außen an dieses übergeben werden.
Beispielcode:
class Engine: def start(self): print("Motor gestartet") class Car: # Komposition: Motor wird innerhalb des Autos erstellt def __init__(self): self.engine = Engine() def drive(self): self.engine.start() mein_auto = Car() mein_auto.drive() class Wheel: pass class Bicycle: # Aggregation: Räder werden von außen übergeben def __init__(self, wheels): self.wheels = wheels w1, w2 = Wheel(), Wheel() bike = Bicycle([w1, w2])
Wesentliche Merkmale:
Wenn das Containerobjekt (zum Beispiel Car) gelöscht wird – wird dann auch das Objekt Engine gelöscht?
Bei Komposition, wenn auf das Teilobjekt nicht mehr verwiesen wird, wird es vom Garbage Collector gelöscht. Bei Aggregation kann das Teilobjekt weiterhin existieren (es kann noch von anderen Objekten referenziert werden).
Gibt es in Python eine spezielle Syntax für Aggregation und Komposition, wie in anderen Sprachen?
In Python gibt es keine Schlüsselwörter, die explizit auf Komposition/Aggregation hinweisen. Alles hängt von der Art und Weise ab, wie Objekte erstellt werden und deren Lebenszyklus.
Kann man Komposition in Aggregation und umgekehrt ändern, ohne die Logik umzuschreiben?
Nicht immer. Wenn die Logik vollständige Kontrolle und Einmaligkeit des Teilobjekts erfordert, kann ein einfacher Wechsel von Komposition zu Aggregation zu Fehlern führen (zum Beispiel, wenn die Räder von verschiedenen Fahrrädern Instanzen derselben Klasse werden).
Vorteile:
Negativer Fall: In einem Projekt wurde für jedes Auto ein externes Motorobjekt erstellt und über Aggregation in das Auto gegeben. Später wurden jedoch die Referenzen auf die Objekte verwechselt und die Motoren zwischen den Autos willkürlich getauscht – was zu Verwirrung und Bugs führte.
Vorteile: Die Architektur schien flexibel. Nachteile: Es war schwer zu erkennen, welcher Motor zu welchem Auto gehört.
Positiver Fall: In einem anderen Projekt wurden Motoren innerhalb der Klasse Car (Komposition) erstellt; die Autos steuerten ihre Motoren direkt, was Zuverlässigkeit gewährte.
Vorteile: Keine Lecks und logische Verwirrung. Nachteile: Es musste etwas mehr Code geschrieben werden, um den Lebenszyklus jedes Autos und seiner Teile zu verwalten.