JAVA & Objektorientiertes Programmieren 2
Erweiterung der ersten Kartei
Erweiterung der ersten Kartei
Fichier Détails
Cartes-fiches | 203 |
---|---|
Langue | Deutsch |
Catégorie | Informatique |
Niveau | Université |
Crée / Actualisé | 19.01.2017 / 09.01.2024 |
Lien de web |
https://card2brain.ch/box/20170119_java_objektorientiertes_programmieren_2
|
Intégrer |
<iframe src="https://card2brain.ch/box/20170119_java_objektorientiertes_programmieren_2/embed" width="780" height="150" scrolling="no" frameborder="0"></iframe>
|
Weshalb sollte man so weit möglich und sinnvoll immer bereits bestehende Eventklassen und Listener-Interfaces verwenden?
- weniger Programmieraufwand, bekannte Semantik
- eigene Event-Klassen immer von EventObject ableiten
Behandlung von Events am Besten an (private) ______ delegieren, Code wird dadurch übersichtlicher.
Methoden
Was sind Unschönheiten beim Event-Handling? Was gibt es für Lösungen?
- Beim Event-Handling kann es viele verschiedene Quellen für gleichartige Events geben: Registriert sich ein Objekt bei mehreren Quellen für die gleichen Events, treffen diese somit alle in der selben Funktion ein!
- Das Event-Objekt enthält als Information auch die Quelle (source) was die Differenzierung ermöglicht. (Auswertung über ein if-Konstrukt nötig, SRP nicht eingehalten, unübersichtlich und fehleranfällig!)
- Schöner wäre es, wenn man bei jeder Quelle ein eigenständiges Objekt registrieren könnte. (Dafür müsste man aber für jede Quelle wiederum eine eigenständige Listener-Klasse implementieren! -> geringe Kohäsion, gehört ja eigetnlich in die Listener-Klasse)
Wir können in Java Klassen innerhalb von Klassen definieren. Geht auch: Interfaces in Interfaces?
Ja, auch möglich
Was ist eine sinnvolle Anwendung von inneren Klassen?
Damit kann man "private" (Hilfs-)Klassen definieren, welche nur innerhalb einer Klasse sichtbar sind (public und static geht auch, aber komplizierter)
Was für Beispiele gibt es für Innere Klassen aus den Datenstrukturen?
- Das Interface Map definiert ein internes Interface Map.Entry
- Die Klasse HashMap definiert eine interne Klasse Node (welche Map.Entry implementiert)
Wir können die Technik der inneren Klassen u.a. bei Event-Listeners gut einsetzen. Weshalb kann das sinnvoll sein?
Um weniger Code schreiben zu müssen und eine höhere Kohäsion zu erreichen
Wenn wir wissen, dass wir eine innere Klasse genau nur einmal und nur an einer Stelle instanziieren, können wir diese auch wie definieren?
als anonyme innere Klasse
Was sind anonyme innere Klassen?
- Haben keinen Namen
- Werden an Ort und Stelle der Verwendung definiert!
Achtung: Die Syntax ist zwar logisch, aber dennoch etwas gewöhnungsbedürftig!
Zwei sehr fundamentale Kriterien für guten Design sind:
(möglichst) starke Kohäsion und _______ ?
möglichst lose Kopplung
Was bedeutet Kohäsion?
Eine Programmeinheit (Methode, Klasse, Modul etc.) ist für genau eine wohldefinierte Aufgabe verantwortlich (Single Responsibility Prinzip)
Gutes Beispiel! Starke Kohäsion, SRP eingehalten!
Klasse wurde in vier einzelne Klassen aufgebrochen.
Nebeneffekt: Namensgebung wurde spezifischer und besser!
Achtung: Jede weitere neue Methode die ergänzt wird, kann ein erneutes Aufbrechen sinnvoll bzw. notwendig machen!
-> Refactoring ist eigentlich ein ständiger Prozess
Was sind Vorteile von Klassen mit hoher Kohäsion?
Das Single Responsibility Principle (SRP) wird eingehalten.
Die Klassen sind dadurch:
- kleiner spezifischer
- schneller und leichter überschaubar / verständlich
- besser wiederverwendbar
- wesentlich einfacher testbar
Was ist Kopplung?
Kopplung beschreibt wie stark einzelne Programmeinheiten untereinander in Verbindung stehen
Weshalb ist Kopplung grundsätzlich notwendig?
Damit überhaupt eine Interaktion (Zusammenarbeit) zwischen Klassen erfolgen kann
Wie manifestiert sich Kopplung?
- Verwendung von Datentypen
- Aufruf von Methoden
- explizite Beziehungen zwischen Klassen
Was ist das Ziel bei Kopplung?
So starke Kopplung wie nötig, so lose Kopplung wie möglich!
Was sind Konsequenzen von zu hoher Kopplung?
Funktionsweise schwer durchschaubar und schwer verständlich
- grundsätzlich langsamere und aufwändigere Entwicklung
- schlechte Testbarkeit (spziell auch Unit-Testing)
- führt potentiell zu mehr Fehlern!
- die Fehlersuche ist noch dazu aufwändiger
Weiterentwicklung und Wartung wird dadurch erschwert
- Spätere Änderungen und/oder Erweiterungen sind schwierig
- Schlimmster Fall: Entwicklung wird abgebrochen
Was ist gutes OO-Design und welche Auswirkungen hat es?
Tendenziell mehr, und kleinere Klassen. Daraus resultiert:
- bessere und schnellere Verständlichkeit / Lesbarkeit
- einfachere und bessere Testbarkeit
- höhere Wiederverwendbarkeit (auch in anderem Kontext)
- höhere Prallelität in der Entwicklung möglich
Änderungen sind einfacher möglich
- weil lokaler, betreffen weniger andere Elemente
- Auswirkung von Fehlern schneller eingrenzbar
- somit tendenziell auch weniger Fehler!
Was sind die Eigenschaften des Beziehungstyp: use?
Schwächste Form einer Beziehung
- Eine Klasse nutzt einen anderen Typ (meist nur temporal oder in einer/wenigen Methoden
- Manifestion im Code: Lokale Variable, formale Parameter, Returntyp, statischer Aufruf
Visualisierung in UML (siehe Bild):
A hängt von B ab, weil B von A verwendet wird (Methode verwendet Math.PI zur Berechnung des Kreisumfanges)
Was sind die Eigenschaften des Beziehungstyp: Assoziation?
Häufigste Form einer Beziehung
- Eine Klasse hat eine explizite Beziehung zu einem anderen Typ (Beziehung ist essentiell für die Funktion / das Modell.
- Manifestation im Code: Häufig ein Attribut von einem anderen Typ
- Visualisierung in UML (siehe Bild):
A kennt (und nutzt) B. (Bidirektional möglich)
Ein Student A besucht ein Modul B
Was sind die Eigenschaften des Beziehungstyp: Aggregation?
Spezialisierung der Assoziation: Hierarchisch, "Ist Teil von".
- Eine Klasse hat eine explizite Beziehung zu einem anderen Typ (Dieser Typ ist ein logischer Teil (part of) der Klasse)
- Manifestation im Code: Wie Assoziation, sehr häufig ein Attribut vom anderen Typ.
- Visualisierung in UML (siehe Bild)
A hat (und nutzt) B. (auch mehrere möglich)
Ein Auto A hat einen Motor B
Was sind die Eigenschaften vom Beziehungstyp: Komposition?
Spezialisierung der Aggregation: Existenziell gekoppelt.
- Eine Klasse nutzt einen anderen Typ als Teil von sich selber (dieser Teil ist existenziell (lebensdauer) gekoppelt
- Manifestation im Code: Wie Aggregation, zusätzlich erstellt (new...) die Klasse den teil
- Visualisierung in UML (siehe Bild)
A erzeugt und hat B (auch mehrere möglich)
Ein Mensch A hat einen Kopft B
Was sind die zehn wichtigen Designprinzipien?
1. Single Responsibility Principle (SRP)
2. Don't repeat yourself (DRY)
3. Favor composition over inheritance (FCoI)
4. Design for inheritance, oder prohibit it
5. Achte auf hohe Kohäsion und lose Kopplung
6. Differenziere zwischen Datenkapselung und Information Hiding
7. Verwende Schnittstellen zu Entkopplung und Abstraktion
8. Teste mit Unit-Tests nach dem Test First Prinzip
9. Viele kleine Einheiten sind besser als wenige Grosse
10. Aussagestarke Namensgebung und formatierter Quellcode
Was sagt das Single Responsibility Principle aus?
Eine Klasse hat möglichst nur eine Zuständigkeit
Änderungen oder Erweiterungen sollten sich immer auf möglichst wenige Klassen beschränken (hohe Kohäsion bleibt erhalten)
Viele kleine Klassen sind besser als wenige grosse Klassen
Was ist ein wichtiges Vorteil beim Einhalten des SRP?
Stark verbesserte Testbarkeit!
Was bedeuted DRY?
Don't repeat yourself
Duplizierung von Code wenn immer möglich vermeiden.
- Einfache Duplizierung: Kopierte Codefragmente
- Subtile Duplizierung: Wiederholte, immer gleiche Bedingungskonstrukte, Identische Algorithmen, unterschiedlich implementiert
Was ist eine Lösung wenn man DRY vermeiden möchte? Was hat das Vermeiden für einen Vorteil?
Lösungen: Unterfunktionen, Objektorientierung, Design Patterns
Vermeidung von Duplizierung erhöht die Produktivität!
-> Wiederverwendung wird verbessert / erst möglich.