Lektion 17 - Komposition, Aggregation & Methoden
Objekte arbeiten zusammen
In echten Programmen besteht Logik nicht aus einer einzigen Klasse. Objekte besitzen
andere Objekte, arbeiten mit Listen von Objekten und nutzen Methoden, um Verhalten
sauber zu kapseln.
1. Erstes Bild: Hat-Beziehungen
Komposition und Aggregation beschreiben beide eine Hat-Beziehung. Der Unterschied ist,
wie stark das enthaltene Objekt an das Ganze gebunden ist.
BeziehungBeispiel
Ein Auto hat einen Motoreher Komposition
Ein Kurs hat Teilnehmereher Aggregation
Ein Warenkorb hat Produkteoft Aggregation
Eine App-Seite hat UI-Widgetsoft Komposition
2. Methoden
Methoden sind Funktionen, die zu einem Objekt gehoeren. Sie beschreiben, was ein
Objekt tun kann oder welche Berechnung es ausfuehrt.
class Counter {
int value = 0;
void increase() {
value++;
}
void decrease() {
value--;
}
}
3. Methoden mit Parametern
Parameter machen Methoden flexibel. Statt fuer +1 und +2 eigene Methoden zu
schreiben, kann eine Methode einen Wert entgegennehmen.
class Counter {
int value = 0;
void changeBy(int amount) {
value += amount;
}
}
4. Methoden mit Rueckgabewert
Eine Methode kann einen Wert zurueckgeben. Dann steht vor dem Methodennamen der
Rueckgabetyp, zum Beispiel double, String oder bool.
class Rectangle {
final double width;
final double height;
Rectangle(this.width, this.height);
double area() {
return width * height;
}
}
Wenn eine Berechnung wie eine Eigenschaft wirkt, kann auch ein Getter sinnvoll sein:
double get area => width * height;
5. Komposition
Komposition ist eine starke Teil-Ganzes-Beziehung. Das Ganze erzeugt oder besitzt den
Teil sehr direkt. Wenn das Ganze verschwindet, ist der Teil oft nicht mehr sinnvoll.
class Engine {
void start() {
print('Motor startet');
}
}
class Car {
final Engine engine = Engine();
void drive() {
engine.start();
print('Auto faehrt');
}
}
final Engine engine = Engine()Das Auto erzeugt seinen Motor selbst.
6. Aggregation
Aggregation ist eine lockerere Beziehung. Ein Objekt nutzt andere Objekte, aber diese
Objekte koennen auch unabhaengig existieren.
class Student {
final String name;
Student(this.name);
}
class Course {
final List<Student> students;
Course(this.students);
int get studentCount => students.length;
}
Die Student-Objekte werden von aussen uebergeben. Sie koennen auch in anderen Kursen
oder ausserhalb eines Kurses existieren.
7. Komposition vs. Aggregation
KompositionAggregation
Starke BeziehungLockere Beziehung
Teil wird oft innen erzeugtTeil wird oft von aussen uebergeben
Teil gehoert stark zum GanzenTeil kann unabhaengig existieren
Car erzeugt EngineCourse bekommt Student-Liste
8. Beispiel: Warenkorb
Ein Warenkorb arbeitet mit Produkten. Die Produkte koennen auch ausserhalb des
Warenkorbs existieren. Deshalb ist das haeufig Aggregation.
class Product {
final String name;
final double price;
Product(this.name, this.price);
}
class ShoppingCart {
final List<Product> products = [];
void add(Product product) {
if (product.price > 0) {
products.add(product);
}
}
double total() {
double sum = 0;
for (final product in products) {
sum += product.price;
}
return sum;
}
}
9. Flutter-Bezug
Flutter arbeitet sehr viel mit Komposition: Widgets enthalten andere Widgets. Eine
Column hat Kinder, ein Scaffold hat AppBar und
body.
Scaffold(
appBar: AppBar(title: Text('App')),
body: Padding(
padding: EdgeInsets.all(16),
child: Column(
children: [
Text('Titel'),
ElevatedButton(...),
],
),
),
)
Dieser Widget-Baum ist Komposition: grosse UI-Bausteine bestehen aus kleineren UI-Bausteinen.
10. Methoden sauber benennen
Methodennamen sollten sagen, was passiert. Gute Namen machen Code lesbar, bevor man
jede Zeile im Detail liest.
SchwachBesser
doIt()addProduct(product)
calc()calculateTotal()
x()markAsDone()
11. Code-Planung
Plane einen Warenkorb mit Produkten und Summe.
Erstelle Klasse Product
Attribute:
name
price
Erstelle Klasse ShoppingCart
Attribut:
products als leere Liste
Methode addProduct(product):
Wenn product.price kleiner oder gleich 0 ist:
Fuege nichts hinzu
Sonst:
Fuege product zur products-Liste hinzu
Methode total():
Setze summe auf 0
Fuer jedes product in products:
Addiere product.price zu summe
Gib summe zurueck
- Implementiere
Product mit name und price.
- Implementiere
ShoppingCart mit addProduct und total.
- Erklaere, ob
products eher Komposition oder Aggregation ist.
- Erweitere
ShoppingCart um Methode removeProduct.
12. Uebungen
- Baue Klasse
Address und Klasse Person, die eine Address besitzt.
- Entscheide: Ist das Komposition oder Aggregation? Begruende.
- Baue Klasse
Playlist mit Liste von Song-Objekten.
- Schreibe Methode
totalDuration().
- Zeichne fuer Warenkorb, Kurs und Auto jeweils ein kleines Objekt-Diagramm.
- Schreibe zu jeder Methode zuerst eine kurze Code-Planung.
Weiter zu Kompilierung