Qualifikationsphase Q1 · Themenfeld Q1.1

Q1.1 – Objektorientierte Modellierung als Systemaufbau

Ein durchgehendes Hofladen-Modell: von realen Warenobjekten bis zu abstrakten Typen und Interfaces.

Der Hofladen „Sonnenglück“ möchte Waren im Selbstbedienungshäuschen digital erfassen: Kundinnen und Kunden sollen per App Name, Preis und produktspezifische Informationen abrufen können.

Diese Seite entwickelt deshalb ein einziges Modell schrittweise weiter – nicht als lose Theorieblöcke, sondern als zusammenhängenden Konstruktionsprozess.

Diagramme und Codeausschnitte sind so aufgebaut, dass jede Modellentscheidung direkt am Hofladen-System nachvollziehbar bleibt.

Kerncurriculum
Kerncurriculum kompakt
Einordnung und Lernziele des Themenfelds Q1.1

A) Allgemeine Einordnung

Q1.1 führt in die objektorientierte Modellierung ein: Lernende entwickeln aus konkreten Hofladen-Objekten ein tragfähiges Klassensystem und verbinden fachliche Anforderungen mit UML-gestützter Strukturarbeit.

B) Anforderungen nach Kursniveau

Grundlegendes Niveau
Erhöhtes Niveau (Leistungskurs)
Einstieg
Einstieg: Das Hofladen-System als fachliches Problem
Anforderungen sichtbar machen, bevor modelliert wird

Problem / fachliche Situation

Die App des Hofladens soll nicht nur Produkte auflisten, sondern zu jeder Ware die passenden Informationen liefern: Name und Preis immer, weitere Daten nur bei bestimmten Warentypen (z. B. MHD, Reifezeit, Frische).

Modellentscheidung

Wir entwickeln ein durchgehendes Warenmodell für Apfel, Milch, Käse, Brot und Wurst. Die Leitfrage lautet: Welche Eigenschaften sind gemeinsam, welche spezifisch, und welche Zuständigkeit hat jede Klasse im späteren System?

Definition: Objekt
Ein Objekt ist ein konkretes Exemplar im System, das zu einem Zeitpunkt einen bestimmten Zustand besitzt.

Im Hofladen tauchen Apfel, Milch und Käse zunächst genau als solche konkreten Objekte mit eigenen Zustandswerten auf.

Definition: Klasse
Eine Klasse ist der Bauplan, der festlegt, welche Attribute und Methoden Objekte eines Typs besitzen.

Die spätere Klassenbildung entsteht hier aus der Beobachtung, dass viele Objekte im Diagramm dieselbe Grundstruktur teilen.

Damit wird der Hofladen nicht Kulisse, sondern Treiber aller Modellschritte. Aus dem Beispiel entsteht eine klare Entwicklungslogik: Objektbeschreibung, Klassenbildung, Redundanzanalyse, Vererbung, Polymorphie und Abstraktion.

Objekte
Reale Warenobjekte als Ausgangspunkt
Konkrete Instanzen zeigen Ähnlichkeiten und Unterschiede

Problem / fachliche Situation

Einzelne Waren sind leicht zu beschreiben. Für das Gesamtsystem bleibt aber offen, wie viele ähnliche Instanzen konsistent verwaltet werden sollen.

Modellentscheidung

Wir beginnen mit konkreten Objektbeschreibungen und markieren die wiederkehrenden Kerndaten als Vorbereitung für eine belastbare Klassenbildung.

Diagramm: Objektnahe Startstruktur im Hofladen.
WareObjekt name = "Apfel" preis = 1.20 WareObjekt name = "Milch" preis = 2.40 WareObjekt name = "Käse" preis = 4.90 Objekte enthalten ähnliche Eigenschaften

Die Diagramm-Sicht macht den Übergang vom Einzelfall zur Typbildung sichtbar: Gleiche Muster wiederholen sich über mehrere Produkte hinweg.

Diese Klassenkarten nutzen dieselbe Klassenbox- und Typografie-Logik wie der UML-Klassendiagramm-Editor: Klassenname oben, getrennte Bereiche für Strukturinhalte und die gleiche visuelle Leselogik.

Definition: Instanz
Eine Instanz ist ein konkret erzeugtes Objekt einer Klasse.

Im Diagramm sind die drei gezeigten WareObjekt-Karten konkrete Instanzen mit jeweils eigenen Werten.

Definition: Attribut
Ein Attribut ist eine benannte Eigenschaft, die den Zustand eines Objekts oder einer Klasse beschreibt.

Die Einträge name, preis und später mhd sind im Hofladenmodell genau diese Zustandsattribute.

Die Objektansicht macht den Hofladen anschaulich, liefert aber noch keinen stabilen Bauplan. Weil sich Muster wiederholen, wechseln wir jetzt in die Klassenperspektive.

