İçeriğe geç / Skip to content / Zum Inhalt
Ahmet Balaman LogoAhmet Balaman

Dart Enum und Composition – wie organisiert man Code?

Ahmet Balaman
DartEnumCompositionOOPFlutter

Mein Einstieg in Enum und Composition

Gestern habe ich mit den Dart-Grundlagen begonnen. Heute habe ich mir fortgeschrittenere Themen angesehen: Enums und Composition. Anfangs dachte ich „Wofür ist das gut?“, aber sobald ich die Anwendungsfälle sah, hat es Klick gemacht.

Live-Demo: Dart Enum und Composition

Probieren Sie den Einsatz von Enum und Composition interaktiv aus:

Was ist ein Enum? Warum verwenden wir es?

Stellen Sie sich ein Enum wie eine Speisekarte vor. Sie bauen zum Beispiel eine App zum Pizzabestellen, und Pizzen haben Größen: klein, mittel, groß. Statt jedes Mal die Zeichenketten „klein“, „mittel“ und „groß“ zu schreiben, definieren und verwenden Sie ein Enum.

Ein praktisches Beispiel: Farbauswahl

Ich habe es zuerst mit einer Farbauswahl ausprobiert:

enum Colors {
  red,
  blue,
  white
}

void main() {
  whichColor(Colors.blue);
}

void whichColor(Colors color) {
  switch (color) {
    case Colors.white:
      print("White selected");
      break;
    case Colors.red:
      print("Red selected");
      break;
    case Colors.blue:
      print("Blue selected");
      break;
  }
}

Da wir in diesem Code Colors.blue übergeben haben, wird „Blau ausgewählt“ auf dem Bildschirm ausgegeben.

Was an Enums gut ist

  1. Geringere Fehlerwahrscheinlichkeit: Sie verschreiben sich nicht zu „bluee“ oder „blu“
  2. Lesbarerer Code: Colors.blue ist aussagekräftiger als die Zeichenkette „blue“
  3. IDE-Unterstützung: VS Code oder Android Studio bietet Ihnen Autovervollständigung

Anwendungsbeispiel in Flutter

Stellen Sie sich vor, Sie machen State Management in einer App:

enum AppState {
  loading,
  success,
  error,
  emptyContent
}

void checkState(AppState state) {
  switch (state) {
    case AppState.loading:
      // Show loading widget
      break;
    case AppState.success:
      // Show data
      break;
    case AppState.error:
      // Show error message
      break;
    case AppState.emptyContent:
      // "No content found" message
      break;
  }
}

Sehr sauber und verständlich, oder?

Composition – die Has-a-Beziehung

Das Thema Composition war anfangs etwas verwirrend, aber so habe ich es verstanden: Sie verwenden eine Klasse innerhalb einer anderen Klasse. Also eine „hat ein“-Beziehung.

Beispiel aus dem echten Leben

Eine Person hat bestimmte Daten. Auch ihr Auto hat Daten. Beim Definieren des Autos wollen wir aber nicht alle Personendaten erneut schreiben:

class PersonInfo {
  late int id;
  late String name;
  late int age;
  
  PersonInfo({
    required this.id,
    required this.name,
    required this.age
  });
}

class CarInfo {
  PersonInfo person; // This is important!
  late String carName;
  late String plate;
  
  CarInfo({
    required this.person,
    required this.carName,
    required this.plate
  });
}

void main() {
  var person1 = PersonInfo(
    age: 25,
    name: "Ahmet",
    id: 1233
  );
  
  var car1 = CarInfo(
    person: person1,
    carName: "Toyota Corolla",
    plate: "34 ABC 123"
  );
  
  print("Person named ${car1.person.name} has a car: ${car1.carName}");
  print("Plate: ${car1.plate}");
}

Warum ist das so wichtig?

Überlegen Sie: Sie können die Personendaten für Auto, Haus und Arbeitsdaten nutzen. Statt jedes Mal ID, Name und Alter zu schreiben, verwenden Sie einfach die Klasse PersonInfo.

Das vermeidet Codewiederholung, wird übersichtlicher und erleichtert Änderungen. Wenn Sie der Person etwa eine Telefonnummer hinzufügen möchten, müssen Sie nur die Klasse PersonInfo anpassen.

Beispiel für Composition in Flutter

Tatsächlich nutzen wir Composition ständig, wenn wir in Flutter Widgets schreiben:

class UserCard extends StatelessWidget {
  final User user; // Composition
  
  UserCard({required this.user});
  
  @override
  Widget build(BuildContext context) {
    return Card(
      child: ListTile(
        title: Text(user.name),
        subtitle: Text(user.email),
        leading: CircleAvatar(
          child: Text(user.name[0]),
        ),
      ),
    );
  }
}

Wie Sie sehen, verwenden wir die Klasse User direkt. Ändern sich die Benutzerdaten, passen wir sie nur an einer Stelle an.

Was habe ich heute gelernt?

  • Enums ordnen den Code und verringern die Fehlerwahrscheinlichkeit
  • Composition erlaubt es uns, Klassen zu kombinieren (Has-a-Beziehung)
  • Beides sind in Flutter sehr häufig genutzte Strukturen

Morgen sehe ich mir Vererbung und Polymorphie an. Die wirken sogar noch spannender!

Lernressourcen

Um Enum und Composition zu verstehen:

  • Die offizielle Dokumentation von Dart
  • Mein eigener Experimentiercode
  • Beispiele auf StackOverflow

Ich hoffe, dieser Artikel war hilfreich für Sie. Schreiben Sie gern einen Kommentar, wenn Sie Fragen haben!


Kontakt:

Kommentare