Informatik II Eine kurze Schlussvorlesung Wiederholung, Wertung • Nutzen der Objektorientierung und C++ • Abriss der wesentlichen C++-Features • Wann C++ und wann nur C? Ausblick • C und C++ -ähnliche Sprachen: JAVA, C# Peter Sobe 1 Nutzen Objektorientierung, C++ (1) Probleme bei prozeduraler, imperativer Programmierung: Objektorientierung / C++ Zwang zur Modularisierung Software wird schnell groß (Anzahl Quellcodezeilen und Umfang der Funktionen) Möglicherweise ähnlicher oder gleicher Code an verschiedenen Stellen Datenspeicherung und Steuerfluss sind unterschiedliche Aspekte Änderungen sind oft aufwendig und fehleranfällig Fehlersuche schwierig R. Grossmann / P. Sobe Zwang zu definierten Schnittstellen Gemeinsamer Code in Basisklassen und Templates Daten und Verarbeitungsfunktionen in den Klassen gekapselt, begrenzte Auswirkung einer Methode Besserer Überblick durch Struktur (Klassen, Objekte, Methodenaufrufe) 2 Nutzen Objektorientierung, C++ (2) Erweiterung der Sprache um eigene Ausdrucksmittel. C: Strukturen, benutzerdefinierte Typen und neue Funktionen person_t schulze, meier; InitPerson(“Robert“,“Schulze“,1956,“Kaninchenzucht“,&schulze); InitPerson(“Klaus“,“Meier“,1976,“Schachspiel“, &meier); … Verein_temp = EntlasseMitglied(Verein_alt, schulze); Verein_neu = AufnahmeMitglied(Verein_temp, meier); C++ mit Operatoren: Klassen mit speziellen Operatoren Person schulze(“Robert“,“Schulze“,1956,“Kaninchenzucht“); meier(“Klaus“,“Meier“,1976,“Schachspiel“); … Verein = (Verein-Schulze)+Meier; … ;Verein.Aufloesung(); Programme werden kürzer und besser lesbar … vorausgesetzt man gestaltet die Klassen und Objekte intuitiv. R. Grossmann / P. Sobe 3 Nutzen Objektorientierung, C++ (3) Polymorphie: Gleiche Methodenaufrufe bewirken bei Objekten spezifische (verschiedene) Funktionen Beispiel (aus letzter Vorlesung): figuren[0] = new punkt(100.0, 100.0); figuren[1] = new punkt(200.0, 200.0); figuren[2] = new punkt(300.0, 300.0); figuren[3] = new kreis(punkt(400.0,400.0),10.0); figuren[4] = new rechteck(450.0,250.0,80.0,150.0); figuren[5] = new kreis(punkt(400.0, 120.0), 80.0); figuren[6] = new dreieck(200.0, 100.0, 300.0, 100.0, 250.0 , 180.0 ); anz_figuren=7; … Die Klassen punkt, kreis, rechteck und dreieck sind von gleicher Basisklasse (geofigur) abgeleitet und besitzen einige Methoden als gemeinsame Schnittstelle (z.B. zeichne()) R. Grossmann / P. Sobe 4 Nutzen Objektorientierung, C++ (4) Polymorphie (Fortsetzung): for(int i=0; i<anz_figuren; i++) figuren[i]->zeichne(hdc); // figuren[i] ist ein geofigur* Die Methode zeichne() wurde von punkt, rechteck, etc. spezifisch implementiert. Durch den automatischen Aufruf der objektspezifischen Methoden, wird das C++ Programm von Verwaltungsaufwand befreit. Man baucht sich nicht mehr zu merken, welche Klasse durch ein Objekt instanziiert wird. Gleicher Code, zur Handhabung verschiedenartiger Objekte (z.B. Grafische Objekte, Simulationsobjekte, Datenobjekte) → kürzer, eleganter und weniger fehleranfällig bei Änderungen R. Grossmann / P. Sobe 5 Wesentliche C++ Features (1) Variablen- und Objekt-Referenzen Klassen – Datenkapselung zusammen mit Funktionen (Methoden) Zugriffsspezifizierer: public, private, protected Konstruktoren und Destruktor mit automatischem Aufruf bei Erzeugung und Vernichtung eines Objekts Elementobjekte und Elementobjekt-Konstruktoren (Syntax und Automatismus des Aufrufs) … R. Grossmann / P. Sobe 6 Wesentliche C++ Features (2) Vererbung – Basisklassen und spezialisierte abgeleitete Klassen, C++ auch mit Mehrfachvererbung Basisklassenkonstruktoren Automatischer Aufruf des Basisklassendestruktors Polymorphie Template-Funktionen und Template-Klassen R. Grossmann / P. Sobe 7 Objektorientierung Spezieller Entwurfszyklus: (1) Zuerst Objektmodell (2) Definition der Schnittstellen (3) Entwurf der Prozesse und Anwendungsfälle (4) Verfeinerung, zyklische Revision durch Zurückgehen auf (1), (2) oder (3) R. Grossmann / P. Sobe 8 Wann C++ und wann nur C? (1) C++ ist eine gute Wahl, wenn das Programm eine Nachbildung oder Verwaltung von Entitäten (Dinge mit Eigenschaften und einem Verhalten) vornehmen muss. Entitäten sind z.B.: elektr. Bauelemente, Waren und Lager, Mitarbeiter, u.v.a.m. wenn der erstellte Code wiederverwendbar sein soll. zur Speicherung und Handhabung von Daten mit z.T. unterschiedlicher Struktur: objektorientierte Datenbanken zum Aufbau von Simulationssoftware: Simulationsobjekte mit unterschiedlichem Verhalten. R. Grossmann / P. Sobe 9 Wann C++ und wann nur C? (2) Auf Objektorientierung kann man verzichten: bei kleinen Programmen, die nur eine geringe Diversität/ Strukturierung der gehandhabten Daten aufweisen, z.B. digitale Filter in der Signalverarbeitung Wenn fest programmierte Sequenzen durchlaufen werden müssen und diese im C-Quelltext sichtbar sein sollen. Dennoch ist eine Mischung mit objektorientiert erstellten Komponenten immer möglich. R. Grossmann / P. Sobe 10 C++ - ähnliche Sprachen (1) Java: ca. 1995 von SUN (jetzt von Oracle übernommen) initiiert Java basiert syntaktisch stark auf C++, insbes. bei Datentypen, Operatoren und Klammersetzung. Es wurden aber nicht alle Spracheigenschaften übernommen: keine Zeiger, stattdessen Referenzen keine Mehrfachvererbung keine Header-Dateien, kein Präprozessor (#ifdef u.ä.) Neu ist eine s.g. Garbage Collection: Dynamisch Allokierter Speicher (per new) wird immer dann zur Freigabe vorgemerkt, wenn die letzte auf ihn verweisende Referenz verschwindet (z.B. Überschreiben einer Referenz). Die Speicherfreigabe erfolgt im Hintergrund ohne Zutun des Programmierers. R. Grossmann / P. Sobe 11 C++ - ähnliche Sprachen (2) Java-Beispiel: public class Fakultaet { static int fak(int n) { int i, f=1; for (i=2;i<=n;i=i+1) f= f * i; } static void ausgabe(int n) { string s; s = “Fakultaet(“ + n + “)=“ +fak(n); System.out.println(s); } public static void main(String[] args ) { ausgabe(12); } } R. Grossmann / P. Sobe 12 C++ - ähnliche Sprachen (3) Java: Java läuft auf einer s.g. Java Virtual Machine Unterschied zu C++: Java wird nicht direkt in Maschinencode übersetzt, sondern in einen Zwischencode, der zur Laufzeit interpretiert wird. Optimierung und „Binden“ erfolgt erst zur Laufzeit. Komponenten können zur Laufzeit ausgetauscht werden Verteiltes Programmieren mittels RMI (Remote Method Invocation) R. Grossmann / P. Sobe 13 C++ - ähnliche Sprachen (4) C# (C-sharp) Von Microsoft entwickelt (strategisch als Java-Pendant) und auf .NET-Plattform ausgerichtet. CLR Common Language Runtime – eine komponentenorientierte Umgebung zur Ausführung von Software Ähnlich wie Java werden Programme in einen Zwischencode (CIL) übersetzt und erst zur Laufzeit interpretiert. CLR mit Garbage Collector, der auch von C++ Programmen (Managed C++) genutzt werden kann R. Grossmann / P. Sobe 14 C++ - ähnliche Sprachen (5) C# Beispiel angelehnt an: openbook.galileocomputing.de/csharp using System; class Punkt { public Punkt(int x, int y) { this.x = x; this.y = y; } public void LeseKoordinaten(out int x, out int y) { x = this.x; y = this.y; } int x; int y; } class Test { public static void Main() { Punkt meinpunkt = new Punkt(10, 15); int x; int y; meinpunkt.LeseKoordinaten(out x, out y); Console.WriteLine(“meinpunkt({0}, {1})", x, y); } } R. Grossmann / P. Sobe 15