Klassen
Vom Objekt zur Klasse und naive Klassenbildung
Klassen als Baupläne – und warum der erste Entwurf noch nicht reicht

Problem / fachliche Situation

Wie entstehen Klassen fachlich sinnvoll aus ähnlichen Objekten – und was passiert, wenn jede Ware als eigene, isolierte Klasse modelliert wird?

Modellentscheidung

Wir bilden zunächst getrennte Klassen (Apfel, Milch, Kaese, Brot, Wurst) und prüfen diese Struktur bewusst kritisch auf Redundanz und Zuständigkeit.

Diagramm: Erste Klassenlandschaft ohne Vererbungsbeziehungen.
Apfel - name : String - preis : double + getPreis() : double + getName() : String Milch - name : String - preis : double - mhd : Date + getPreis() : double + getName() : String Käse - name : String - preis : double - reifezeit : int + getPreis() : double + getName() : String Name, Preis und Basis-Methoden tauchen immer wieder auf.

Die Klassen sind als Baupläne klarer als reine Objekte, erzeugen aber noch Codeduplizierung in Attributen und Methoden.

Definition: Methode
Eine Methode beschreibt das Verhalten, das Objekte einer Klasse ausführen können.

Die Methoden getPreis() und getName() tauchen in mehreren Warenklassen auf und zeigen die wiederholte Basislogik.

Definition: Konstruktor
Ein Konstruktor ist eine spezielle Methode, die beim Erzeugen eines Objekts dessen Anfangszustand festlegt.

Wenn im Hofladen eine neue Milch- oder Kaese-Instanz angelegt wird, übernimmt der Konstruktor die Initialisierung von Name, Preis und Produktspezifika.

Ein UML-Klassendiagramm zeigt Klassen mit Attributen, Methoden und Beziehungen in einer strukturierten Übersicht.

Genau diese Sicht macht im gezeigten Diagramm die doppelt modellierten Basisattribute sofort als Entwurfsproblem sichtbar.

Konvention wie im UML-Werkzeug: Sichtbarkeit wird direkt vor Attributen/Methoden notiert (- privat, # protected, + öffentlich). So ist im Diagramm sofort lesbar, welche Elemente intern bleiben und welche von außen nutzbar sind.

Die Klassenbildung ist ein Fortschritt gegenüber Einzelobjekten, aber noch nicht wirtschaftlich: gleiche Grundlogik liegt verteilt in vielen Klassen. Genau daraus entsteht der Bedarf nach Vererbung.

Beziehungen
Einfache Klassenbeziehungen auf Grundniveau
Assoziation und Aggregation einzeln und explizit einführen

Problem / fachliche Situation

Klassen existieren nicht isoliert: Kundinnen, Warenkörbe und Waren stehen in fachlichen Beziehungen. Diese Grundlagen sollen vor Vererbung geklärt werden.

A) Assoziation

Definition: Assoziation
Eine Assoziation beschreibt eine fachliche Beziehung zwischen zwei Klassen, ohne dass eine Klasse Teil der anderen sein muss.
class Kunde {
  private String name;

  public void waehleWare(Ware ware) {
    System.out.println(name + " wählt " + ware.getName());
  }
}
UML-Konvention Assoziation: Linie zwischen Klassen, bei gerichteter Assoziation mit Pfeil zur Zielklasse.
Kunde- name : String+ waehleWare(w : Ware) Ware# name : String+ getName() : String waehlt 10..1

Damit wird die Assoziation fachlich konkret: Kunde kennt ausgewählte Ware-Objekte für den Kaufprozess, ohne Besitzstruktur zu modellieren.

B) Aggregation

Definition: Aggregation
Aggregation ist eine spezielle Assoziation, bei der ein Ganzes aus Teilen besteht, die grundsätzlich auch unabhängig existieren können.
class Warenkorb {
  private final List<Ware> positionen = new ArrayList<>();

  public void add(Ware ware) { positionen.add(ware); }
  public List<Ware> getPositionen() { return positionen; }
}
UML-Konvention Aggregation: Leere Raute am „Ganzen“, Verbindungslinie zum Teil.
Warenkorb- positionen : List<Ware>+ add(w : Ware) Ware# name : String+ getName() : String enthaelt 10..*

Der Warenkorb aggregiert Warenpositionen für den Vorgang, die Ware-Objekte können aber auch außerhalb des Warenkorbs weiter existieren (z. B. im Sortiment).

Kapselung
Kapselung und Sichtbarkeit
Geheimnisprinzip vor Vererbung stabil verankern

Modellentscheidung

