Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:modellierung:warum:start [25.10.2021 14:21] – [Klar abgegrenzte Zuständigkeiten] sbel | faecher:informatik:oberstufe:modellierung:warum:start [26.10.2021 08:56] (aktuell) – [Wann ist ein Klassenentwurf "gut"?] sbel | ||
---|---|---|---|
Zeile 10: | Zeile 10: | ||
Wenn man ein Problem sinnvoll modularisiert und modelliert, hat das viele Vorteile: | Wenn man ein Problem sinnvoll modularisiert und modelliert, hat das viele Vorteile: | ||
- | * **Lesbarkeit des Quellcodes** -> Etwas stimmt mit dem Tor nicht? Also muss man in der " | + | * **Lesbarkeit des Quellcodes** -> Etwas stimmt mit dem Tor nicht? Also muss man in der " |
* Wenn man **Klassen** geschickt modelliert, kann man Sie in anderen Programmen **wiederverwenden** - nicht umsonst spricht man von " | * Wenn man **Klassen** geschickt modelliert, kann man Sie in anderen Programmen **wiederverwenden** - nicht umsonst spricht man von " | ||
* **Neue Objekte** können durch **neue Klassen** ein ein Modell eingefügt werden - du willst Hindernisse auf dem Spielfeld? Kein Problem mit der zusätzlichen " | * **Neue Objekte** können durch **neue Klassen** ein ein Modell eingefügt werden - du willst Hindernisse auf dem Spielfeld? Kein Problem mit der zusätzlichen " | ||
Zeile 16: | Zeile 16: | ||
===== Wann ist ein Klassenentwurf " | ===== Wann ist ein Klassenentwurf " | ||
- | Ein Klassenentwurf ist also " | + | Ein Klassenentwurf ist also " |
- | * **Kohäsion**: Die Kohäsion | + | ==== Kohäsion ==== |
- | * **Kopplung**: Die Eigenchaft | + | |
+ | Die **Kohäsion** einer Klasse definiert ihren logischen Zusammenhalt als Einheit. | ||
+ | |||
+ | ==== Kopplung | ||
+ | |||
+ | Die Eigenschaft | ||
+ | |||
+ | Abhängigkeiten bezieht sich damit sowohl auf die Zahl der Assoziationen (Kontrollkopplung) als auch auf die Komplexität der Bindung (Datenkopplung)((Und noch auf ein paar Aspekte mehr...)). | ||
+ | |||
+ | Schnittstellen zwischen Klassen sollten | ||
===== Grundregeln für gute Klassenentwürfe ===== | ===== Grundregeln für gute Klassenentwürfe ===== | ||
- | {{ : | + | {{ : |
+ | |||
==== Kapselung und Geheimnisprinzip ==== | ==== Kapselung und Geheimnisprinzip ==== | ||
- | Klassenvariablen niemals öffentlich (public) deklarieren. Zugriff auf Attribute von anderen nur über sondierende und verändernde Methoden (get- und set-Methoden) möglich. Änderungen am internen Aufbau der Klasse haben keine Auswirkungen auf andere Klassen, welche mit dieser assoziiert sind. | + | **Klassenvariablen niemals öffentlich** (public) deklarieren. Zugriff auf Attribute von anderen nur über **sondierende** und **verändernde** Methoden (get- und set-Methoden) möglich. Änderungen am internen Aufbau der Klasse haben keine Auswirkungen auf andere Klassen, welche mit dieser assoziiert sind. |
+ | |||
+ | Die Verwaltung der Position der Münzen in unserem Beispiel ist in Verantwortung der Muenzen-Klasse. Sollte die Verwaltung intern später auf ein Array mit zwei Feldern für x- und y-Koordinate umgestellt werden, so müssten bei direktem Zugriff von außen alle zugreifenden Klassen mitverändert werden - wenn der Zugriff über Getter- und Setter-Methoden gekapselt ist, müssen die assoziierten Klassen nichts über den internen Aufbau der '' | ||
+ | ==== Klar abgegrenzte Klassen-Zuständigkeiten ==== | ||
+ | |||
+ | **Entlang Zuständigkeiten** zu **modellieren** bedeutet, dass eine **Klasse** einen logisch sinnvollen und klar abgegrenzten Aufgabenbereich besitzt. Im Münz-Schnipsspiel nimmt das Tor zwar Münzen auf, verwaltet aber nicht deren Koordinaten, | ||
+ | |||
+ | ==== Semantische, | ||
+ | |||
+ | Dasselbe, was für die Aufteilung des Problems in Klassen gilt, gilt innerhalb der Klassen für die Methoden: Jede Methode sollte eine klare Aufgabe haben - und einen Namen, der diese Aufgabe auch verdeutlicht. | ||
- | Die Verwaltung der Position der Münzen in unserem Beispiel ist in Verantwortung der Muenzen-Klasse. Sollte die Verwaltung intern später auf ein Array mit zwei Feldern für x- und y-Koordinate umgestellt werden, so müssten bei direktem Zugriff von außen alle zugreifenden Klassen mitverändert werden - wenn der Zugriff über Getter- und Setter-Methoden | + | Die Klasse |
- | Anhand von Zuständigkeiten modellieren heißt, dass eine Klasse einen logisch | + | |
- | ==== Klar abgegrenzte Zuständigkeiten | + | ==== Keine Redundanz (DRY-Prinzip) |
- | Entlang Zuständigkeiten zu modellieren bedeutet, dass eine Klasse einen logisch sinnvollen und klar abgegrenzten Aufgabenbereich besitzt. Im Münz-Schnipssspiel nimmt das Tor zwar Münzen auf, verwaltet aber nicht deren Koordinaten, | + | Man sollte es tunlichst vermeiden, identischen, |
- | ==== Semantische, klare Aufgabenverteilung in Methoden ==== | + | In unserem Beispiel gibt es eine Methode '' |
- | Dasselbe, was für die Aufteilung des Probnlems in Klassen gilt, gilt innerhalb der Klassen für die Methoden: Jede Methode sollte eine klare Aufgabe haben - und einen Namen, der die Aufgabe auch verdeutlicht. | ||
- | Die Klasse Spieler hat zwei Methoden - " |