1. Kapselung a. zusammenfügen von Daten und Routinen zu einer Einheit 2. Data hiding a. ist das verstecken von Daten und Implementierungen 3. Datenabstraktion a. Datenabstraktion = data hiding + Kapselung) 4. Objektkoppulung a. Abhängigkeit der Objekte voneinander b. soll schwach sein, also gute Kapselung (wenig sichtbare Mathoden und Variablen, wenig Nachrichten im laufenden System, wenig Parameter in Methoden 5. Ersetzbarkeitsprinzip a. U ist Untertyp von T, wenn eine Instanz von U überall verwendbar ist, wo eine Instanz von T erwartet wird 6. Refaktorisierung a. Änderung der Struktur (oft im Anfangsstation sehr billig/nicht aufwendig, später eher teuer/aufwändig) 7. Kovarianz, Kontravarianz, Invarianz a. Sind Bedingungen für Untertypbeziehungen, welche der Compiler überprüfen kann. b. Kovarianz: Typ eines Elements im Untertyp ist Untertyp des Elementtyps im Obertyp (Konstantentypen, Ergebnistypen, Ausgangsparametertypen), also (in Java) die Methoden der Unterklasse mindestens die Parameter akzeptieren müssen, die die Oberklasse auch akzeptieren würde c. Kontravarianz: Typ eines Elements im Untertyp ist Obertyp des Elementtyps im Obertyp (Eingangsparametertypen), also (in Java) zb. die Methoden der Unterklasse dürfen aber nicht Werte zurückliefern (Rückgabeparameter), die man mit der Oberklasse nicht vereinbart hatte. d. Zum überschreiben von Methoden wird Kontravarianz benötigt (überschreiben: alte Methode wird ersetzt, überladen: alte Methode existiert paralell) e. Invarianz: Typ eines Elements im Untertyp ist gleich dem Elementtyp im Obertyp (Variablentypen, Durchgangsparametertypen), also wenn Kovarianz und Kontravarianz benötigt wird (lesen und schreiben) 8. Interface a. Alle Methoden sind abstrakt, enthalten also keine Implementierungen. b. Variablen dürfen nicht deklariert werden, wohl aber Konstanten, also mit static final gekennzeichnete Variablen, die mit einem unveränderlichen Wert initialisiert sind. c. Alle Methoden sind public Instanzmethoden. Die Schlüsselwörter static, final, protected und private dürfen in Methodendeklarationen nicht vorkommen. d. Interfaces können von mehreren anderen Interfaces erben (Mehrfachvererbung), e. aber nicht von Klassen. f. Auch Klassen können von mehreren Interfaces erben 9. Statische Typsicherheit a. ist dann gewährleistet, wenn die Argumenttypen kontravariant und die Ergebnistypen kovariant sind. 10. Zusicherungen (pre- postconditions, invarianten) a. Precondition (Vorbedingung): vor Methodenaufruf, Client verantwortlich b. Postcondition (Nachbedingung): vor Rückkehr aus Methodenaufruf, Server verantwortlich c. Invariante: vor und nach Ausführung der Methoden, Server verantwortlich (unveränderte Eigenschaften von Objekten), Ausnahme: schreiben externer Variablen 11. Arten von Klassen-Beziehungen a. Untertypenbeziehungen (Subtyping): Vererbung von Code aus Oberklasse ist irrelevant (zb. mittels Interfaces) b. Vererbungsbeziehung: Klasse entsteht durch Abänderung anderer Klassen (Ersetzbarkeit irrelevant) (zb. mittels extends, aber dadurch auch Untertypenbeziehung) c. Reale-Welt-Beziehungen: intuitiv klar, ohne Details zu kennen. Oft in Untertypenbeziehungen weiterentwickelbar, ABER geht oft nicht 12. Generizität a. für gleich strukturierte Klassen und Methoden b. Abfangen erwarteter Änderungen c. manchmal verwendbar, wo Untertypenbeziehungen versagen (Ersetzbarkeit bei Generizität nicht benötigt) 13. Gebundene Generizität a. einfache Form zwar elegant und sicher ist, aber für einige Verwendungszwecke nicht ausrechend (Im Rumpf einer einfachen generischen Methode ist über den Typ, der den Typenparameter ersetzt, nichts bekannt (A kann ja alles sein)). Wenn man bestimmte Methoden aufrufen möchte, braucht man eine Einschränkung (A ist mindestens eine Person). also, A extends Person = Gebundene Generizität 14. F-Gebunde Generizität a. Rekursive Verwendung von Generizität b. unterstützt keine impliziten Untertypbeziehungen. Zum Beispiel besteht zwischen List<X> und List<Y> keine Untertypbeziehung wenn X und Y verschieden sind, auch dann nicht, wenn Y von X abgeleitet ist (oder umgekehrt). c. Will man Untertypenbeziehung, verwendet man Wildcards ( ? extends Person) 15. Unterschied zwischen Homogene und Heterogene Übersetzung a. Homogen generische Klasse in eine nichtgenerische Klasse übersetzt, Typparameter durch Schranke oder Object ersetzt, Typumwandlungen für Rückgabewerte (immer erfolgreich) (in Java) b. Heterogene Übersetzung erzeugt für jede generische Klasse oder Routine mit anderen Typparametern eigenen übersetzten Code. Daher muss man bei heterogener Übersetzung keine Schranke angeben, es wird einfach für jede übersetzte Klasse geprüft, ob die Typen die Vorraussetzungen haben („copy paste“) . bessere Laufzeit und auch für einfache Typen wie int und boolean möglich.(für Templets in C++), aber viele Klassen und schwer simulierbar 16. Decorator pattern 17. Visitor Pattern a. Simuliert im wesentlichen Multimethoden 18. Virtual Proxy a. erzeugen Objekte bei Bedarf. Da die Erzeugung eines Objekts aufwändig sein kann, wird sie so lange verzögert, bis es wirklich einen Bedarf dafür gibt. 19. Remote Proxies a. sind Platzhalter für Objekte, die in anderen Namensräumen (zum Beispiel auf Festplatten oder auf anderen Rechnern) existieren. Nachrichten an die Objekte werden von den Proxies über komplexere Kommunikationskanäle weitergeleitet. 20. Multimethode (dynamisches Binden) a. entsprechen syntaktisch überladenen Methoden, aber Bindung erfolgt an Hand dynamischer Typen b. dadurch oft einfachere Programme möglich c. Existiert nicht in Java, ist aber leicht zu simulieren d. Durch Visitor Pattern simulierbar 21. Überladen a. Beim Überladen bezeichnet ein und derselbe Name verschiedene Routinen, die sich durch die deklarierten Typen ihrer formalen Parameter unterscheiden. Die deklarierten Typen der übergebenen Argumente entscheiden, welche Routine ausgeführt wird. (Beispiel „/“ bei int und float, gleiches Prinzip, aber ganz andere Herangehensweise (Code) 22. Überladen VS Multimethode 23. Proxy Pattern 24. Factory Pattern 25. Iterator 26. Decorator 27.