Definition: Sichtbarkeit
Sichtbarkeit legt fest, von wo aus auf Attribute und Methoden zugegriffen werden darf.
Definition: Geheimnisprinzip
Das Geheimnisprinzip schützt den inneren Zustand einer Klasse, damit Änderungen kontrolliert über definierte Schnittstellen erfolgen.
public class Ware {
  private String name;
  private double preis;

  public String getName() { return name; }
  public void setPreis(double neuerPreis) {
    if (neuerPreis >= 0) preis = neuerPreis;
  }
}

So bleiben interne Daten geschützt; Zugriff erfolgt über klar definierte get-/set-Methoden statt über direkte Außenmanipulation.

Vererbung
Redundanz und Vererbung
Gemeinsamkeiten zentralisieren, Unterschiede erhalten

1) Redundanzproblem

Änderungen an gemeinsamen Daten und Methoden müssten sonst in vielen Klassen parallel gepflegt werden. Das erhöht Fehleranfälligkeit und Wartungsaufwand.

2) Codebeispiel

public class Ware {
  protected String name;
  protected double preis;

  public double getPreis() { return preis; }
}

public class Kuehlware extends Ware {
  protected LocalDate mhd;

  public boolean istHaltbar() {
    return !mhd.isBefore(LocalDate.now());
  }
}
3) Definition: Vererbung
Vererbung überträgt gemeinsame Attribute und Methoden von allgemeineren Klassen auf spezialisierte Klassen.
4) UML-Konvention Vererbung: Geschlossener Dreieckspfeil, der immer zur Oberklasse zeigt.
Ware (Oberklasse)# name : String+ getPreis() : double Kuehlware Brotware Lesart: „ist eine“ → Pfeilspitze zeigt auf die Oberklasse

5) Kurze Erklärung: Die Unterklasse bekommt die gemeinsame Grundstruktur der Oberklasse und ergänzt nur ihre Besonderheiten.

6) Definition: Oberklasse
Eine Oberklasse bündelt gemeinsame Strukturanteile, die mehreren Unterklassen zur Verfügung stehen.
7) Definition: Unterklasse
Eine Unterklasse übernimmt Eigenschaften der Oberklasse und ergänzt oder präzisiert sie fachlich.
Hierarchie
Hierarchie, Verhalten und Objektmengen
Zusammenhängende Ausbauphase: Struktur → Verhalten → Nutzung

A) Mehrstufige Hierarchie

Wir präzisieren die Hierarchie: Ware als Oberbegriff, darunter Kuehlware und Brotware, erst danach konkrete Klassen wie Milch, Kaese, Wurst und Brot.

UML-Konvention in Hierarchien: Jede Spezialisierungsstufe zeigt mit geschlossenem Dreieckspfeil auf ihre allgemeinere Klasse.
Ware# name : String# preis : double+ getPreis() : double Kuehlware# mhd : Date+ istHaltbar() : boolean Brotware- getreideart : String+ istFrisch() : boolean Milch Kaese Wurst Brot
Definition: Generalisierung
Generalisierung fasst gemeinsame Merkmale mehrerer Klassen in einer übergeordneten Klasse zusammen.
Definition: Spezialisierung
Spezialisierung ergänzt eine allgemeinere Klasse um zusätzliche Merkmale für einen engeren fachlichen Fall.

B) Verhalten in Hierarchien

public class Brot extends Brotware {
  @Override
  public double berechneEndpreis() {
    return istFrisch() ? preis : preis * 0.7;
  }
}

public class Kaese extends Kuehlware {
  @Override
  public double berechneEndpreis() {
    return istHaltbar() ? preis : preis * 0.5;
  }
}

Methodenvererbung: Grundmethoden kommen aus Ware und stehen allen Unterklassen zur Verfügung.

Definition: Überschreiben
Überschreiben bedeutet, dass eine Unterklasse eine geerbte Methode mit einer eigenen fachlich passenden Implementierung ersetzt.

Fachlicher Unterschied: Vererbung sichert gemeinsame Basislogik, Überschreiben liefert je Unterklasse das passende Spezialverhalten.

C) Felder und Listen von Objekten

Ware[] tagesangebot = { new Brot(), new Milch(), new Kaese() }; // feste Länge
List<Ware> warenkorb = new ArrayList<>();                     // dynamische Länge
warenkorb.add(new Brot());
warenkorb.add(new Kaese());
Definition: Feld von Objekten
Ein Feld von Objekten speichert gleichartige Objektreferenzen in einer festen, bei der Erzeugung definierten Länge.
Definition: Liste von Objekten
Eine Liste von Objekten verwaltet Objektreferenzen in veränderbarer Länge und eignet sich für dynamische Bestände.

Objektmengen nutzen damit direkt die aufgebaute Hierarchie: Ein gemeinsamer Obertyp Ware trägt verschiedene konkrete Warenobjekte in einem Modell.

