Dart Kurs Weiter zu Kompilierung

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');
  }
}
Car

Das Ganze.

Engine

Der Teil.

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
  1. Implementiere Product mit name und price.
  2. Implementiere ShoppingCart mit addProduct und total.
  3. Erklaere, ob products eher Komposition oder Aggregation ist.
  4. Erweitere ShoppingCart um Methode removeProduct.

12. Uebungen

  1. Baue Klasse Address und Klasse Person, die eine Address besitzt.
  2. Entscheide: Ist das Komposition oder Aggregation? Begruende.
  3. Baue Klasse Playlist mit Liste von Song-Objekten.
  4. Schreibe Methode totalDuration().
  5. Zeichne fuer Warenkorb, Kurs und Auto jeweils ein kleines Objekt-Diagramm.
  6. Schreibe zu jeder Methode zuerst eine kurze Code-Planung.
Weiter zu Kompilierung