Basisinformationstechnologie I Wintersemester 2012/13 07. Januar 2013 – Programmiersprachen II Universität zu Köln. Historisch-Kulturwissenschaftliche Informationsverarbeitung Jan G. Wieners // [email protected] Themenüberblick „Programmiersprachen II“ Drei-Schichten Architektur / MVC Programmiersprachen – Konzepte Variablen Arrays Auswahlanweisungen Kontrollstrukturen Objektorientierte Programmierung Objekt Kapselung / Information Hiding / Geheimnisprinzip Identität vs. Gleichheit Notation von Klassen Vererbung ...zuvor bei „BIT“: Phasen der Programmentwicklung ...zuvor bei „BIT“: Phasen der Programmentwicklung Analyse: Spezifikation Entwurf: Algorithmus Implementation: Code (Programmiersprache) …Auf dem Weg zur Spezifikation: Use-Case • Nach Jacobson (u.a. 1987) • Spezifiziert eine Sequenz von Aktionen, einschließlich möglicher Varianten, die das System in Interaktion mit Akteuren ausführt • Beschreibt das extern wahrnehmbare Verhalten, ohne auf die interne Struktur oder Details der Realisierung einzugehen (Balzert, Heide: Lehrbuch der Objektmodellierung. Heidelberg, 2005.) Implementation Programmiersprachen Interpretiert vs. compiliert Typisierung: statisch, dynamisch, etc. Paradigmen: Funktional Imperativ Prozedural Objektorientiert Grundlegende Konzepte: Variablen, Arrays, Kontrollstrukturen, Funktionen, Objekte Das Rad nicht neu erfinden: Design Patterns / Entwurfsmuster, Strukturierungsmuster: MVC (u.a.) Modellierung Ans Eingemachte… Darstellung Logik Daten Schichten-Architektur Drei-Schichten-Architektur GUI-Schicht Fachkonzeptschicht Datenhaltungsschicht GUI-Schicht: Realisiert die Benutzungsoberfläche einer Anwendung – Präsentation der Daten, Interaktion mit Benutzer / Benutzerin Fachkonzeptschicht: Modelliert den funktionalen Kern der Anwendung; Zugriff auf Datenhaltungsschicht Datenhaltungsschicht: Form der Datenspeicherung, z.B. relationale DB MVC – Model View Controller (Modell, Präsentation, Steuerung) 1972 im Kontext von „Smalltalk“ (objektorientierte Programmiersprache) vorgestellt Model / Datenhaltungsschicht? Model! Spielfeld: 3 x 3 Felder Auf jedem Feld wird die ID des Spielers abgelegt, der / die das Feld angeklickt hat var gameBoard = [][]; Arrays und Variablen Variable: Benannte Speicherstelle Charakteristika: Variablenname Wert (Datentyp) (Adresse der Speicherzelle) JavaScript: // Deklaration var meineVariable; // Initialisierung meineVariable = 23; C++: // Deklaration int meineVariable; // Initialisierung meineVariable = 23; Datentypen (C++) Einfache Datentypen in C++: bool Wahrheitswerte int ganze Zahlen unsigned int Natürliche Zahlen float Fließkommazahlen double Fließkommazahlen, doppelte Genauigkeit char Zeichen Zusammengesetzte Datentypen (in C++): String Zeichenketten Array Sammlung von Daten eines Datentyps Doppelte Genauigkeit…?!? Kollisionserkennung / Problem: „Clipping“ Arrays Array Sammlung von Datenwerten Jeder Wert in einem Array wird über den Index adressiert; gezählt wird ab 0: meinArray[index] // Deklaration var lottoZahlen = []; // Initialisierung lottoZahlen[0] = 23; lottoZahlen[1] = 15; lottoZahlen[2] = 3; lottoZahlen[3] = 42; lottoZahlen[4] = 7; lottoZahlen[5] = 8; // Ausgabe document.write( lottoZahlen[0] + “, “ + lottoZahlen[1] ); Mehrdimensionale Arrays Zugriff auf Werte in zweidimensionalen Arrays: var cellContent = gameBoard[ yCoord ][ xCoord ] ??? 1. 2. 3. var cellContent = gameBoard[ 0 ] [ 1 ]; var cellContent = gameBoard[ 2 ] [ 2 ]; var cellContent = gameBoard[ 3 ] [ 1 ]; Spielfluss und Anwendungslogik Präsentation und Interaktion – die Spielschleife SOLANGE kein Spieler / keine Spielerin das Spiel gewonnen hat, VERFAHRE WIE FOLGEND: WENN ein leeres Spielfeld angeklickt wurde: lege die aktuelle SpielerID im zweidimensionalen Array „gameGrid“ ab und stelle das Spielersymbol dar IM ANDEREN FALLE: tue nichts Prüfe die Gewinnbedingung Gewinn- und Abbruchbedingung Ein Spieler / eine Spielerin hat das Spiel gewonnen, WENN: der Spieler drei seiner Symbole in (unmittelbarer) horizontaler Reihenfolge abgelegt hat ODER der Spieler drei Symbole in diagonaler Reihenfolge abgelegt hat Kontrollstrukturen Kontrollstrukturen Unterscheidung von Kontrollstrukturen in: Auswahlanweisungen if if else (switch) Wiederholungsanweisungen while for do while Sprunganweisungen return break continue Auswahlanweisungen: if if (ausdruck) { anweisung1 anweisung2 anweisung3 ... } ausdruck variable1 OPERATOR variable2 C++, JavaScript & Co.: (Vergleichs)Operatoren Operator <= Operation Größer als („ist Wert1 größer als Wert2?“) Kleiner als („ist Wert 1 kleiner als Wert2?“) Größer gleich („ist Wert1 kleiner oder gleich Wert2?“) Kleiner gleich („ist Wert1 kleiner oder gleich Wert2?“) == Auf Gleichheit prüfen variable1 == variable2 != variable1 != variable2 && Auf Ungleichheit prüfen Logisches UND: Zwei Bedingungen prüfen || Logisches ODER if( (a==b) || (b==c) ) > < >= Beispiel Wert1 > Wert2 Wert1 < Wert2 Wert1 >= Wert2 Wert1 <= Wert2 if( (a==b) && (b==c) ) Auswahlanweisungen: if Beispiel: Zu prüfen ist, ob der Wert von variableZwei größer ist als der Wert von variableEins. Wenn ja, soll eine entsprechende Nachricht ausgegeben werden: int variableEins = 5; int variableZwei = 8; if(variableZwei > variableEins) { cout << “Variable Zwei ist größer als Variable Eins.“; } Auswahlanweisungen: if else if (ausdruck) { anweisung } else if (ausdruck) { anweisung } else { anweisung } Auswahlanweisungen: switch Die switch-Anweisung realisiert eine Auswahl zwischen beliebig vielen Alternativen und ist insofern mit einer geschachtelten if else-Anweisung vergleichbar Mehrfach-Auswahl Gewinn- und Abbruchbedingung Ein Spieler / eine Spielerin hat das Spiel gewonnen, WENN (IF): der Spieler drei seiner Symbole in (unmittelbarer) horizontaler Reihenfolge abgelegt hat ODER (II) der Spieler drei Symbole in diagonaler Reihenfolge abgelegt hat Übung 1 Interaktion Prüfen I: Wurde ein leeres Spielfeld angeklickt? Gewinnbedingung Prüfen I: Hat ein Spieler / eine Spielerin drei ihrer Symbole in (unmittelbarer) horizontaler Reihenfolge abgelegt? Prüfen II: Finden sich drei Symbole eines Spielers in diagonaler Folge? Übung 1 – Lösung … Präsentation und Interaktion – die Spielschleife SOLANGE kein Spieler / keine Spielerin das Spiel gewonnen hat, VERFAHRE WIE FOLGEND: WENN ein leeres Spielfeld angeklickt wurde: lege die aktuelle SpielerID im zweidimensionalen Array „gameGrid“ ab und stelle das Spielersymbol dar IM ANDEREN FALLE: tue nichts Prüfe die Gewinnbedingung Wiederholungsanweisungen Wiederholungsanweisungen Wiederholungsanweisungen (i.e. while, for, do while) machen‘s möglich, bestimmte Verarbeitungsschritte unter bestimmten Umständen zu wiederholen Beispiele: while for do while Wiederholungsanweisungen: while while (ausdruck){ anweisung1 anweisung2 anweisung3 } „Führe anweisung1 und anweisung2 und anweisung3 so lange aus, wie die Bedingung „ausdruck“ WAHR (TRUE) ist.“ Wiederholungsanweisungen: do while do { anweisung1 anweisung2 anweisung3 anweisung4 ... } while (ausdruck) Wiederholungsanweisungen: for for(initialisierung; abbruchbedingung; inkrementierung) { anweisung1 anweisung2 anweisung3 anweisung4 ... } Übung 2 SOLANGE kein Spieler / keine Spielerin das Spiel gewonnen hat, VERFAHRE WIE FOLGEND: WENN ein leeres Spielfeld angeklickt wurde: lege die aktuelle SpielerID im zweidimensionalen Array „gameGrid“ ab und stelle das Spielersymbol dar IM ANDEREN FALLE: tue nichts Prüfe die Gewinnbedingung Themenüberblick „Programmiersprachen II“ Drei-Schichten Architektur / MVC Programmiersprachen – Konzepte Variablen Arrays Auswahlanweisungen Kontrollstrukturen Objektorientierte Programmierung Objekt Kapselung / Information Hiding / Geheimnisprinzip Identität vs. Gleichheit Notation von Klassen Vererbung Butter bei die Fische: Objektorientierte Softwareentwicklung Objekt Zentrales Konzept: Objekt Verfügt über einen bestimmten Zustand Reagiert mit einem definierten Verhalten auf Anforderungen / seine Umgebung Besitzt eine Identität, die es von anderen Objekten unterscheidet. Kann mit anderen Objekten verbunden sein: Objektbeziehungen Objektorientierte Programmierung Objektzustand umfasst die Attribute und jeweilige Verbindungen zu anderen Objekten Attribute: unveränderliche Merkmale des Objekts; die Attributwerte können Änderungen unterliegen Verhalten eines Objekts wird durch eine Menge von Operationen beschrieben; Änderung oder Abfrage des Zustandes ausschließlich durch Operationen Objekt = Daten + Methoden / Operationen Objektorientierte Programmierung „Änderung oder Abfrage des Zustandes ausschließlich durch Operationen“ ??? Kapselung, Information Hiding, Geheimnisprinzip Abb.: Balzert, Heide: Lehrbuch der Objektmodellierung. Heidelberg, 2005. Objektorientierte Programmierung var game = { name : '', setName : function( gameName ) { this.name = gameName; }, state : '', getGameState : function() { return this.state; }, setGameState : function( gameState ) { this.state = gameState; }, […] }; Objekt Identität Kann sich nicht ändern Keine zwei Objekte können dieselbe Identität besitzen Besitzen zwei Objekte dieselben Attributwerte, so sind sie gleich Beispiel nach Balzert: Michael und Susi haben beide ein Kind (Daniel) Gleichheit. Michael und Janine sind Eltern desselben Kindes (Daniel) Identität. Abb.: Balzert, Heide: Lehrbuch der Objektmodellierung. Heidelberg, 2005. Klassen Gleichartige Objekte (Objekte mit denselben Operationen und gleichen Attributen) gehören zur gleichen Klasse. Abstrakt vs. konkret: Jedes Objekt ist Exemplar bzw. Instanz einer Klasse Klasse: Definiert für eine Sammlung von Objekten deren Struktur (Attribute) Verhalten (Operationen) Beziehungen Verfügt über Mechanismen, um neue Objekte zu erzeugen (Object Factory) Klassen in C++ Kapselung / Information Hiding class EineKlasse { public: // öffentlicher Teil EineKlasse() // Konstruktor { klassenVariable=23; } ~EineKlasse(); // Destruktor int gebeVariablezurueck(void) { return klassenVariable; } private: int klassenVariable; }; // privater Teil // private Variable Notation von Klassen Abb.: Balzert, Heide: Lehrbuch der Objektmodellierung. Heidelberg, 2005. Vererbung Zentrales Konzept II: Vererbung Eine Klasse kann Elemente (Variablen, Konstanten, Funktionen) von anderen Klassen erben Beispiel C++: class Person { string name; //... }; class Mitarbeiter : Person { long sozialversicherungsNr; //... }; Vererbung Die Klasse Mitarbeiter erbt von der Klasse Person die entsprechenden Methoden, um auf die Klassenelemente zuzugreifen und bildet den Spezialfall „Mitarbeiter“ ab, indem sie die Variable sozialversicherungsNr verwendet: class Person { string name; //... }; class Mitarbeiter : Person { long sozialversicherungsNr; //... }; Martial Arts Objects Martial Arts Fighter attribute 1: name attribute 2: gender attribute 2: two legs attribute 3: two arms behaviour 1: printName() behaviour 2: walk() behaviour 3: wave_arms() Martial Arts Objects Martial Arts Fighter attribute 1: name attribute 2: gender attribute 2: two legs attribute 3: two arms behaviour 1: printName() behaviour 2: walk() behaviour 3: wave_arms() Vererbung Vererbung beschreibt eine Beziehung zwischen einer allgemeinen Klasse (Basisklasse) und einer spezialisierten Klasse. Die spezialisierte Klasse ist vollständig konsistent mit der Basisklasse, enthält aber zusätzliche Informationen (Attribute, Operationen). Die allgemeine Klasse wird auch als Oberklasse (engl. super class), die spezialisierte Klasse als Unterklasse (engl. sub class) bezeichnet. Das Konzept der Vererbung ist nicht nur dazu gedacht, um gemeinsame Eigenschaften und Verhaltensweisen zusammenzufassen, sondern sie muss immer auch eine Generalisierung bzw. Spezialisierung darstellen, d.h. jedes Objekt der Unterklasse "ist ein" Objekt der Oberklasse. / Hausaufgaben Aufgabe 1 Erläutern Sie den Begriff "information hiding" und das dahinter stehende Konzept. Aufgabe 2 Worin unterscheiden sich die while- und die do while-Schleife? Aufgabe 3 Differenzieren Sie die Begriffe "Klasse" und "Instanz" im Kontext der objektorientierten Programmierung. Aufgabe 4 Wofür steht die Abkürzung "MVC" (im besprochenen Kontext)? Beschreiben Sie kurz, was sich hinter dem Begriff verbirgt. Aufgabe 5 Lesen Sie die Seiten 283 bis 285 in Balzert, Heide: Lehrbuch der Objektmodellierung (http://de.scribd.com/doc/32365794/Balzert-Heide-Lehrbuch-Der-Objektmodellierung) und erläutern Sie die Begriffe "Klassenbibliothek" und "Framework". Aufgabe 6 Beschreiben Sie kurz den Aufbau und die Bestandteile der for-Schleife. Welche Ausgabe generiert die folgende for-Schleife?