Polymorphie
Polymorphie als anspruchsvollerer Spezialfall
Gleicher Obertyp, unterschiedliches Laufzeitverhalten
Definition: Polymorphie
Polymorphie erlaubt es, unterschiedliche Unterklassen über einen gemeinsamen Obertyp einheitlich zu verwenden.
List<Ware> warenkorb = List.of(new Brot(), new Kaese(), new Milch());
for (Ware ware : warenkorb) {
  System.out.println(ware.berechneEndpreis());
}
UML-Konvention / Lesart: Ein Obertyp mit mehreren Unterklassen; Aufrufe über Ware werden in der passenden Unterklasse ausgeführt.
Ware+ berechneEndpreis() : double Brot Milch Kaese

Didaktischer Gewinn: Der Code bleibt bei der Verarbeitung von Objektmengen allgemein (Ware), das Laufzeitverhalten bleibt trotzdem konkret je Unterklasse fachlich korrekt.

Abstrakte Klasse
Abstrakte Klasse als Verfeinerung
Oberklasse fachlich präzisieren, direkte Instanzierung vermeiden
Definition: abstrakte Klasse
Eine abstrakte Klasse liefert gemeinsame Struktur und kann abstrakte Methoden vorgeben, ohne selbst direkt instanziiert zu werden.
public abstract class Ware {
  protected String name;
  protected double preis;

  public abstract double berechneEndpreis();
}

UML-Konvention: Abstrakte Klasse in kursiver Schrift oder mit <<abstract>>; abstrakte Methoden ebenfalls kursiv.

Abgrenzung zur allgemeinen Vererbung: Vererbung allein beschreibt nur die Strukturweitergabe. Die abstrakte Klasse legt zusätzlich verbindlich fest, dass bestimmte Methoden erst in Unterklassen konkret implementiert werden müssen.

Interface
Interface als spätere Spezialform
Gemeinsame Fähigkeit statt gemeinsame Herkunft
Definition: Interface
Ein Interface beschreibt eine Menge von Methoden als gemeinsame Fähigkeit, unabhängig von der Vererbungshierarchie.
public interface QrInfo {
  String qrText();
  String detailTitel();
}

public class Brot extends Brotware implements QrInfo {
  @Override
  public String qrText() { return name + " | " + berechneEndpreis(); }
}

UML-Konvention: Kennzeichnung mit <<interface>>, Umsetzung über gestrichelte Linie mit Pfeil zur Schnittstelle.

Fachlicher Unterschied zur Vererbung: Vererbung modelliert gemeinsame Herkunft („ist-eine“-Beziehung), ein Interface modelliert gemeinsame Fähigkeit („kann-etwas“-Beziehung) über verschiedene Klassen hinweg.

Rückblick
Zusammenführung und Systemrückblick
Vom Objekt zur erweiterten Modellstruktur

Der Lernweg folgt nun der gestuften Progression: Grundlagen (Objekt/Klasse) → erste Strukturbeziehungen (Assoziation/Aggregation) → Vererbung und Hierarchie → Verhalten und Objektmengen → Spezialfälle (Polymorphie, abstrakte Klasse, Interface).

Diagramm: Vollständiges UML-Endmodell Q1.1.
<<abstract>> Ware# name : String# preis : double+ berechneEndpreis() : double+ getName() : String <<interface>> QrInfo+ qrText() : String+ detailTitel() : String Milch- fettstufe : String+ qrText() : String Kaese- reifezeit : int+ qrText() : String Brot- frischBis : Date+ qrText() : String implements
Glossar
Glossar-Anbindung für Q1.1
Begriffe konsistent verlinken und Ergänzungen vorbereiten

Bereits angebundene Glossarbegriffe

Diese Seite nutzt verlinkte Begriffe aus dem Glossar konsistent im Modellverlauf: Objekt, Klasse, Attribut, Methode, Geheimnisprinzip, Sichtbarkeit, UML-Klassendiagramm, Vererbung, Generalisierung, Assoziation und Aggregation.

Für Glossar-Erweiterung vorgemerkt

Die folgenden Kapitelbegriffe sind in Q1.1 bereits fachlich vorbereitet und sollten im Glossar ergänzt oder geschärft werden: Instanz, Konstruktor, Oberklasse, Unterklasse, Spezialisierung, Überschreiben, Polymorphie, Interface/Schnittstelle, Feld von Objekten, Liste von Objekten, Typ, Hierarchie und Zuständigkeit.

Hinweis zur Progression: Die Begriffspaare Feld/Liste von Objekten sowie Assoziation/Aggregation werden jetzt im fachlichen Hauptverlauf eingeführt und nicht erst als Nachtrag.