Objektorientierte Modellierung und Programmierung

Größe: px
Ab Seite anzeigen:

Download "Objektorientierte Modellierung und Programmierung"

Transkript

1 Objektorientierte Modellierung und Programmierung Einführung im Informatikunterricht der 10. Klasse Gymnasium Untergriesbach 13. März 2015

2 Vorbemerkungen I Das vorliegende Unterrichtsmaterial entsteht im Rahmen des Informatikunterrichtes der 10. Jahrgangsstufe am Staatlichen Landschulheim Marquartstein 1 sowie am Gymnasium Untergriesbach. Ziel ist eine Einführung in die objektorientierte Programmierung unter Einbeziehung verschiedener Modellierungstechniken. Vorausgesetzt werden Grundkenntnisse der objektorientierten Modellierung und einfache Darstellungen in UML sowie Einblicke in die Ablaufmodellierung, wie sie am bayerischen Gymnasium im Rahmen des Faches Natur und Technik in der 6. und 7. Jahrgangsstufe vermittelt werden.

3 Vorbemerkungen II Die verwendete Programmiersprache ist Smalltalk unter Verwendung der Entwicklungsumgebung Squeak 3.9 bzw. Pharo 1.4, Python unter Verwendung der Entwicklungsumgebung Idle, Java unter Verwendung der Entwicklungsumgebung BlueJ und unter Einbeziehung der JGUIToolbox von Hans Witt. Die Teile Smalltalk, Java und Pharo sind als Alternativen zu sehen, die im Laufe verschiedener Durchgänge entstanden sind bzw. entstehen. In Java und Pharo wird dabei zum Vergleich dasselbe Modell implementiert. Als Modellierungswerkzeuge finden Dia und insbesondere für Python Umbrello Verwendung. 1 Hinter Text in dieser Farbe, allen Gliederungen (auch am rechten Rand) und den Symbolen am unteren Seitenrand verbergen sich in der Regel anklickbare Hyperlinks.

4 Gliederung Grundkonzepte Ablaufmodelliierung Smalltalk I die Entwicklungsumgebung Squeak Smalltalk II Grundzüge der Programmiersprache Pharo I Smalltalk-Entwicklung mit Pharo Pharo II Grundzüge von Smalltalk Java I Klassen in BlueJ anlegen Java II JGUIToolbox und weitere Konstrukte Zustandsmodellierung Anhang

5 Teil I Grundkonzepte Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

6 Anhang Überblick Grundkonzepte Ablaufmodelliierung Smalltalk I die Entwicklungsumgebung Squeak Smalltalk II Grundzüge der Programmiersprache Pharo I Smalltalk-Entwicklung mit Pharo Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen Pharo II Grundzüge von Smalltalk Java I Klassen in BlueJ anlegen Java II JGUIToolbox und weitere Konstrukte Zustandsmodellierung

7 Gliederung Grundkonzepte Objekte und Klassen Namenskonventionen Objekt- und Klassenkarten Ein Beispiel der Tausammler Beziehungen Assoziation Vielfachheiten Multiplizitäten Teil Ganzes Aggregation Generalisierung und Vererbung Verfeinerung des Entwurfs Attribute und Variablen Methoden und Kapselung und Delegierung Zeitliche Abfolgen Sequenzdiagramme Datentypen Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

8 1.1 Objekte und Klassen Objekt Objekte mein_fahrrad Ein Objekt ist ein konkretes Element, eine Einheit, ein Gegenstand, etwas soeben Betrachtetes oder eine sonstige Größe mit einem eindeutigen Namen, dem Objektnamen oder Bezeichner. Die Merkmale eines Objektes nennt man Attribute, den Wert eines Attributs Attributwert. Die Dienste, die ein Objekt bietet und ausführen kann, nennt man seine Methoden. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen Attribute und ihre Werte: typ = Herrenrad bereifung = 28 mit Blitzventil farbe = blau rahmennummer = 12345

9 1.1 Objekte und Klassen Punktschreibweise objektname. attributname = Attributwert objektname. methodenname( Parameterwert1,... ) Für das Objekt mein_fahrrad: mein_fahrrad.typ = Herrenrad mein_fahrrad.bereifung = 28 mit Blitzventil mein_fahrrad.farbe = blau mein_fahrrad.schaltung = 21-Gang-Kette mein_fahrrad.rahmennummer = mein_fahrrad.fahren() mein_fahrrad.transportieren( meine_tasche ) Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

10 1.1 Objekte und Klassen mein_fahrrad (konkret) Klassenzugehörigkeit Instanzen FAHRRAD (allgemein) Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen Das Objekt mein_fahrrad gehört zur Klasse FAHRRAD. mein_fahrrad ist eine Instanz der Klasse FAHRRAD. Die Klasse eines Objektes kann man mit objektname: KLASSE angeben, z.b. mein_fahrrad: FAHRRAD

11 1.1 Objekte und Klassen Klassen Klasse FAHRRAD Alle Objekte mit gleichen Attributen und Methoden (nicht Attributwerten) lassen sich zu einer Klasse zusammenfassen. Eine Klasse ist ein Schema, das angibt, in welcher Weise Objekte aufgebaut sind, welche Attribute die zugehörigen Objekte beschreiben und welche Werte diese Attribute annehmen können (Wertebereich oder Domäne). welche Methoden die zugehörigen Objekte besitzen. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

12 1.2 Namenskonventionen Konventionen für Bezeichnner Namen von Objekten beginnen stets mit einem Kleinbuchstaben. Bezeichner von Attributen und Methoden sowie Parametern beginnen ebensfalls stets mit einem Kleinbuchstaben. Namen von Klassen beginnen stets mit einem Großbuchstaben. In Diagrammen schreiben wir Klassennamen in der Regel mit lauter Großbuchstaben. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

13 1.3 Objekt- und Klassenkarten mein_fahrrad: FAHRRAD typ = Herrenrad bereifung = 28 farbe = blau schaltung = ( Kette, 21) rahmennummer = FAHRRAD typ bereifung farbe schaltung rahmennummer fahren() transportieren( last ) Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen objektname: KLASSE attribut1 = WertA attribut2 = WertB Die Felder für Attribute und Methoden können auch fehlen. KLASSENNAME attribut1 attribut2 methode1() methode2( parameter )

14 1.4 Ein Beispiel der Tausammler Bei dem Spiel Tausammler muss der kleine Käfer die Tautropfen, die bunt verstreut in seiner Welt liegen, einsammeln und in seinen Speicher bringen. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen Doch es ist Eile geboten, da die Tropfen im Sonnenlicht verdunsten. Kritisch wird es, wenn ein Tropfen seine Farbe wechselt, dann bleibt nicht mehr viel Zeit. Dabei kann der Käfer immer nur einen Tropfen tragen...

15 1.4 Ein Beispiel der Tausammler Wie viele Objekte sind an dem Spiel beteiligt? Zu wie vielen Klassen gehören sie? Zeichne die entsprechenden Klassenkarten. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

16 1.4 Ein Beispiel der Tausammler Klassenkarten Erstfassung KÄFER position richtung punkte laufen() transportieren(objekt) sammeln(tropfen) TROPFEN position kostüm lebensdauer verdunsten() Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen SPEICHER elementzahl farbe schlucken(objekt) WELT tropfenzahl starten() reset()

17 1.5 Beziehungen Assoziation Entwirf ein Klassendiagramm, das die Beziehungen (Assoziationen) zwischen diesen Klassen widerspiegelt. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

18 1.5 Beziehungen Assoziation Klassendiagramm Erstfassung WELT < enthält enthält > TROPFEN enthält > Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen KÄFER sammelt > transportiert > < schluckt < enthält SPEICHER

19 1.6 Vielfachheiten Multiplizitäten Eine Verbindung in einem Klassendiagramm repräsentiert evtl. viele Beziehungen zwischen einzelnen Objekten. Daher gibt man in einem Klassendiagramm an den Enden jeder Verbindungslinie mit Multiplizitäten (Vielfachheiten) an, wie viele Instanzen der jeweiligen Klasse an der Assoziation beteiligt sind. 1 enthält > 64 SCHACHBRETT FELD ERZIEHER AMEISE FIRMA 1..2 betreut > umsorgt > 1 beschäftigt > bedeutet beliebig viele (auch keine). 1.. bedeutet mindestens ein(e). SCHÜLER KÖNIGIN MITARBEITER Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

20 1.6 Vielfachheiten Multiplizitäten Ersetze im Klassendiagramm alle Verbindungen durch einfache Linien und ergänze sämtliche Multipizitäten Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

21 1.6 Vielfachheiten Multiplizitäten Klassendiagramm Vielfachheiten WELT Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation 1 1 < enthält sammelt > enthält > TROPFEN transportiert > < schluckt enthält > < enthält 1 1 KÄFER 1 1 SPEICHER Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

22 1.7 Teil Ganzes Aggregation Für besonders häufige Beziehungstypen gibt es in der Diagrammsprache UML (Unified Modelling Language) spezielle Symbole, um die Diagramme übersichtlicher zu gestalten. Ein solcher Typ ist die Aggregation, die Teil-Ganzes-Beziehung: 1 enthält > n GANZES TEIL GANZES GANZES 1 besteht aus > n < gehört zu 1 n Abkürzung mit Aggregationspfeil: GANZES TEIL TEIL TEIL Beachte die Form der Pfeilspitze sowie das Fehlen des Assoziationsnamens und der Vielfachheit beim Ganzen. n Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

23 1.7 Teil Ganzes Aggregation Ersetze im Klassendiagramm bei allen Aggregationen die Assoziationslinie durch einen Aggregationspfeil und passe die Notation der Vielfachheiten an. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

24 1.7 Teil Ganzes Aggregation Klassendiagramm Aggregationspfeile WELT 1 KÄFER 1 1 sammelt > transportiert > TROPFEN < schluckt 1 1 SPEICHER Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

25 1.8 Generalisierung und Vererbung Erzeuge mit Etoys Instanzen der benötigten Klassen. erst einmal nur ein Tropfen Welche Etoys-Klassen benutzt du dazu? Stelle die Klassenhierarchie in einem Diagramm dar. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

26 1.8 Generalisierung und Vererbung Klassenhierarchie Erstfassung Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen ZEICHNUNG ist ein > < ist ein BEHÄLTER ist ein > KÄFER TROPFEN SPEICHER WELT

27 1.8 Generalisierung und Vererbung Klassenhierarchie Erweiterung OBJEKT ist ein > ist ein > DARSTELLER < ist ein SPIELWIESE ist ein > Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen ZEICHNUNG ist ein > < ist ein BEHÄLTER ist ein > KÄFER TROPFEN SPEICHER WELT < ist ein

28 1.8 Generalisierung und Vererbung KÄFER ist ein > ZEICHNUNG Auch für die Ist-Ein-Beziehung zwischen Unter- und Oberklasse, also zwischen Spezialisierung und Generalisierung gibt es in UML ein spezielles Pfeilsymbol: ist ein > UNTERKLASSE OBERKLASSE ist ein > SPEZIALISIERUNG GENERALISIERUNG Abkürzung mit Generalisierungspfeil: Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen UNTERKLASSE KÄFER OBERKLASSE ZEICHNUNG Beachte die Form der Pfeilspitze sowie das Fehlen des Assoziationsnamens.

29 1.8 Generalisierung und Vererbung Klassenhierarchie Generalisierungspfeile OBJEKT DARSTELLER SPIELWIESE Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen ZEICHNUNG BEHÄLTER KÄFER TROPFEN SPEICHER WELT

30 1.8 Generalisierung und Vererbung HUND SÄUGETIER Jeder Hund ist ein Säugetier. Deshalb kann jeder Hund auch fressen, atmen, seine Jungen säugen, und es ist sinnvoll, über seine Farbe und seinen Knochenbau zu sprechen. Diese Attribute und Methoden erbt die Klasse HUND von ihrer Oberklasse SÄUGETIER. Aber ein Hund frisst anders als z. B. eine Kuh, er hat ein Fell, was man von einem Wal wohl nicht behaupten wird, und vor allem kann er auch bellen und Stöckchen holen. So unterscheidet er sich von anderen Säugetieren. Will man einen Hund haben, muss man also nur ein Säugetier nehmen, ihm ein Fell überziehen, sein Fressverhalten umtrainieren und es das Bellen und Stöckchenholen lehren. Fertig. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

31 1.8 Generalisierung und Vererbung KÄFER ZEICHNUNG Vererbung ist ein zentrales Prinzip bei der objektorientierten Programmierung. 1. Schritt Welche Eigenschaften soll ein benötigtes Objekt besitzen, welche Dienste soll es bieten? 2. Schritt Gibt es bereits eine Klasse, deren Instanzen die gewünschten Anforderungen erfüllen? Dann nutze diese Klasse. 3. Schritt Andernfalls wähle eine Klasse, die zumindest einem Teil der Anforderungen genügt, als Oberklasse für eine neue Klasse. Willst du einen Käfer haben, nimm einfach eine Zeichnung, zieh ihr ein geeignetes Kostüm über und lehre sie, wie sie zu laufen hat, wie sie Objekte transportieren und Tropfen sammeln soll. Fertig. Vorteil: Nur diese Veränderungen sind zu programmieren. Der Rest wird vererbt. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

32 1.9 Verfeinerung des Entwurfs Verfeinere den Erstentwurf der Klassenkarten. Ergänze die Klassenkarten um die Generalisierung zur jeweils benutzten Etoys-Klasse. Trage die relevanten Attribute und Methoden bei der jeweiligen Oberklasse ein, soweit sie von dieser schon bereit gestellt werden. Trage bei den neuen Klassen nur diejenigen Attribute und Methoden ein, die neu zu definieren sind. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

33 1.9 Verfeinerung des Entwurfs Klassenkarten Verfeinerung ZEICHNUNG position richtung kostüm BEHÄLTER elementzahl farbe einfügen(objekt) SPEICHER Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen KÄFER punkte laufen() transportieren(objekt) sammeln(tropfen) TROPFEN lebensdauer verdunsten() 2 Dieses Attribut ist für die Tastatursteuerung z. B. eines Käfers wichtig. schlucken(objekt) WELT tropfenzahl letzteeingabe 2 starten() reset()

34 1.10 Attribute und Variablen Versieh die Objekte des Tausammlers in den Etoys mit den notwendigen Attributen. zunächst nur mit einem Tropfen Wie setzt du die neuen Attribute um? Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

35 1.10 Attribute und Variablen Programmiertechnisch gesehen ist ein Attribut einfach eine Möglichkeit, Informationen über ein Objekt (die Attributwerte) zu speichern. Bei Bedarf kann dann über den Attributnamen auf den gerade gespeicherten Wert zugegriffen werden. Wie in der Mathematik benutzt man für Attribute daher Variablen, sogenannte Instanzvariablen. Beispiel Augenfarbe In der Realität ist der Wert der Augenfarbe in der molekularen Struktur der Iris gespeichert. In dem informatischen Modell eines Menschen, das dem Personalausweis zu Grunde liegt, ist der Wert dieses Attributs als Zeichenkette unter dem Attributnamen Haarfarbe in einer entsprechenden (Instanz-)Variablen des Ausweises gespeichert. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

36 1.11 Methoden und Programmiere nun in den Etoys die ersten Methoden der Objekte (zunächst nur mit einem Tropfen). Bring dem Käfer das Laufen bei. Du sollst ihn mit den Pfeiltasten lenken können links/rechts, evtl. auch schneller/langsamer. Lass den Tropfen verdunsten. Gib ihm eine vernünftige Lebensdauer. Etwa 20 Sekunden vor Ablauf seiner Lebensdauer soll er die Farbe (das Kostüm) wechseln. Nach Ablauf seiner Lebensdauer soll er sich verstecken. Danach braucht er nicht mehr weiter zu verdunsten. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

37 1.11 Methoden und Startskripte Initialisierung Programmiere die Methoden Welt.starten() zum Starten und Welt.reset() zum Zurücksetzen des ganzen Spiels. Lege Knöpfe zum Ausführen dieser beiden Skripte auf der Welt ab. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen Was soll bei diesen beiden Methoden passieren? Wie lässt sich das Problem lösen, dass noch gar nicht klar ist, welche/wie viele Objekte letztlich in der Welt leben und welche Aktivitäten sie beherrschen werden? Tipp: Wie löst man genau dieses Problem bei Wettbewerben im Laufen, Schwimmen, Rad- oder Skifahren?

38 1.11 Methoden und reset() Der Käfer soll sich an seine Startposition stellen, in die Startrichtung schauen und dort stehen bleiben. Außerdem darf er am Anfang noch keine Punkte haben. Der Tropfen soll an irgendeiner (zufälligen) Stelle in der Welt auftauchen. Ggf. benötigt er wieder sein ursprüngliches Kostüm. Er sollte eine zufällige Lebensdauer von ein bis zwei Minuten erhalten. starten() Nach einem Reset sollten Käfer und Tropfen (und alle anderen Beteiligten) ihre Aktivitäten beginnen. Im Moment muss dann der Käfer laufen und der Tropfen verdunsten. Vorsicht: Die Aktivitäten (und die Beteiligten) könnten noch mehr werden! Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

39 1.11 Methoden und Auf die Plätze fertig los! Verstanden? Methodenaufruf Damit ein Objekt eine Methode ausführt, muss man ihm dazu den Auftrag geben (ihm eine Botschaft oder Nachricht schicken), man sagt auch: die Methode aufrufen. Das Objekt muss diese Nachricht freilich verstehen. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen Punktnotation objektname. methodenname ( Parameterwert ) UML-Darstellung empfaenger.methode(wert) sender Ergebnis empfaenger

40 1.11 Methoden und Die schlechte Lösung Warum? WELT.reset() käfer.gehezu(kaefer.startposition) käfer.blickein(kaefer.startrichtung) käfer.bleibstehen() käfer.setzepunkteauf(0) tropfen.gehezu(tropfen.zufallsposition) tropfen.setzelebensdauer(tropfen.zufallszeit) tropfen.setzekostüm(tropfen.urbild) Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen WELT.starte() self.reset() 3 käfer.laufe() tropfen.verdunste() 3 self ist der Name, mit dem sich ein Objekt in den meisten Programmiersprachen selbst anspricht.

41 1.12 Kapselung und Delegierung Muss der Fahrgast wissen, wie man das Taxi fährt? Nein, das ist Sache des Chauffeurs. Gute Objekte sind dumme Objekte Der Fahrgast muss die Schuhgröße des Chauffeurs nicht kennen er könnte ihn freilich danach fragen, aber ob der sie preisgibt? Gute Objekte sind Spezialisten Der Taxifahrer braucht keinen Flugschein, aber er sollte seinen Fahrgast von A nach B fahren können. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen fahrgast + frage(frage,person) chauffeur. sageschuhgröße() Antwort chauffeur chauffeur-privat - schuhgröße = 42 chauffeur.fahre(self,a,b) - steuere(taxi) + fahre(passagier,start,ziel) + sageschuhgröße()

42 1.12 Kapselung und Delegierung fahrgast + frage(frage,person) chauffeur. sageschuhgröße() Antwort chauffeur.fahre(self,a,b) chauffeur chauffeur-privat Grundkonzepte Klassen Namen - schuhgröße = 42 - steuere(taxi) UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung + fahre(passagier,start,ziel) Variablen + sageschuhgröße() Attribute sind privat immer! Der Chauffeur wird den Fahrgast sicher nicht in seine Schuhe schauen lassen ebensowenig wie er ihn das Wechselgeld selbst aus seiner Geldbörse heraussuchen lassen wird. Datenkapselung Attribute sind privat, d.h. ihre Werte von außen nicht unmittelbar einsehbar und gegen direkte Veränderung geschützt. Kapselung Sequenzdiagramme Datentypen

43 1.12 Kapselung und Delegierung Kennzeichnung in UML CHAUFFEUR - schuhgröße - geld - steuere(taxi) - veränderegeld(betrag) + sageschuhgröße() + fahre(passagier,start,ziel) + gibwechselgeld(betrag,bezahlt) Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen private Elemente mit einem Private Methoden können von außen, also von anderen Objekten nicht aufgerufen werden. öffentliche Elemente mit einem + Öffentliche Methoden entsprechen den, die eine Instanz dieser Klasse versteht.

44 1.12 Kapselung und Delegierung fahrgast + frage(frage,person) chauffeur. sageschuhgröße() Antwort chauffeur.fahre(self,a,b) chauffeur chauffeur-privat Grundkonzepte Klassen Namen - schuhgröße = 42 - steuere(taxi) UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung + fahre(passagier,start,ziel) Variablen + sageschuhgröße() Get- und Set-Methoden Accessoren Der Fahrgast wird auf seine Frage nach der Schuhgröße wohl irgendeine Antwort bekommen, auch darf er davon ausgehen, dass der Chauffeur seine Bezahlung entgegennimmt. Get und Set Accessoren Klassen bieten Methoden (Accessoren), um ggf. die Werte (privater) Attribute auszulesen (Get) oder zu verändern (Set). Kapselung Sequenzdiagramme Datentypen

45 1.12 Kapselung und Delegierung fahrgast + frage(frage,person) chauffeur. sageschuhgröße() Antwort chauffeur.fahre(self,a,b) chauffeur chauffeur-privat Grundkonzepte Klassen Namen - schuhgröße = 42 - steuere(taxi) UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung + fahre(passagier,start,ziel) Variablen + sageschuhgröße() Wie du das machst, ist deine Sache Ob der Chauffeur auf die Frage wahrheitsgemäß mit 42 antworten wird? Ganz bestimmt wird er sich jedenfalls nicht dreinreden lassen, wenn es darum geht, wie er seinen Wagen zu steuern hat. Das fällt schließlich in seinen Aufgaben- und Verantwortungsbereich. Dafür ist er der Spezialist, nicht der Fahrgast, sein Auftraggeber. Der bekommt dann nur das fertige Ergebnis. Kapselung Sequenzdiagramme Datentypen

46 1.12 Kapselung und Delegierung fahrgast + frage(frage,person) chauffeur. sageschuhgröße() Antwort chauffeur.fahre(self,a,b) Wie du das machst, ist deine Sache Delegierung chauffeur chauffeur-privat Grundkonzepte Klassen Namen - schuhgröße = 42 - steuere(taxi) UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung + fahre(passagier,start,ziel) Variablen + sageschuhgröße() Mit dem Aufruf einer Methode delegiert der Sender die entsprechende Aufgabe an den (darauf spezialisierten) Empfänger. Kapselung Sequenzdiagramme Datentypen sender empfaenger.methode(wert) Ergebnis empfaenger

47 1.12 Kapselung und Delegierung Auf die Plätze... die gute Lösung WELT.reset() wiederhole für jedes element WELT.starte() element.machdichbereit() self.reset() wiederhole für jedes element element.starte() Kapselung: Die Welt kennt/nutzt keinerlei Attribut ihrer Elemente, sie kümmert sich hier nicht einmal darum, wer genau ihre Element sind. Delegierung: Vereinbart ist nur, dass alle Elemente machdichbereit() und starte() verstehen müssen. Was sie auf diese Nachricht hin machen, ist ihre Sache. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

48 1.12 Kapselung und Delegierung Programmiere in den Etoys die notwendigen Initialisierungs- und Startmethoden der Objekte (nach wie vor nur mit einem Tropfen). Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

49 1.13 Zeitliche Abfolgen Sequenzdiagramme Der Weg zur Leberkäsesemmel Am Brotzeitstand in der Mittagspause arbeiten gewöhnlich zwei Personen. Der Metzger portioniert im Hintergrund den Leberkäse und die Würste nach Bedarf, während seine Frau die Bestellungen und die Bezahlung entgegennimmt und das Gewünschte an die Kunden ausgibt. Wie läuft der Pausenverkauf üblicherweise ab, wenn du an der Reihe bist? Wer gibt da wem welche Aufträge? Was ist jeweils das Ergebnis so eines Auftrags? Stelle den Ablauf von der Begrüßung bis zum ersten Biss in die Semmel mit allen daran Beteiligten übersichtlich dar. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

50 1.13 Zeitliche Abfolgen Sequenzdiagramme Grundkonzepte Klassen Namen k:kunde v:verkäuferin m:metzger UML-Darstellung Tausammler Darstellung in einem Sequenzdiagramm nimmbestellungauf(wunsch) bereitezu(wunsch) bezahle(preis) geld reinige(besteck) gibwechselgeld() Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen wechselgeld imbiss imbiss

51 1.13 Zeitliche Abfolgen Sequenzdiagramme Sequenzdiagramme objekt1 Objekt objekt2 Objektkonstruktion nachricht(parameter) new() objekt3 nachricht() nachricht(par) antwort nachricht(par) Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen Zeit Überlagerung antwort delete() antwort Selbstdelegation Aktivitätsbalken Lebenslinie Lebensende

52 1.13 Zeitliche Abfolgen Sequenzdiagramme Anmeldung an einem Online-Portal Bei der Anmeldung an einem Online-Portal erfolgt eine Kommunikation zwischen dem Server, der das Portal anbietet, dem Benutzer, der sich anmelden möchte, und dem Client-Rechner des Benutzers. Üblicherweise ruft der Benutzer über einen Login-Link einen Anmeldedialog seitens des Servers auf. Die eingegebenen Daten werden vom Server überprüft. Hat der Benutzer seine Kennung falsch eingegeben, zeigt der Server eine Hinweisseite mit der Option an, den Anmeldevorgang zu wiederholen. Stimmen die Benutzerangaben, zeigt der Server eine Willkommensseite und erzeugt ein sogenanntes Cookie, das er dem Client-Rechner des Benutzers zum Abspeichern übergibt. Beendet der Benutzer seine Sitzung, indem er sich vom Server abmeldet, löscht der Client-Rechner das Cookie wieder. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

53 1.13 Zeitliche Abfolgen Sequenzdiagramme Stelle die beiden Abläufe (fehlgeschlagene bzw. erfolgreiche Anmeldung) jeweils in einem Sequenzdiagramm dar. Falls der Benutzer seine Sitzung nicht ordentlich beendet, bleibt das Cookie vorhanden, sodass der Benutzer beim nächsten Aufruf der betreffenden Portalseite automatisch angemeldet wird, falls das Cookie noch gültig ist. Erweitere eines der Sequenzdiagramme dahingehend, dass der Server beim Aufruf der Portalseite erst einmal beim Clientrechner anfragt, ob ein passendes Cookie vorhanden ist. Zeichne das Sequenzdiagramm für den Fall, dass zwar ein Cookie vorhanden, aber nicht mehr gültig ist. Beachte dabei, dass die Gültigkeitsdauer ein privates Attribut eines Cookies ist, also nur über eine (öffentliche) Get-Methode ausgelesen werden kann Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

54 1.13 Zeitliche Abfolgen Sequenzdiagramme Plane die fehlenden Methoden mit Hilfe von Sequenzdiagrammen: Der Käfer muss den Tropfen mitnehmen, wenn er ihn trifft, oder der Tropfen dann am Käfer hängen bleiben. Der Tropfen muss in den Speicher, wenn der Käfer mit ihm dort ankommt. Der Käfer hat sich einen Belohnungspunkt verdient, wenn der Tropfen im Speicher ist. Wer bestimmt eigentlich das Spielende? Wie? Was soll dann passieren? Wer muss jeweils wem in welcher zeitlichen Abfolge welche schicken bzw. welches Ergebnis abwarten? Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

55 1.13 Zeitliche Abfolgen Sequenzdiagramme Tropfenaufnahme tropfen kaefer überlappt(self) WAHR istbeladen() FALSCH ladeauf(self) Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen beende(verdunsten)

56 1.13 Zeitliche Abfolgen Sequenzdiagramme Tropfentransport kaefer tropfen machschritt() bestimmeneueposition() Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen position gehezu(position)

57 1.13 Zeitliche Abfolgen Sequenzdiagramme Tropfenabgabe kaefer speicher Welt überlappt(self) WAHR schlucke(trtropfen) lasslos(trtropfen) senketropfenzahl(1) Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen erhöhepunkte(1) beendespiel() pruefespielende() hattropfen() FALSCH

58 1.13 Zeitliche Abfolgen Sequenzdiagramme Programmiere die fehlenden Methoden. Bring dem Käfer bei, dass er den Tropfen mitnimmt, wenn er ihn trifft (oder dem Tropfen, dass er am Käfer hängen bleibt). Der Tropfen muss in den Speicher, wenn der Käfer mit ihm dort ankommt. Der Käfer hat sich einen Belohnungspunkt verdient, wenn der Tropfen im Speicher ist. Wer bestimmt eigentlich das Spielende? Wie? Was soll dann passieren? Der Käfer könnte doch z.b. seinen Endpunktestand auf den Boden malen, der Tropfen einen Freudentanz aufführen, der Speicher blinken... Lass dir etwas einfallen! Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

59 1.14 Datentypen Speichere das Projekt unter einem neuen Namen ab. Erweitere den Tausammler in den Etoys auf mehrere Tropfen. Welche neuen Schwierigkeiten treten dabei auf? Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

60 1.14 Datentypen Probleme Lösung Wenn der Käfer einen Tropfen trifft, muss er wissen, ob er schon beladen ist, weil er immer nur einen Tropfen tragen kann. Der Käfer muss wissen, welchen der Tropfen er gerade transportiert, weil er diesem Tropfen immer seine Position übermitteln muss. zwei neue Attribute, also Variablen: istbeladen kann WAHR oder FALSCH sein transporttropfen verweist auf ein anderes Objekt, den gerade transportierten Tropfen Die Art der in einer Variablen gespeicherten Werte nennt man den (Daten-)Typ der Variable. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

61 1.14 Datentypen Wichtige Datentypen in Etoys Zahl (Number) kann eine ganze Zahl sein (Integer) oder eine Gleitkommazahl (Float) meist mit Dezimalpunkt. Zeichenkette (String) wird in den meisten Programmiersprachen durch Anführungszeichen gekennzeichnet, etwa hallo oder 10a. Wahrheitswert (Boolean) kann WAHR oder FALSCH sein. Punkt (Point) Koordinaten eines Punktes in der Welt Darsteller (Player) verweist auf ein beliebiges Objekt samt all seiner Attribute und Methoden. Weitere wichtige Datentypen in vielen Programmiersprachen sind etwa Listen und Felder (Arrays), wenn es darum geht, zusammengesetze Informationen zu speichern, z.b. Adressbucheinträge. Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Kapselung Sequenzdiagramme Datentypen

62 Teil II Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen Ablaufmodellierung

63 Anhang Überblick Grundkonzepte Ablaufmodelliierung Smalltalk I die Entwicklungsumgebung Squeak Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen Smalltalk II Grundzüge der Programmiersprache Pharo I Smalltalk-Entwicklung mit Pharo Pharo II Grundzüge von Smalltalk Java I Klassen in BlueJ anlegen Java II JGUIToolbox und weitere Konstrukte Zustandsmodellierung

64 Gliederung Ablaufmodelliierung Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen und Schleifen Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen

65 2.1 Algorithmen Gelernt ist gelernt Leberkäse satt Was macht der Metzger eigentlich genau, wenn du deine Leberkäsesemmel bestellst? Ist es immer das gleiche? Gibt es manchmal Probleme? Was hat er zu tun, wenn du für deine fünf Freunde mitbestellst Leberkäsesemmeln, was sonst? Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen Algorithmen Ein Algorithmus ist eine endliche Verarbeitungsvorschrift, die als Folge von Anweisungen so präzise formuliert ist, dass sie eindeutig von einer Maschine ausführbar ist. Stelle einen Algorithmus für die Arbeit des Metzgers beim Leberkäsesemmelverkauf auf.

66 2.2 Struktogramme Eine Möglichkeit, Algorithmen darzustellen, sind Struktogramme: bereiteleberkäsesemmeln(bestellung) merkedir(bestellung) Wiederhole für Bestellung.Semmeln Zutaten vorhanden? WAHR FALSCH schneideauf(semmel) gibaus(bisher schneide(leberkäsescheibe) belege(s-boden, LK-Scheibe) fertige meln) Sem- Aufstrich? WAHR FALSCH bestreiche(lk,aufstrich) schließe(semmel) gibaus(fertige Semmeln) brich ab Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen

67 2.3 Flussdiagramme Eine weitere Möglichkeit, Algorithmen darzustellen, sind Flussdiagramme: bereiteleberkäsesemmeln(bestellung) Start Bestellung Bestellung abgearbeitet? ja fertige Semmeln Ende Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen schließe(semmel) nein Zutaten vorhanden? nein bisher fertige Semmeln Abbruch ja schneideauf(semmel) schneide(leberkäsescheibe) belege(s-boden, LK-Scheibe) nein Aufstrich? ja bestreiche(lk, Aufstrich)

68 2.3 Flussdiagramme Elemente von Flussdiagrammen: Start Ein-/Ausgabe Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen Aktivität Ende ja Bedingung nein

69 2.4 Sequenzen Eine Folge von Anweisungen heißt Sequenz. schneideauf(semmel) schneide(leberkäsescheibe) belege(s-boden, LK- Scheibe) Start schneideauf(semmel) Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen schneide(leberkäsescheibe) belege(s-boden, LK-Scheibe) Ende

70 2.5 Verzweigungen Eine bedingte Anweisung heißt einseitige Verzweigung. Aufstrich? WAHR bestreiche(lk,aufstrich) FALSCH Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen Start nein Aufstrich? ja bestreiche(lk, Aufstrich) Ende

71 2.5 Verzweigungen Eine Alternativentscheidung heißt zweiseitige Verzweigung. Zutaten vorhanden? WAHR FALSCH bereitezu(lk-semmel) gibaus(lk-semmeln) Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen Start ja bereitezu(lk-semmel) Zutaten vorhanden? nein bisher fertige Semmeln Ende

72 2.6 Wiederholungen und Schleifen Soll eine Sequenz mehrfach durchlaufen werden, spricht man von einer Wiederholung oder Schleife. Wiederhole für Bestellung.Semmeln bereitezu(aktuelle Semmel) Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen Start Bestellung abgearbeitet? ja Ende nein bereitezu(aktuelle Semmel) Die zu wiederholende Sequenz wird jeweils vollständig ausgeführt.

73 2.6 Wiederholungen und Schleifen setze den Stift auf ein Kreuz in Blattmitte starte nach rechts wiederhole bis du wieder am Startfeld ankommst 3 Kästchen vor wiederhole 3 mal 2 Kästchen vor wiederhole 4 mal 1 Kästchen vor 90 nach links 90 nach rechts nimm den Stift hoch wiederhole 5 mal sage fertig! steh auf warte 10 Sekunden setz dich wieder Führe nebenstehenden Algorithmus aus. Wandle das Struktogramm in ein Flussdiagramm um. Programmiere das ganze mit Etoys. Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen

74 Squeak Arbeitsoberfläche Maustasten Weltmenüs Teil III Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Smalltalk I Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

75 Anhang Überblick Grundkonzepte Ablaufmodelliierung Smalltalk I die Entwicklungsumgebung Squeak Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Smalltalk II Grundzüge der Programmiersprache Pharo I Smalltalk-Entwicklung mit Pharo Pharo II Grundzüge von Smalltalk Java I Klassen in BlueJ anlegen Java II JGUIToolbox und weitere Konstrukte Zustandsmodellierung Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

76 Gliederung Smalltalk I die Entwicklungsumgebung Squeak Die Arbeitsoberfläche Rot, Gelb, Blau die Maus Wichtige Weltmenüs Halomenüs von Morph-Objekten Tastaturkürzel Speichern Speichern des gesamten Images Speichern von Projekten Speichern von Paketen Monticello Hallo Welt! Der Browser MyWatchMorph eine neue Klasse Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

77 3.1 Die Arbeitsoberfläche Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

78 3.1 Die Arbeitsoberfläche Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Wichtigster Unterschied zum squeakland-image ist die Klappe Werkzeugkiste am rechten Rand. Methodensuche Übung

79 3.1 Die Arbeitsoberfläche Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Bei den Halos gibt es ein Schraubenschlüssel-Halo für den Zugriff auf die Programmierwerkzeuge. Methodensuche Übung

80 3.2 Rot, Gelb, Blau die Maus Rot linke Maustaste wählt aus oder packt an. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Gelb mittlere Maustaste öffnet Kontextmenüs. Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Blau rechte Maustaste führt Metaoperationen aus, bringt z. B. die Halos zum Vorschein. Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

81 3.3 Wichtige Weltmenüs linke Maustaste (rot) Speichern bedeutet stets Speichern des gesamten Images im aktuellen Zustand, nicht nur des aktuellen Projektes. mittlere Maustaste (gelb) Das Projektmenü ist der Navigator-Klappe ähnlich. Durch Anklicken in der Objekthierarchie lassen sich auch verschwundene Objekte wieder finden. Alternative: Shift + roter Klick auf den Hintergrund Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

82 3.4 Halomenüs von Morph-Objekten rotes Halo Besonders nützlich ist hier das Layout- Untermenü. graues Halo Dieses Programmier- Menü ist das Tor von den etoys zur wahren Smalltalk-Welt. Besonders wichtig sind Browser für Morf und Morf erforschen (öffnet einen Inspector des Morfs). Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

83 3.5 Tastaturkürzel In zahlreichen Menüs (im Bild das Kontextmenü eines Workspace) sind in Klammern Tastaturkürzel angegeben. Aufruf mit der Alt- (oder Strg-)Taste, z. B. Alt-c Kopieren Alt-x Ausschneiden Alt-v Einfügen Alt-z Rückgängig Alt-f Suchen Alt-s Speichern/Akzeptieren Alt-a Alles auswählen Alt-d Ausführen (do it) Alt-p Auswerten (print it) Alt-i Untersuchen (inspect it) Vgl. auch die Squeak Language Reference zu Tastaturkürzeln, Mausfunktionen und Menüs sowie den Grundlagen von Smalltalk. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

84 3.6 Speichern Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Vorbemerkung zum Speichern Falls ihr im folgenden euer Werk als Projekt in eine Datei speichert (veröffentlicht), achtet unbedingt darauf, auch etwaige changes in the change set mit zu speichern, falls ihr danach gefragt werdet! Andernfalls gehen von euch programmierte Veränderungen in der Klassenhierarchie verloren. Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

85 3.7 Speichern des gesamten Images Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

86 3.8 Speichern von Projekten Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

87 3.9 Speichern von Paketen Monticello Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

88 3.10 Hallo Welt! Öffnet ein neues Projekt (Navigator-Klappe oder gelber Mausklick auf dem Hintergrund). Zieht aus der Werkzeugkiste einen Workspace und ein Transcript in die Welt. Ein Workspace ist eine Art Eingabefenster für Smalltalk-, ein Transcript ein Ausgabefenster. Schreibt in den Workspace die Zeile Transcript show: Hallo, Welt!. (Beachtet den Punkt am Ende der Nachricht!) Markiert die Nachricht mit der Maus und führt sie aus (gelber Mausklick oder Alt-d). Öffnet den Terse Guide to Squeak oder alternativ dessen formatierte Version und probiert (ausführen bzw. auswerten) in eurem Workspace die Beispiele zu Transcript, Arithmetic expressions und Pen aus. Variiert die Beispiele und lasst euer Pen-Objekt z. B. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

89 3.11 Der Browser Öffnet ein neues Projekt und darin einen Workspace. Schreibt die Zeile WatchMorph new openinworld. in den Workspace und führt sie aus (do it). Ruft über das Programmiermenü (graues Halo) einen Browser für den Morf auf. Ziel wird es sein, diese Uhr zu verbessern, so könnte sie z. B. jede Sekunde ihre Farbe 4 wechseln. 4 Um die Namen der Farbattribute zu eruieren, könnt ihr den Morf auch mit dem Inspector erforschen. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

90 3.11 Der Browser Der Browser kennt zwei Darstellungsformen: Als Hierarchy Browser zeigt er die Klasse und ihre Oberklassen, als System Browser (Aufruf auch mit Alt-b) die Klasse als Element einer logischen Kategorie. Der Wechsel zwischen den beiden Darstellungen erfolgt mit den Schaltflächen browse bzw. hierarchy. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

91 3.11 Der Browser Teilbereiche des Browsers die logischen Kategorien von Klassen nicht alphabetisch sortiert! Gelber Mausklick darauf (Kontextmenü) erlaubt die Suche nach einer Klasse. die Klassen der ausgewählten Kategorie bzw. die Klasse und ihre Oberklassen die Kategorien oder Protokolle, in die die Methoden der ausgewählten Klasse logisch gruppiert sind die Methoden (Selektoren) des gewählten Protokolls Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

92 3.12 MyWatchMorph eine neue Klasse Öffnet einen Workspace und wertet darin den Befehl WatchMorph new openinworld. aus (do it). Es erscheint eine Uhr der Klasse WatchMorph. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Ziel dieses Abschnittes wird es sein, diese Uhr so zu verändern, dass sie (auf Wunsch) im Sekundentakt die Farben von Zeigern und Hintergrund vertauscht. Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Technisch bedeutet das, dass für diese besseren Uhren eine neue Unterklasse (z. B. MyWatchMorph) von WatchMorph angelegt werden muss. Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

93 3.12 MyWatchMorph eine neue Klasse MyWatchMorph ist Unterklasse von WatchMorph. Objekte der Klasse MyWatchMorph benötigen ein zusätzliches Attribut farbwechsel, das speichert, ob das Vertauschen der Farben ein- oder ausgeschaltet ist. 5 Ferner benötigen die neuen Uhren eine Methode invertierefarben, die die Farben vertauscht. Zudem müssen vermutlich einige Methoden von WatchMorph angepasst (überschrieben) werden. 6 Modellierung in UML: Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung WatchMorph +initialize() +step() MyWatchMorph -farbwechsel: boolesch +invertierefarben() Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter 5 Außerdem sollte es auch Methoden geben, um den Wert dieses Attributes auszulesen oder zu verändern, get und set. 6 Konkret werden das initialize zur Instanzerzeugung und step zur Zustandsaktualisierung sein. Methoden mit temporären Variablen Methodensuche Übung

94 3.12 MyWatchMorph eine neue Klasse Erzeugt eine neue Kategorie für dieses Projekt. 7 Stellt den Browser auf System Browser um ( browse ). gelber Mausklick auf das Kategorienfenster (Kontextmenü) Wählt den Menüpunkt add item... und gebt in dem erscheinenden Fenster den Namen der neuen Kategorie ein, etwa Versuchsklassen. Kategorienamen beginnen stets mit einem Großbuchstaben.... auch Klassennamen! 7 Kategorien dienen der übersichtlichen Verwaltung der Klassen. Was sinnvollerweise zusammengehört/-passt, sollte in eine gemeinsame Kategorie aufgenommen werden. Für den Anfang empfiehlt es sich, für jedes Projekt eine eigene Kategorie anzulegen, die dann alle neuen Klassen des Projektes enthält. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

95 3.12 MyWatchMorph eine neue Klasse Erzeugt die neue Klasse MyWatchMorph als Unterklasse von WatchMorph. Wählt die Kategorie aus (roter Mausklick auf den Namen). Ändert die Klassendefinition im Quelltextfenster wie folgt ab: Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! WatchMorph subclass: #MyWatchMorph instancevariablenames: Planung classvariablenames: pooldictionaries: category: Versuchsklassen Speichert die neue Definition mit Alt-s oder gelbem Mausklick in das Fenster und dann Ok. Im Kommentarfenster könnt ihr die neue Klasse noch dokumentieren. Alt-s! 8 8 Wann immer ihr aufgefordert werdet, eure Initialen einzugeben, Der Browser Anlegen einer neuen Klasse Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

96 3.12 MyWatchMorph eine neue Klasse Ergänzt die Klassendefinition um eine (boolesche) Instanzvariable farbwechsel, die die Werte wahr oder falsch annehmen soll je nachdem, ob der Farbwechseleffekt aktiv ist oder nicht. Ändert den Quelltext dazu folgendermaßen ab: WatchMorph subclass: #MyWatchMorph instancevariablenames: farbwechsel classvariablenames: pooldictionaries: category: Versuchsklassen (lokale) Variablennamen müssen mit einem Kleinbuchstaben beginnen! Der Variablentyp (hier wäre er boolesch bzw. Boolean) wird in Smalltalk nicht festgelegt. Alt-s. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

97 3.12 MyWatchMorph eine neue Klasse Squeak Schaltet den Browser auf Hierarchy Browser um, sodass die Klassenhierarchie angezeigt wird. Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen MyWatchMorph wurde als Unterklasse von WatchMorph angelegt was bedeutet das? Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

98 3.12 MyWatchMorph eine neue Klasse Neben farbwechsel besitzen Objekte der Klasse MyWatchMorph auch sämtliche Attribute der Klasse WatchMorph (und deren Oberklassen), also z. B. color und handscolor. 9 Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Noch hat farbwechsel keinen Wert: nil 9 Öffnet einen Workspace, erzeugt mit dem Befehl MyWatchMorph new openinhand. eine Instanz der Klasse und erforscht den Morph, um das zu sehen. Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

99 3.12 MyWatchMorph eine neue Klasse Gleiches gilt für die Methoden: Die neue Klasse erbt alle Methoden ihrer Oberklassen, aber: Vererbte Methoden können auch modifiziert werden und in der neuen Klasse eine andere Wirkung besitzen als in den Oberklassen: Polymorphismus oder Überschreiben (Override) Bei MyWatchMorph ist das bei den Methoden initialize und step notwendig: initialize Bei der Erzeugung einer neuen Instanz der Klasse muss auch dem zusätzlichen Attribut farbwechsel ein Wert zugewiesen werden. step Bevor das Aussehen der Uhr im Sekundentakt aktualisiert wird, muss ggf. jeweils erst ein Farbwechsel erfolgen. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

100 3.12 MyWatchMorph eine neue Klasse Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Bei der Erzeugung eines neuen Objektes müssen dessen Attributen Werte zugewiesen werden. Das erledigt in der Regel die Methode initialize im Protokoll initialization. Seht euch im Hierarchy Browser den Quelltext dieser Methode der Klasse WatchMorph an. Was passiert da? Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

101 3.12 MyWatchMorph eine neue Klasse WatchMorph»initialize 10 1 initialize 2 "initialize the state of the receiver" 3 super initialize. 4 5 self handscolor: Color red. 6 self centercolor: Color gray. 7 romannumerals := false. 8 antialias := false. 9 fontname := NewYork. 10 self extent: self start Was passiert hier alles? Zeile 1 Methodendeklaration (Name und evtl. Parameter) Zeile 2 Kommentarzeile, wird nicht ausgewertet Zeile 7 9 direkte Wertzuweisungen für Attribute (Instanzvariablen) Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

102 3.12 MyWatchMorph eine neue Klasse Betrachtet auch die initialize-methoden der Oberklassen von WatchMorph und macht euch deren Inhalt jeweils klar. In den Klassen EllipseMorph und Object ist diese Methode nicht eigens definiert, d. h. es wird die entsprechende Methode der jeweiligen Oberklasse aufgerufen. In der obersten Klasse ProtoObject enthält die Methodendefinition lediglich eine Kommentarzeile, d. h. es passiert gar nichts. Der Selektor ist lediglich ein Platzhalter, der gewährleistet, dass alle Objekte sämtlicher Unterklassen die Nachricht initialize verstehen, was auch immer sie dann tun. Wie sollte wohl die initialize-methode der neuen Klasse MyWatchMorph aussehen? Notiert den vermutlichen Quelltext! Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

103 3.12 MyWatchMorph eine neue Klasse Eröffnet ein neues Protokoll für die Methode MyWatchMorph»initialize. 11 gelber Mausklick auf das Protokollfenster (Kontextmenü) Wählt den Menüpunkt new category... und im nächsten Menü das Protokoll initialization. Wie Methodennamen beginnen auch Protokollnamen stets mit einem Kleinbuchstaben. Aktiviert dieses Protokoll (roter Mausklick auf den Protokollnamen im Browser). 11 Protokolle dienen der übersichtlichen Verwaltung der Methoden. Was sinnvollerweise zusammengehört/-passt, sollte in eine gemeinsame Kategorie aufgenommen werden. Für die meisten Methoden passt eine der vorgeschlagenen Standardkategorien. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

104 3.12 MyWatchMorph eine neue Klasse Programmiert die neue Methode initialize. Nach Wahl eines Protokolls (roter Mausklick auf den Namen) erscheint im Quelltextfenster eine Vorlage (template) für neue Methoden: message selector and argument names "comment stating purpose of message" temporary variable names statements Ersetzt die Vorlage durch folgenden Quelltext, den ihr per Copy&Paste weitgehend aus WatchMorph»initialize übernehmen könnt: 12 initialize "initialize the state of the receiver" super initialize. farbwechsel := true Alt-s. 12 Zuordnungspfeil als Unterstrich Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

105 3.12 MyWatchMorph eine neue Klasse Ein wichtiges Prinzip objektorientierter Programmierung ist die Datenkapselung: Die Werte (privater) Attribute von Objekten dürfen von außen nicht einfach durch direkte Wertzuweisungen verändert werden können. Stattdessen gehören zu jedem Attribut zwei (öffentliche) Methoden: Get-Methode liefert als Ergebnis den aktuellen Attributwert Set-Methode verändert den Wert des Attributs In Smalltalk haben diese Methoden in der Regel (fast) denselben Namen wie das Attribut. in unserem Beispiel: Instanzvariable farbwechsel Get-Methode farbwechsel Set-Methode farbwechsel: Beachte den Doppelpunkt! Diese Methoden gehören zum Protokoll accessing. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

106 3.12 MyWatchMorph eine neue Klasse Zunächst die Get-Methode, eine Methode mit Rückgabewert 1 farbwechsel 2 farbwechsel Zeile 1 Methodendeklaration: der Methodenname (Selektor) Zeile 2 Als Ergebnis wird an der Wert der Variablen farbwechsel an den Sender der Nachricht zurückgegeben. 13 Wird bei einer Methode kein expliziter Rückgabewert definiert, liefert die Methode standardmäßig das aktuelle Objekt als Ergebnis zurück (ˆself). Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung 13 Der Rückgabepfeil wird als Dach ( ˆ ) eingegeben.

107 3.12 MyWatchMorph eine neue Klasse Nun die Set-Methode, eine Methode mit Parameter 1 farbwechsel: boolwert 2 "Setzt bei boolescher Eingabe 3 das farbwechsel-verhalten" 4 5 (boolwert basictype = #Boolean) 6 iftrue: [farbwechsel := boolwert] Zeile 1 Methodendeklaration: der Selektor zusammen mit einem (frei gewählten) Namen eines Parameters, der der Methode beim Aufruf übergeben werden muss Zeile 2 3 Kommentarzeilen zur Dokumentation Zeile 5 eine Vorsichtsmaßnahme: Hier wird geprüft, ob der übergebene Parameter boolwert tatsächlich ein boolescher Wert (also true oder false) ist. 14 Zeile 6 Nur wenn die Bedingung aus Zeile 5 wahr ist, wird dem Attribut farbwechsel der Wert des Parameters boolwert zugewiesen. 14 Das ist notwendig, weil Variablen (hier farbwechsel) beliebige Werte annehmen können, was gefährlich sein kann. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

108 3.12 MyWatchMorph eine neue Klasse Um die Klasse MyWatchMorph soweit zu testen, könnt ihr ein Transcript und einen Workspace öffnen und im Workspace folgende Befehlssequenz ausführen (do it): testuhr := MyWatchMorph new. testuhr openinworld. Transcript clear; show: testuhr farbwechsel; cr. testuhr farbwechsel: 5. Transcript show: testuhr farbwechsel; cr. testuhr farbwechsel: false. Transcript show: testuhr farbwechsel; cr. testuhr farbwechsel: 5. Transcript show: testuhr farbwechsel; cr. testuhr farbwechsel: true. Transcript show: testuhr farbwechsel; cr. Statt 5 könntet ihr auch sonst etwas schreiben. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

109 3.12 MyWatchMorph eine neue Klasse Die Methode invertierefarben (Protokoll visual properties), die die Farben von Zeigern und Hintergrund vertauscht, benötigt eine temporäre Variable (hfarbe), die nur innerhalb der Methode bekannt ist, um eine der beiden Farben zwischenzuspeichern: 1 invertierefarben 2 "vertauscht Zeiger- und Hintergrundfarbe" 3 hfarbe 4 self farbwechsel 5 iftrue: [hfarbe := self color. 6 self color: handscolor. 7 self handscolor: hfarbe] Zeile 3 Temporäre Variablen müssen am Beginn des Skripts zwischen senkrechten Strichen deklariert werden. Zeile 4 Als Bedingung wird hier die Get-Methode MyWatchMorph»farbwechsel ausgewertet, Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

110 3.12 MyWatchMorph eine neue Klasse Nun muss nur noch die Methode step 15 (Protokoll stepping and presenter) gegenüber WatchMorph»step geeignet angepasst werden: 1 step 2 self invertierefarben. 3 self changed Aber was bedeutet die Nachricht changed in Zeile 3? Es gibt zwei Werkzeuge, das herauszufinden: die Schaltflächen senders und implementors im (am besten Hierarchy) Browser den Methoden-Sucher (Selector Browser) in der Klappe Werkzeugkiste 15 Diese Methode wird bei Morph-Objekten in regelmäßigen Abständen aufgerufen; lest dazu den Quelltext von Morph»step! Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

111 3.12 MyWatchMorph eine neue Klasse senders und implementors im (Hierarchy) Browser Wählt eine Methode im Browser aus, z. B. MyWatchMorph»step. Bei Klick auf eine der beiden Schaltflächen erhaltet ihr ein Auswahlmenü mit allen Selektoren (z. B. changed), die in dieser Methode auftreten. senders liefert eine Liste aller Methoden von Klassen, in denen der ausgewählte Selektor aufgerufen wird. implementors liefert eine Liste aller Klassen, in denen eine Methode mit dem Selektor als Name definiert wird. Sucht in der erhaltenen Liste nach den Oberklassen der aktuellen Klasse, z. B. Morph»changed und Object»changed. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

112 3.12 MyWatchMorph eine neue Klasse Methoden-Sucher (oder Selector Browser) in der Klappe Werkzeugkiste 16 text Im Suchfenster lassen sich beliebige Bruchstücke von Selektoren eingeben 16 Auswahl eines Selektors liefert eine Liste passender Klassen und Methoden. Gelber Mausklick auf die Selektorenliste liefert ein Kontextmenü zur Einschränkung auf senders oder implementors. Bei Klick auf eine der Methoden öffnet sich ein Systembrowser. 16 oder auch Anderes, etwa Ein-Ausgabe-Muster (vgl. die Anleitung im unteren Textfeld) Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

113 3.12 MyWatchMorph eine neue Klasse Was noch wünschenswert wäre: Falls jemanden das Geblinke der Uhr stört, sollte er über das -Menü-Halo die Möglichkeit haben, den Farbwechsel aus- oder auch wieder anzuschalten. Noch fehlt ein entsprechender Eintrag im Menü. Seht euch die Methoden zum Protokoll menus der Klasse WatchMorph an insbesondere WatchMorph»addCustomMenuItems:hand: und die toggle-methoden und spezifiziert/ergänzt sie für MyWatchMorph geeignet. Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern Image Speichern Projekte Speichern Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung

114 Teil IV Smalltalk II Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

115 Überblick Grundkonzepte Ablaufmodelliierung Smalltalk I die Entwicklungsumgebung Squeak Smalltalk II Grundzüge der Programmiersprache Pharo I Smalltalk-Entwicklung mit Pharo Pharo II Grundzüge von Smalltalk Java I Klassen in BlueJ anlegen Java II JGUIToolbox und weitere Konstrukte Zustandsmodellierung Anhang Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

116 Gliederung Smalltalk II Grundzüge der Programmiersprache Das Objekt-Modell von Squeak Instanzen und Variablen Wertzuweisung new, new: und initialize an Instanzen Priorität/Rangfolge von Befehlssequenzen und Blöcke Variablen Literale Verzweigung bedingte Anweisungen Bedingte Wiederholung Zählschleifen immer das gleiche Intervalldurchlauf fast das gleiche Übungen Turtle-Grafik Kollektionen und Iteratoren Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

117 4.1 Das Objekt-Modell von Squeak In Smalltalk ist alles ein Objekt. Jedes Objekt besitzt private Daten die Werte seiner Attribute bzw. Instanzvariablen. Die privaten Daten können von außen nur durch Aufruf von öffentlichen Methoden verändert oder ausgelesen werden (z. B. set- und get-methoden). Jedes Objekt ist Instanz einer Klasse. In einer Klasse wird durch Instanzvariablen die Struktur und durch Methodendefinitionen das Verhalten ihrer Instanzen festgelegt. Jede Klasse erbt Verhalten und Struktur von einer einzigen Oberklasse. Auch Klassen sind Instanzen Instanzen sogenannter Metaklassen. Objekte kommunizieren ausschließlich durch (Methodenaufrufe) miteinander. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

118 4.2 Instanzen und Variablen Wertzuweisung Instanzen werden in der Regel durch die Nachricht new an die Klasse erzeugt, z. B. 17 MyWatchMorph new. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Um auf die Instanz zugreifen zu können, sollte sie als Wert einer Variablen zugewiesen werden: 18 testuhr := MyWatchMorph new. Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen oder: 19 testuhr MyWatchMorph new. Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen := bzw. ist der Zuweisungsoperator. (lokale) Variablennamen müssen mit einem Kleinbuchstaben beginnen. 17 z. B. im Workspace oder innerhalb einer Methodendefinition 18 Probiert das in einem Workspace aus! (Alt-d) 19 wird als Unterstrich _ eingegeben. Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

119 4.3 new, new: und initialize new ist eine Klassenmethode, die alle Klassen von der Metaklasse Behavior erben: Behavior>>new "Answer a new initialized instance of the receiver (which is a class) with no indexable variables. Fail if the class is indexable." self basicnew initialize Was passiert beim Aufruf der Methode? Die jeweilige Klasse (self), z. B. MyWatchMorph, erhält die Nachricht basicnew. self basicnew ist die neue Instanz, die dadurch entsteht, also z. B. testuhr. Diese Instanz (self basicnew) erhält nun die Nachricht initialize, mit der z. B. die Werte der Instanzvariablen gesetzt werden Das habt ihr bei MyWatchMorph gesehen und selbst verändert. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

120 4.3 new, new: und initialize Bei manchen Objekten etwa Listen oder Zeichenketten muss man bei der Erzeugung die Anzahl ihrer Elemente angeben. Solche Instanzen werden mit new: erzeugt: Behavior>>new: sizerequested "Answer an initialized instance of this class with the number of indexable variables specified by the argument, sizerequested." (self basicnew: sizerequested) initialize Beispielsweise entsteht mit testwort := String new: 10. eine zehn Zeichen lange Zeichenkette testwort testwort besteht erst einmal nur aus zehn Platzhaltern. testwort at:1 put:$s setzt z. B. das erste Zeichen auf S. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

121 4.4 an Instanzen Instanzen können empfangen. Es gibt drei Arten von. Unäre Nachricht (ohne Argument) empfaenger methodenname. testuhr openinhand. Time now. Date today. 5 squared. 22 Die Bspe. zu Daten und Zahlen wertet ihr besser mit Alt-p aus (print it) 22 Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

122 4.4 an Instanzen Schlüsselwortnachricht (mit Argument) empfaenger mwort1: wert1 mwort2: wert2. testuhr farbwechsel: false. testuhr x: 100 y:130. testuhr setcolor: Color yellow borderwidth: 10 bordercolor: Color blue. 5 raisedto: 3. Beachtet die Doppelpunkte! Methodennamen können aus beliebig vielen Teilwörtern bestehen. Am Ende jeder Nachricht steht ein Punkt. 23 Natürlich sind yellow und blue auch nur (unäre) an Instanzen der Klasse Color. 23 Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

123 4.4 an Instanzen Binäre Nachricht (zwei Objekte) empfaenger binärenachricht parameterobjekt. Binäre haben die Gestalt von arithmetischen Operatoren. Arithmetik: + - * / // \\ 15+4 "Addition" 15-4 "Subtraktion" 15*4 "Produkt" 15/4 "Division" 15//4 "Division (ganzzahlig)" 15\\4 "Divisionsrest" 24 Die Bspe. zu binären wertet ihr am besten mit Alt-p aus (print it) 24 Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

124 4.4 an Instanzen Binäre Nachricht (zwei Objekte) empfaenger binärenachricht parameterobjekt. Binäre haben die Gestalt von arithmetischen Operatoren. Arithmetik: + - * / // \\ 15+4 "Addition" 15-4 "Subtraktion" 15*4 "Produkt" 15/4 "Division" 15//4 "Division (ganzzahlig)" 15\\4 "Divisionsrest" 24 Die Bspe. zu binären wertet ihr am besten mit Alt-p aus (print it) 24 Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

125 4.4 an Instanzen Vergleich: < <= > >= = ~= == ~~ Vergleichsoperatoren liefern als Ergebnisse die booleschen Werte true oder false. Erzeugt im Workspace erst einmal zwei Variablen mit der gleichen Zeichenkette als Wert (Alt-d): a := Squeak. b := Squeak. Vergleich von Werten 15 < 4 "kleiner als" 15 <= 4 "kleiner oder gleich" 15 > 4 "groesser als" 15 >= 4 "groesser oder gleich" 15 = 4 "gleich" a = b a = Scratch 15 ~= 4 "nicht gleich" Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

126 4.4 an Instanzen Vergleich: < <= > >= = ~= == ~~ a := Squeak. b := Squeak. Vergleich von Identitäten 15 == 4 "identisch gleich - " 15 == 15 " gleiches Objekt" Squeak == Squeak a == b "!!!" 15 ~~ 4 "nicht das gleiche Objekt" 15 ~~ 15 a ~~ b Überrascht? Auch Variablen sind eigenständige Objekte! Zunächst werdet ihr aber vor allem den Vergleich von Werten benötigen. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

127 4.4 an Instanzen Logik: & true & true "logisches Und (AND)" true & false false & true false & false true true "logisches Oder (OR)" true false false true false false Wie in der Mathematik üblich, ist ein Oder stets ein Oder auch. -> Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Haus, halt "Konkatenation (Aneinanderhaengen)" 100@200 "Ein Punkt mit x- und y-koordinate" 25 Erforscht diese Beispiele: Auswählen und Alt-i 26 -> Assoziation, vielleicht später... Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

128 4.5 Priorität/Rangfolge von Priorität von Abarbeitung von links nach rechts, aber Unär vor Binär vor Schlüsselwort Änderung der Reihenfolge durch Klammern () Transcript show: Haus, halt. Transcript cr. "Neue Zeile im Transcript" Transcript show: 16 sqrt. Transcript show: 16 sqrt negated. Transcript show: Transcript show: squared. Transcript show: * 2. "!" Transcript show: 16 + (3 * 2). Transcript show: squared * 2. Transcript show: 4 raisedto: 9. "!!!" Transcript show: (4 raisedto: 9). Transcript show: (4 raisedto: 9-7). Transcript show: (4 sqrt raisedto: 9). Transcript show: (4 raisedto: 9 sqrt). Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

129 4.6 Befehlssequenzen und Blöcke Eine Abfolge mehrerer wird als Sequenz bezeichnet. Betrachtet z. B. die Initialisierungsmethode der Klasse WatchMorph: WatchMorph>>initialize super initialize. self handscolor: Color red. self centercolor: Color gray. romannumerals := false. antialias := false. fontname := NewYork. self extent: 130. self start Die innerhalb einer Sequenz werden durch einen Punkt voneinander getrennt. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

130 4.6 Befehlssequenzen und Blöcke Flussdiagramm Start initialisiere wie Oberklasse setze Zeigerfarbe rot setze Zentrumsfarbe grau schalte römische Ziffern aus schalte Kantenglättung aus setze Schriftart New York setze Abmessungen auf 130x130 starte Ende Struktogramm WatchMorph»initialize initialisiere wie Oberklasse setze Zeigerfarbe rot setze Zentrumsfarbe grau schalte römische Ziffern aus schalte Kantenglättung aus setze Schriftart New York setze Abmessungen auf 130x130 starte Struktogramme ermöglichen eine tabellarische Darstellung von Algorithmen oder Abläufen. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

131 4.6 Befehlssequenzen und Blöcke Einem einzigen Empfänger können auch mehrere zusammen geschickt werden. Trennung der durch einen Strichpunkt: statt Transcript show: Erste Nachricht. Transcript cr. "Zeilenumbruch" Transcript show: Dritte Nachricht nun Transcript show: Erste Nachricht ; cr; show: Dritte Nachricht oder Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Existenztest Transcript show: Erste Nachricht ; cr; show: Dritte Nachricht Bedingte Wiederholung Übungen Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

132 4.6 Befehlssequenzen und Blöcke Durch eckige Klammern [ ] lässt sich eine Befehlssequenz zu einem Block zusammenfassen: einblock := [Transcript cr; show: ein Befehlsblock. MyWatchMorph new openinworld]. Blöcke sind Instanzen der Klasse BlockClosure und können daher empfangen, z. B. BlockClosure»value, um ihren Inhalt ausführen zu lassen: einblock value. Blöcke kennen Blockvariablen. rechenblock := [ :b1 :b2 b1 + (2 * b2)]. Diese werden zu Blockbeginn vor einem mit vorangestelltem Doppelpunkt : deklariert und können von außen angesprochen werden: Transcript show: (rechenblock value:5 value:4). Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

133 4.7 Variablen Wie im Abschnitt zur Wertzuweisung gezeigt, spielen Variablen eine zentrale Rolle beim Zugriff auf Objekte, um diesen senden zu können. Jede Variable referenziert (verweist auf) das Objekt, das ihr als Wert zugewiesen wurde, etwa in dem Wertzuweisungsbeispiel die Variable testuhr auf eine bestimmte Instanz der Klasse MyWatchMorph. Je nachdem, welche Objekte direkt (also ohne den Umweg über set/get-methoden) auf eine Variable zugreifen dürfen, unterscheidet man in der Objektorientierung zwischen privaten und öffentlichen Variablen. Dieser Unterschied spiegelt sich in Smalltalk im Variablennamen wider. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

134 4.7 Variablen Bislang sind euch private Variablen begegnet als Blockvariablen innerhalb eines Anweisungsblocks: [ :b1 :b2 b1 + (2 * b2) ] value:5 value:4. temporäre Variablen innerhalb einer Methode: MyWatchMorph>>invertiereFarben hfarbe hfarbe := self color. self handscolor: hfarbe. Instanzvariablen einer Klasse: WatchMorph subclass: #MyWatchMorph instancevariablenames: farbwechsel classvariablenames: Parameter einer Methode: MyWatchMorph>>farbwechsel: boolwert farbwechsel := boolwert Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

135 4.7 Variablen Private Variablen sind nur innerhalb ihres Kontextes bekannt: Blockvariablen nur innerhalb des Blocks temporäre Variablen und Parameter nur innerhalb der Methode Instanzvariablen nur für die jeweilige Instanz einer Klasse, also auch in all ihren Methoden. Die Namen privater Variablen müssen mit einem Kleinbuchstaben beginnen! Innerhalb ihres Kontextes kann man auf private Variablen direkt zugreifen ohne den Umweg über Set- und Get-Methoden. hfarbe hfarbe := self color. self handscolor: hfarbe. "ohne Set" "ohne Get" Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

136 4.7 Variablen Dem gegenüber stehen nichtprivate Variablen: Sie sind mehreren Objekten zugänglich. Ihre Namen beginnen mit einem Großbuchstaben. Beispiele für nichtprivate Variablen: globale Variablen sind allen Instanzen aller Klassen bekannt und können überall verwendet werden. Ein Beispiel ist die globale Variable Transcript. Poolvariablen werden in pooldictionaries verwaltet und sind einer bestimmten Teilmenge von Klassen zugänglich. Klassenvariablen sind allen Instanzen einer Klasse und deren Unterklassen zugänglich. WatchMorph subclass: #MyWatchMorph instancevariablenames: farbwechsel,zeitzone classvariablenames: Zeitzonen Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

137 4.7 Variablen Beispielsweise könntet ihr den Uhren der Klasse MyWatchMorph noch beibringen wollen, die Zeit verschiedener Zeitzonen anzuzeigen. Dann müsste jede Instanz dieser Klasse in einer ihr eigenen Instanzvariable zeitzone ihre eigene, gerade aktuelle Zeitzone verwalten. Die Liste der möglichen Zeitzonen wäre aber für alle Uhren ein und dieselbe. Um diese Liste auch tatsächlich nur ein einziges Mal für alle Instanzen speichern und verwalten zu müssen, bietet sich die Verwendung einer Klassenvariable Zeitzonen an, auf die dann alle Uhren zugreifen können: WatchMorph subclass: #MyWatchMorph instancevariablenames: farbwechsel,zeitzone classvariablenames: Zeitzonen Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

138 4.8 Literale Literale sind Objekte, auf die (auch ohne Referenzierung durch Variablen) durch einfaches Hinschreiben Bezug genommen werden kann. Smalltalk kennt fünf Arten von Literalen: Zahl (Number) Zeichen (Character) Zeichenkette (String) Symbol Feld (Array) Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

139 4.8 Literale In Smalltalk gibt es verschiedene Zahlenklassen: Integer Ganze Zahlen, z. B Unterklassen sind SmallInteger sehr effizient zu rechnen, aber nicht beliebig groß oder klein LargePositiveInteger beliebig groß LargeNegativeInteger beliebig klein Je nach Größe der Zahl wählt Smalltalk die Klasse automatisch. Übung 1. Sucht die Klassen im Browser und findet heraus, wie groß SmallInteger-Zahlen höchstens sein können. 2. Lasst euch von einem Workspace aus im Transcript ganze Zahlen eurer Wahl als römische Zahlen, im 16er-System (als Hex-Zahl) oder z. B. im Vierersystem ausgeben. 3. Was berechnen die Methoden factorial, gcd:, lcm:? Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

140 4.8 Literale Einzelzeichen gehören der Klasse Character an. Druckbare Einzelzeichen werden mit vorangestelltem Dollarzeichen dargestellt, z. B. $a, $R, $, $3, $$. Für nichtdruckbare Zeichen stehen an die Klasse 27 Character zur Verfügung, z. B. Leerzeichen Character space Tabulator Character tab Zeilenumbruch Character cr Rückwärtslöschen Character backspace Eurozeichen Character euro 28 Besonders wichtig ist das Protokoll testing. Erkundet die Wirkung der zugehörigen in einem Workspace (Alt-p). 27 Klassenmethoden werden im Browser angezeigt, wenn ihr in der Klassenspalte statt instance das Feld class aktiviert. 28 Eine Liste weiterer Zeichen findet ihr im Klassenprotokoll accessing untypeable characters, auch eine Erklärung, warum das Eurozeichen evtl. nicht funktioniert. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

141 4.8 Literale Zeichenketten (Strings) werden in Smalltalk durch einfache Hochkommata begrenzt, z. B. Das ist ein String. Smalltalk rocks :-) (Das ist keine Zahl!) u (Das ist etwas Anderes als $u!) Soll der String ein Hochkomma ( ) als Zeichen enthalten, muss dieses verdoppelt werden: Wie geht s? wird zu Wie geht s? Vorsicht, doppelte Hochkommata (") kennzeichnen in Smalltalk Kommentare: "Das ist ein Kommentar im Quelltext." Strings beherrschen zahlreiche nützliche Methoden, die sie teilweise auch von der Oberklasse SequenceableCollection erben. Besonders interressant sind die Protokolle comparing, converting und testing. Probiert die eine oder andere aus! Später mehr dazu. Eine Übersicht bietet der Terse Guide to Squeak. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

142 4.8 Literale Symbole sind besondere Zeichenketten, also eine Unterklasse von String. Symbole werden durch ein vorangestelltes Doppelkreuz (#) gekennzeichnet, z. B. #Symbol #Feb13 # Ich bin ein Symbol! Enthält der Symbolbezeichner auch andere Zeichen als Buchstaben oder Ziffern, sind die einfachen Hochkommata notwendig. Anders als gewöhnliche Strings gibt es ein Symbol immer nur ein einziges Mal im ganzen System. Symbole werden z. B. als Namen von Klassen oder Methoden verwendet. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

143 4.8 Literale Arrays (deutsch oft als Felder bezeichnet) sind Listen mit einer festen Anzahl von Elementen. Ein Array wird durch ein vorangestelltes Doppelkreuz und runde Klammern gekennzeichnet und kann beliebige Elemente getrennt durch Leerzeichen enthalten, z. B. #( ) #( squeak $s #Feb13) #($a $b #($s smalltalk ) 4) Ein Array kann also auch andere Arrays als Elemente enthalten. Bei einem Spiel wie dem Schlangenrennen könnte man z. B. das Labyrinth als Array von Arrays implementieren, wenn jeder Rasterzeile ein Array von Labyrinthfeldern und dem ganzen Labyrinth ein Array dieser Zeilen zugeordnet wird. Einen Überblick über die wichtigsten Methoden von Arrays findet sich wieder im Terse Guide to Squeak. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

144 4.9 Verzweigung bedingte Anweisungen Unter einer Verzweigung oder bedingten Anweisung versteht man ein Konstrukt der Form einseitige Verzweigung wenn Bedingung, dann Aktion oder zweiseitige Verzweigung wenn Bedingung, dann Aktion, sonst Alternative Flussdiagramm WAHR Aktion Bedingung FALSCH Alternative Struktogramm Bedingung WAHR FALSCH Aktion Alternative Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

145 4.9 Verzweigung bedingte Anweisungen Eine Bedingung ist ein boolescher Ausdruck, d. h. sie liefert den Wert true oder false. Ein Beispiel für Bedingungen sind Vergleiche, evtl. verknüpft durch logische Operatoren: Die Zahl x liegt zwischen 5 und 13. (5<=x) & (x<=13) Die Zahl y ist ein Vielfaches von 5. y\\5 = 0 Die Zahl z ist ungerade oder größer als 100. (z\\2 ~= 0) (z > 100) Das Wort name ist weder Hans noch Elke. (name ~= Hans ) & (name ~= Elke ) oder 29 ((name = Hans ) (name = Elke )) not 29 Die Nachricht not kehrt einen booleschen Wert um: true not ergibt false und umgekehrt. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

146 4.9 Verzweigung bedingte Anweisungen Manche Klassen (z. B. alle Literale) bieten in den Protokollen comparing und testing weitere Methoden, die als Bedingungen taugen, z. B. Die ganze Zahl x ist durch die ganze Zahl y teilbar. x isdivisibleby: y Die Zahl z ist gerade. z even Das Wort name beginnt mit Small. name beginswith: Small Das Zeichen zeichen ist eine Ziffer. zeichen isdigit Das vierte Zeichen im Wort name ist kein Buchstabe (name at: 4) isletter not Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

147 4.9 Verzweigung bedingte Anweisungen Testet die vorangegangenen Beispiele in einem Workspace, indem ihr dort den auftretenden Variablen erst einen typischen Wert zuordnet, dann die Bedingung schreibt, alles auswählt und dann mit Alt-p anzeigen lasst, z. B. name := Heidschnucke. name beginswith: Small Entwickelt folgende Bedingungen und testet sie mit guten und schlechten Werten: 30 Eine Zahl ist durch 7 teilbar, aber nicht positiv. Eine Zahl liegt zwischen 0 und 4 oder -7 und -3. Bis auf Groß- und Kleinschreibung lautet ein Wort smalltalk. Ein Wort enthält einen Bindestrich. Ein Wort hat höchstens 18 Zeichen, enthält kein Leerzeichen und beginnt mit einem Kleinbuchstaben. 30 Hinweis: Manchmal findet sich die passende Methode in einer Oberklasse! Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

148 4.9 Verzweigung bedingte Anweisungen Beispiel: römische Ziffern für (My)WatchMorph Wenn im Menü (rotes Halo) die römischen Zahlen aktivert sind, dann zeigt die Uhr solche an, sonst arabische. Wie ist das gemacht? Sucht im Browser die Attribute und Methoden der Klasse WatchMorph, die mit den römischen Zahlen zu tun haben (Tipp: Sender)! Wie wird die bedingte Anweisung in Smalltalk umgesetzt? Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

149 4.9 Verzweigung bedingte Anweisungen WatchMorph>>initialize "initialize the state of the receiver"... romannumerals := false.... WatchMorph>>addCustomMenuItems: amenu hand: ahandmorph "Add morph-specific items to the given menu which was invoked by the given hand."... amenu addupdating: #romannumeralstring action: #toggleroman.... WatchMorph>>toggleRoman romannumerals := romannumerals not. self createlabels WatchMorph>>romanNumeralString "Answer a string governing the roman-numerals checkbox" (romannumerals iftrue: [ <on> ] iffalse: [ <off> ]), roman numerals translated WatchMorph>>createLabels numeral font h r self removeallmorphs. font := StrikeFont familyname: fontname size: (h := self height min: self width)//8. r := (1.4 * font height / h). 1 to: 12 do: [:hour numeral := romannumerals iftrue: [hour printstringroman] iffalse: [hour asstring]. self addmorphback: ((StringMorph contents: numeral font: font emphasis: 1) center: (self radius: r hourangle: hour)) lock] Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

150 4.9 Verzweigung bedingte Anweisungen WatchMorph»initialize 1 WatchMorph>>initialize 2 "initialize the state of the receiver" romannumerals := false Zeile 4: romannumerals ist eine Variable mit einem booleschen Wert (false), die sich als Bedingung eignet: Sie kann wahr (true) oder falsch (false) sein. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

151 4.9 Verzweigung bedingte Anweisungen WatchMorph»addCustomMenuItems:hand: 1 WatchMorph>>addCustomMenuItems: amenu hand: ahandmorph 2 "Add morph-specific items to the given menu 3 which was invoked by the given hand." amenu addupdating: #romannumeralstring action: #toggleroman Zeile 1: ahandmorph ist ein Mauszeiger. Zeile 5: Hier wird der entsprechende Eintrag im Menü beschrieben: Bei einem Mausklick wird als Aktion die Methode toggleroman aufgerufen und zur Aktualisierung des Menüeintrags (addupdating) die Methode romannumeralstring. Beachtet, wie hier die Namen der beiden Methoden als Symbole übergeben werden! Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

152 4.9 Verzweigung bedingte Anweisungen WatchMorph»toggleRoman 1 WatchMorph>>toggleRoman 2 romannumerals := romannumerals not. 3 self createlabels Zeile 2: Hier passieren zwei Dinge: Mit romannumerals not wird der Wert der Variable in sein logisches Gegenteil verkehrt (wahr statt falsch und umgekehrt). Dann wird der neue Wert mit der Wertzuweisung in derselben Variablen abgespeichert. Zeile 3: Abschließend wird die Nachricht createlabels an die Uhr selbst (self) geschickt, damit diese ihre Beschriftung (die Labels ) neu zeichnet. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

153 4.9 Verzweigung bedingte Anweisungen WatchMorph»romanNumeralString 1 WatchMorph>>romanNumeralString 2 "Answer a string governing the roman-numerals checkbox" 3 (romannumerals 4 iftrue: [ <on> ] 5 iffalse: [ <off> ]) 6, roman numerals translated Zeile 3-5: eine zweiseitige Verzweigung: romannumerals ist die Bedingung. Ist sie wahr (iftrue:), wird der nachfolgende Anweisungsblock [...] ausgeführt, ist sie falsch (iffalse:), der Alternativblock [...]. Einer der beiden Zweige kann auch fehlen. Die Reihenfolge der beiden Zweige ist gleichgültig. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

154 4.9 Verzweigung bedingte Anweisungen Bedingte Anweisungen in Smalltalk Bedingung iftrue: [Anweisungsblock] Bedingung iffalse: [Anweisungsblock] Bedingung iftrue: [Anweisungsblock] iffalse: [Alternativblock] Bedingung iffalse: [Anweisungsblock] iftrue: [Alternativblock] Ein Beispiel 31 x := 100 atrandom. (x > 50) iftrue: [Transcript cr; show: x asstring, : gewonnen! ] iffalse: [Transcript cr; show: x asstring, : leider verloren ] 31 Probiert es in einem Workspace aus! Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

155 4.9 Verzweigung bedingte Anweisungen WatchMorph»romanNumeralString 1 WatchMorph>>romanNumeralString 2 "Answer a string governing the roman-numerals checkbox" 3 (romannumerals 4 iftrue: [ <on> ] 5 iffalse: [ <off> ]) 6, roman numerals translated etwas genauer betrachtet Zeile 3: Das Skript beginnt mit einer Rückgabeanweisung ( ): Der nachfolgende Ausdruck wird ausgewertet und sein Wert als Ergebnis an den Aufrufer zurückgegeben. Zeile 4 5: Die beiden Anweisungsblöcke liefern jeweils eine Zeichenkette ( <on> bzw. <off> ) als Wert Diese Zeichenketten werden (wegen der spitzen Klammern) im Menü als (un)ausgefüllte Checkbox dargestellt. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

156 4.9 Verzweigung bedingte Anweisungen WatchMorph»romanNumeralString 1 WatchMorph>>romanNumeralString 2 "Answer a string governing the roman-numerals checkbox" 3 (romannumerals 4 iftrue: [ <on> ] 5 iffalse: [ <off> ]) 6, roman numerals translated Zeile 6: Drei Dinge: Auch hier wird eine Zeichenkette als Wert erzeugt ( roman numerals ). Mit der Nachricht translated wird sie ggf. in verschiedene Sprachen übersetzt (z. B. Deutsch) Was bedeutet das Komma? Das Komma ist die binäre Nachricht Konkatenation an das Ergebnis der vorangegangenen Verzweigung (daher die runden Klammern). Dadurch werden die Zeichenketten <on> (bzw. <off> ) und die Übersetzung von roman numerals zu einer einzigen Kette aneinandergehängt. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

157 4.9 Verzweigung bedingte Anweisungen WatchMorph»createLabels 1 WatchMorph>>createLabels 2 numeral font h r 3 self removeallmorphs. 4 font := StrikeFont familyname: fontname size: (h := self height min: self width)//8. 5 r := (1.4 * font height / h). 6 1 to: 12 do: 7 [:hour 8 numeral := romannumerals 9 iftrue: [hour printstringroman] 10 iffalse: [hour asstring]. 11 self addmorphback: ((StringMorph contents: numeral font: font emphasis: 1) 12 center: (self radius: r hourangle: hour)) lock] Was passiert hier im wesentlichen? Zeile 3: Als erstes werden alle Submorphe der Uhr entfernt. Erforscht so eine Uhr mit dem Inspector! Ihr seht, die Submorphe der Uhr sind genau die Zahlen auf dem Ziffernblatt. Zeile 4 5: Schriftart, -größe und Radius der Bezifferung werden bestimmt. Zeile 8 10: Verzweigung: Wenn eine neue Zahl römisch sein soll, wird sie so Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

158 4.9 Verzweigung bedingte Anweisungen WatchMorph»createLabels 1 WatchMorph>>createLabels 2 numeral font h r 3 self removeallmorphs. 4 font := StrikeFont familyname: fontname size: (h := self height min: self width)//8. 5 r := (1.4 * font height / h). 6 1 to: 12 do: 7 [:hour 8 numeral := romannumerals 9 iftrue: [hour printstringroman] 10 iffalse: [hour asstring]. 11 self addmorphback: ((StringMorph contents: numeral font: font emphasis: 1) 12 center: (self radius: r hourangle: hour)) lock] Wie wird das gemacht? Zeile 2: Vier temporäre Hilfsvariablen werden deklariert. Zeile 4 5: Schriftart, -größe und Radius der Bezifferung werden in den Hilfsvariablen font, h und r zwischengespeichert. Zeile 8 10: Die neue Darstellung der Zahlen wird in der Hilfsvariablen numeral zwischengespeichert. Zeile 4: Hier passiert viel: font := StrikeFont familyname: fontname size: (h := self height min: self width)//8. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

159 4.9 Verzweigung bedingte Anweisungen Übung 1 Bringt euren Uhren der Klasse MyWatchMorph bei, alle z. B. 5 Minuten neue Farben für Zeiger und Hintergrund zu benutzen. Vielleicht ist es hilfreich, die Methode WatchMorph»drawOn: zu lesen. relevante Klassen: Time und Color Anregungen zur Farbverwaltung: Lest die Klassendokumentation von Color! Die relevanten Methoden zur Erzeugung einer Farbe sind Klassenmethoden. Wenn ihr im Browser das Feld class aktiviert, seht ihr bei den Methoden auch alle bekannten Farbnamen. Man könnte z. B. die gewünschten Farben oder Farbkombinationen in einem Array verwalten. Lasst die Uhr ihre Farben doch zufällig (Integer»atRandom) aus dem Array wählen oder mit Hilfe von RGB-Werten Zufallsfarben erzeugen. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

160 4.9 Verzweigung bedingte Anweisungen Übung 2 Programmiert ein kleines Quiz, in dem der Rechner der Reihe nach ein paar Fragen stellt und bei richtigen Antworten Punkte vergibt. Lasst das Programm den aktuellen Punktestand von einem Zähler anzeigen und z. B. durch ein Rechteck veranschaulichen, das seine Länge (und bei bestimmten Punktegrenzen vielleicht auch seine Farbe) ändert. Modelliert solch ein Quiz zunächst mit einem UML-Diagramm. Welche Objekte benötigt das Quiz und welchen Klassen gehören sie an? Vergleicht euer Ergebnis mit dem Vorschlag auf der nächsten Seite. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

161 4.9 Verzweigung bedingte Anweisungen UML-Modell: Punktezaehler +punktestand +aktualisieredich(punkte) TextMorph +text +newcontents(string) +fragenkatalog +punktezaehler +initialize() Object MiniQuiz +stellefragen(fragenkatalog) +bewerte(antwort,loesung,maxpunkte): punkte +gibendstandaus() Rectangle +color +width +color(farbe) +width(breite) Dialogfenster Fragenkatalog FillInTheBlankMorph +class request(frage) +at(index) Array +do(anweisungsblock) Eintrag +frage +loesung +maxpunkte Setzt das Modell mit Squeak um. Auf den nächsten Seiten folgen ein paar nützliche Bemerkungen. Es kann sinnvoll sein, für ein derartiges Projekt im Browser eine eigene Kategorie anzulegen. * Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

162 4.9 Verzweigung bedingte Anweisungen Generalisierung: Dialogfenster und Fragenkatalog haben erst einmal keine besonderen Eigenschaften. Daher sind hier nicht unbedingt neue Unterklassen nötig, allerdings vorteilhaft, wenn das Projekt später verbessert werden soll. Aggregation: Bei der Enthält-Beziehung ist es wichtig, dass das Ganze seine Teile kennt oder auch umgekehrt. So sollte z. B. das MiniQuiz wissen, welchen Fragenkatalog es abarbeitet und welcher Punktezähler seinen Punktestand protokolliert. Evtl. sollte auch der Punktezähler wissen, für welches Quiz er zählt. Das erreicht ihr durch Instanzvariablen, also z. B. Miniquiz»fragenkatalog und Miniquiz»punktezaehler bzw. Punktezaehler»miniquiz. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

163 4.9 Verzweigung bedingte Anweisungen MiniQuiz: Struktogramme einiger Methoden MiniQuiz»initialize initialisiere wie Oberklasse lege den fragenkatalog fest erzeuge einen neuen punktezaehler setze den Punktestand auf seinen Startwert stelle die Fragen aus dem fragenkatalog MiniQuiz»gibEndstandAus lass dir von deinem punktezaehler den punktestand geben gib je nach Punktestand den punktestand und einen passenden Kommentar in einem Dialogfenster aus Untermethode Rückgabewert MiniQuiz»stelleFragenAus:katalog wiederhole für jeden eintrag im katalog stelle die frage in einem Dialogfenster bewerte die antwort lass deinen punktezaehler sich aktualisieren. gib den Endstand aus MiniQuiz»bewerte:antwort zu:loesung mit:maxpunkte antwort=loesung WAHR FALSCH punkte 0 Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

164 4.9 Verzweigung bedingte Anweisungen FillInTheBlankMorph: ein Dialogfenster Üblicherweise wird hier die Klassenmethode FillInTheBlankMorph class»request:initialanswer: oder einfacher FillInTheBlankMorph class»request: benutzt. ergebnis ergebnis := FillInTheBlankMorph request: Was denkst du? initialanswer: Schreib es hierher!. Transcript cr; show: ergebnis. ergebnis ergebnis := FillInTheBlankMorph request: Was denkst du?. Transcript cr; show: ergebnis. Probiert beides in einem Workspace aus! Lest die Quelltexte und die Varianten dieser Methoden, um z. B. das Aussehen des Fensters zu beeinflussen. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

165 4.9 Verzweigung bedingte Anweisungen Dialogfenster: z. B. ein FillInTheBlankMorph Leider wird bei Verwendung von FillInTheBlankMorph für jeden Dialog ein neues Fenster erzeugt. Um das zu vermeiden, könntet ihr eine Unterklasse von FillInTheBlankMorph (oder auch direkt von RectangleMorph) anlegen, die mit Dialogfenster new ein vollständiges Dialogfenster erzeugt, 35 das nach Drücken des ok -Knopfes offen bleibt und die nächste Frage anzeigt, sich bei Betätigung des cancel -Knopfes schließt Probiert einmal FillInTheBlankMorph new openinhand. 36 Lesenswert sind hierzu die Klassenmethode class»request: initialanswer: centerat: inworld: oncancelreturn: acceptoncr: answerextent: sowie die darin aufgerufenen Instanzmethoden setquery: initialanswer: answerextent: acceptoncr: und getuserresponse. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

166 4.9 Verzweigung bedingte Anweisungen In WatchMorph»drawOn: tritt noch eine weitere gebräuchliche Form der Verzweigung auf: 1 WatchMorph>>drawOn: acanvas 2 "Draw the watch on the given canvas" 3 4 phour pmin psec time centercolor 5 time := Time now. 6 "..." 7 centercolor := ccolor 8 ifnil: 9 [Color transparent] 10 ifnotnil: 11 [time hours < iftrue: [ccolor muchlighter] 13 iffalse: [ccolor]]. 14 "..." In Zeile 7 13 wird überprüft, ob die Instanzvariable ccolor überhaupt einen Wert besitzt. Nur wenn das der Fall ist (ccolor ifnotnil:), wird darauf zugegriffen. Der temporären Variablen centercolor wird dann das Ergebnis des jeweiligen Anweisungsblockes als Wert zugewiesen. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

167 4.10 Bedingte Wiederholung Ein wesentliches Konstrukt in Algorithmen sind bedingte Wiederholungen, in Programmiersprachen oft als while-schleifen bezeichnet. Man unterscheidet zwei Arten: Anfangsbedingung: solange (als) solange (als) Bedingung (noch nicht) erfüllt ist, agiere Solange du die dritte Kreuzung noch nicht erreicht hast, gehe geradeaus. Endbedingung: solange bis agiere so lange, bis Bedingung (nicht mehr) erfüllt ist Gehe so lange geradeaus, bis du an die dritte Kreuzung kommst. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

168 4.10 Bedingte Wiederholung Anfangsbedingung: erst sehen, dann gehen Flussdiagramm WAHR biege links ab dreh dich nach Norden dritte Kreuzung erreicht FALSCH gehe geradeaus Struktogramm dreh dich nach Norden dritte Kreuzung nicht erreicht gehe geradeaus biege links ab Schleifen mit Anfangsbedingung in Smalltalk [Bedingungsblock] whiletrue: [Anweisungsblock] [Bedingungsblock] whilefalse: [Anweisungsblock] Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

169 4.10 Bedingte Wiederholung Endbedingung: erst gehen, dann sehen Flussdiagramm WAHR biege links ab dreh dich nach Norden gehe geradeaus dritte Kreuzung erreicht FALSCH Struktogramm Schleifen mit Endbedingung in Smalltalk dreh dich nach Norden gehe geradeaus dritte Kreuzung nicht erreicht biege links ab [Anweisungsblock] dowhiletrue: [Bedingungsblock] [Anweisungsblock] dowhilefalse: [Bedingungsblock] Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

170 4.10 Bedingte Wiederholung Übung Legt in einer geeigneten Kategorie (z. B. euren Versuchsklassen) eine Unterklasse (z. B. Massenpunkt) von EllipseMorph (oder sonst einem Morph) an. Massenpunkte sollten eine Masse besitzen. Es dürfte auch sinnvoll sein, dass sie ihre Momentangeschwindigkeit und Beschleunigung kennen vermutlich aufgeschlüsselt nach horizontaler und vertikaler Komponente. Für ihre Position erben sie die entsprechenden Instanzvariablen ohnehin von ihrer Oberklasse. Grundsätzlich wäre es vernünftig, wenn sie als Klassenvariable (warum?) auch die Gravitationskonstante zur Verfügung hätten. Bringt den Instanzen dieser Klasse bei, sich mit Hilfe der Methode kleiner Schritte physikalisch richtig über den Bildschirm zu bewegen. Mögliche Ideen: Freier Fall, senkrechter Wurf, schiefer Wurf, harmonische Schwingung, Planetenbewegung, elastischer Stoß,... Wie könnte man die Bewegungen starten bzw. stoppen? Mit Hilfe von steptime lässt sich das Tempo der Bewegung steuern. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

171 4.11 Zählschleifen immer das gleiche Wie zeichnet man ein gleichseitiges Dreieck, ein Quadrat, ein reguläres Vieleck? Immer wieder das gleiche so oft wie die Zahl der Seiten: Zeichne eine Seite. Drehe den Stift um den richtigen Winkel. z. B. für ein Quadrat: Zeichne ein Quadrat denke daran, am Ende wieder aufzuräumen nimm eine leere Zeichenfläche nimm einen Stift wähle die Stiftdicke wähle die Stiftfarbe gehe zur ersten Ecke drehe den Stift in die richtige Richtung setze den Stift auf die Zeichenfläche wähle eine Seitenlänge wiederhole 4-mal gehe die Seitenlänge vor drehe den Stift um 90 hebe den Stift wieder auf Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

172 4.11 Zählschleifen immer das gleiche Umsetzung in Smalltalk (z. B. in einem workspace): 1 stift seite 2 Display restoreafter: [ Display fillwhite. 3 stift := Pen new. 4 stift defaultnib: 5. 5 stift color: 7. 6 stift place: 250@ stift north. 8 stift down. 9 seite := timesrepeat: [ stift go: seite. 11 stift turn: 90.]. 12 stift up.] Zeichne ein Quadrat denke daran, am Ende wieder aufzuräumen nimm eine leere Zeichenfläche nimm einen Stift wähle die Stiftdicke wähle die Stiftfarbe gehe zur ersten Ecke drehe den Stift in die richtige Richtung setze den Stift auf die Zeichenfläche wähle eine Seitenlänge wiederhole 4-mal gehe die Seitenlänge vor drehe den Stift um 90 hebe den Stift wieder auf Zeile 2: Wie Transcript ist auch Display eine globale Variable. Die Nachricht Display restoreafter: ablock hat zur Folge, dass das Programm nach Abarbeitung des Blocks auf einen Mausklick wartet und dann den Bildschirm wiederherstellt. Zeile 3: Instanzen der Klasse Pen sind (unsichtbare) Stifte, die auf dem Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

173 4.11 Zählschleifen immer das gleiche Zählschleifen in Smalltalk timesrepeat: Integer timesrepeat: [Anweisungsblock] Integer»timesRepeat: ablock ist eigentlich eine while-schleife: Integer>>timesRepeat: ablock "Evaluate the argument, ablock, the number of times represented by the receiver." count count := 1. [count <= self] whiletrue: [ablock value. count := count + 1] Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

174 4.12 Intervalldurchlauf fast das gleiche Eines der Probleme, die C. F. Gauß als kleiner Junge gelöst hat, war es, gekonnt alle ganzen Zahlen von 1 bis 100 zusammenzuzählen. Vermutlich kennt ihr seinen Trick. Für einen Rechner ist es aber auch ein leichtes, diese Aufgabe zu Fuß zu lösen: Addiere zur gerade aktuellen Zwischensumme (am Anfang ist sie Null) die jeweils nächste Zahl und merke dir das Ergebnis. Wiederhole das für jede Zahl von eins bis hundert. Zum Merken der Zwischensumme wird eine Variable summe benötigt. Die zu bearbeitende Zahl wird in einer Laufvariablen (gern mit i bezeichnet) verwaltet. In vielen Programmiersprachen nennt man das eine for-schleife. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

175 4.12 Intervalldurchlauf fast das gleiche Als Struktogramm: Addiere alle Zahlen von 1 bis 100 summe = 0 wiederhole für jede Zahl i von 1 bis 100 summe = summe + i Gib summe als Ergebnis aus In Smalltalk wird die Laufvariable zu einer Blockvariablen, die nach und nach jeden der Werte annimmt: summe summe := 0. 1 to: 100 do: [ :i summe := summe + i]. Transcript show: summe. 1 to: 100 ist ein Intervall mit Schrittweite eins, do: ein Iterator, den das Intervall als Nachricht empfängt. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

176 4.12 Intervalldurchlauf fast das gleiche Mathematisch spannender ist es, nur die ungeraden Zahlen aufzusummieren, also von der ersten an nur jede zweite. Addiere alle ungeraden Zahlen von 1 bis 100 summe = 0 wiederhole ab der ersten für jede zweite Zahl i von 1 bis 100 In Smalltalk: 37 summe = summe + i Gib summe als Ergebnis aus summe summe := 0. 1 to: 100 by: 2 do: [ :i summe := summe + i]. Transcript show: summe. 37 Erweitert das Skript um einen Eingabedialog, in dem man statt 100 eine beliebige gerade Zahl angeben kann. Probiert kleine Zahlen und findet heraus, wie man das Ergebnis auch direkt aus der eingegeben Zahl berechnen könnte. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

177 4.13 Übungen Turtle-Grafik Übungen MyPen Smalltalk Objekt-Modell Legt eine Unterklasse MyPen von Pen an. Bringt MyPen Methoden dreieck: seite und quadrat: seite sowie neck: seite miteckenzahl: n bei, um reguläre Vielecke mit Seitenlänge seite zu zeichnen. Sorgt dafür, dass der Stift nach dem Zeichnen in die gleiche Richtung zeigt wie zuvor! Lasst ein Objekt der Klasse MyPen Bilder wie diese hier zeichnen (in einem Workspace oder besser noch als eigene Methoden, z. B. zum Protokoll testbilder denkt an Display restoreafter: ): Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

178 4.14 Kollektionen und Iteratoren Wiederholungen treten auch in diesen Beispielen auf: do: Schreibe all deinen Bekannten eine Weihnachtskarte. select: Wer von deinen Bekannten hat im April Geburtstag? collect: Ergänze alle Einträge in deinem Adressbuch um ein Feld für das Datum der letzten Kontaktaufnahme. Das Adressbuch ist eine Sammlung (Kollektion) von Einträgen, den Elementen, über die iteriert wird: do: Mache etwas für jeden Eintrag. select: Wähle alle Einträge aus, die eine bestimmte Bedingung erfüllen. collect: Bearbeite jeden Eintrag und sammle die veränderten Einträge in einer neuen Kollektion. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

179 4.14 Kollektionen und Iteratoren Kollektionen sind ein äußerst mächtiges programmiersprachliches Konzept. 38 Smalltalk kennt eine ganze Reihe von Kollektionen, die alle Unterklassen der abstrakten Klasse Collection sind: ArrayedCollection Array Bitmap String Text SequenceableCollection Symbol Collection Bag Interval LinkedList OrderedCollection SortedCollection Set Dictionary 38 Später mehr dazu; an dieser Stelle soll der kurze Überblick über eine Auswahl der Klassen genügen. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

180 4.14 Kollektionen und Iteratoren Iteratoren für Kollektionen do: Führe für jedes Element den Anweisungsblock aus. meinekollektion do: [ :each Aktionen für each ] select: Wähle die Elemente aus, für die der Bedingungsblock wahr ist. auswahlkollektion := meinekollektion select: [ :each Bedingung an each ] collect: Führe für jedes Element den Anweisungsblock aus und sammle die Ergebnisse in einer neuen Kollektion. neuekollektion := meinekollektion collect: [ :each Aktionen mit each ] 39 Die Iteratoren finden sich im Protokoll enumerating. 40 Die Blockvariable each durchläuft als Werte die Elemente der Kollektion. Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Arithmetik Vergleiche Logik Priorität von Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen Turtle-Grafik Kollektionen und Iteratoren

181 Teil V Smalltalk mit Pharo I Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

182 Anhang Überblick Grundkonzepte Ablaufmodelliierung Smalltalk I die Entwicklungsumgebung Squeak Smalltalk II Grundzüge der Programmiersprache Pharo I Smalltalk-Entwicklung mit Pharo Pharo II Grundzüge von Smalltalk Java I Klassen in BlueJ anlegen Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle Java II JGUIToolbox und weitere Konstrukte Zustandsmodellierung

183 Gliederung Pharo I Smalltalk-Entwicklung mit Pharo Taxifahren Pharo Projekt anlegen Kategorien Projekt speichern Monticello-Pakete Anlegen einer Klasse Klassenkommentar Accessoren Get- und Set-Methoden Wertrückgabe Get-Methode Wertzuweisung Set-Methode Grundgerüst einer Methode Instanzerzeugung im Workspace Inspektoren Objektüberwachung Methodenaufrufe Wichtige Datentypen Konstruktor initialize Überschreiben vererbter Methoden Protokolle Methoden gruppieren Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

184 5.1 Taxifahren Bei den Grundkonzepten kam im Abschnitt 12 zur Datenkapselung ein Taxifahrer mit seiner Schuhgröße vor. Das Modell von dort soll in den folgenden Abschnitten ausgebaut und in der Programmiersprache Java umgesetzt, man sagt auch implementiert werden. Entwirf ein UML-Klassendiagramm zum Taxifahren. Welche Klassen sind beteiligt? Was ist an einem Taxi anders als an einem gewöhnlichen PKW? Wonach richtet sich der Fahrpreis? Entwirf Klassenkarten der beteiligten Klassen. Beachte die Datenkapselung (Abschnitt 12). Vergiss die Schuhgröße nicht. Zum Vergleich findest du auf den beiden folgenden Seiten eine mögliche Lösung. Ergänze dein Modell ggf. entsprechend. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

185 5.1 Taxifahren steuert > Person 1 Taxifahrer fährt_zu > 1 1 Taxi Taxileuchte Fahrgast will_zu > 1 Ort 1 Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern wartet_bei > Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle transportiert > 1 < bestellt 1 Taxameter 1 benutzt > Tarif

186 5.1 Taxifahren Taxifahrer - schuhgröße - geld - taxi - steuere(taxi,ziel) - veränderegeld(betrag) + sageschuhgröße() + fahre(passagier,start,ziel) + gibwechselgeld(betrag,bezahlt) Fahrgast - startort - zielort - geld - istzufrieden + bestelle(taxifahrer) - veränderegeld(betrag) + gibstartort() + gibzielort() + bezahle(betrag) - wechslezufriedenheit() - zahletrinkgeld(betrag) Tarif - tarifname - grundgebühr - km_preis - min_preis + gibtarifname() + gibgrundgebühr() + gibkmpreis() + gibminpreis() Taxameter - tarif - tarifliste - betrag - istan + gibtarif() + setzetarif(tarif) + schaltetarifweiter() + schalteein() + schalteaus() + ermittlebetrag() - erhöhebetrag(betrag) + gibbetrag() Taxileuchte - istan + gibistan() + schalteum() Ort - name - position + gibname() + gibposition() Taxi - nummer - km Pharo I Taxifahren - leuchte Pharo - taxameter Entwicklungsumgebung Weltmenü + gibnummer() Werkzeuge + gibleuchte() + gibtaxameter() + gibkm() Benutzeridentifizierung System-Browser Projekt anlegen Projekt speichern Klasse anlegen - erhöhekm(betrag) Klassenkommentar + fahre() Accessoren Wertrückgabe Wertzuweisung Person Methodenaufbau Instanzerzeugung Inspektoren - name - ort Datentypen Konstruktor + gibname() Überschreiben Protokolle + gibort()

187 5.2 Pharo... eine interaktive Entwicklungsumgebung zum Programmieren in Smalltalk Pharo Pharo-Buch als pdf in verschiedenen Sprachen Pharo the collaboractive book Online-Dokumentation Weitere Bücher (online) Pharo-Videos screencasts Pharo-Mailingliste listinfo/pharo-users Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

188 5.2.1 Pharo Entwicklungsumgebung Der Startbildschirm zeigt ein Willkommensfenster und am unteren Rand die Navigationsleiste. Ein Überblick über Tastaturkürzel findet sich im collaboractive book. Ein Klick in den Hintergrund öffnet das Weltmenü. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

189 5.2.2 Pharo Weltmenü die wichtigsten Programmierwerkzeuge Hilfe und Systeminformationen Save speichert den aktuellen Zustand der gesamten Entwicklungsumgebung, das Pharo-Image alle geöffneten Fenster samt Inhalt, sei er gerade gespeichert oder auch nicht alle gerade existierenden Objekte in ihrem augenblicklichen Zustand Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

190 5.2.3 Pharo Benutzeridentifizierung Wann immer eine Author identification verlangt wird, den eigenen Namen in der gewünschten Form eingeben: Hintergrund dieser Nachfrage ist, dass Pharo auch selbst in Pharo entwickelt wird. Daher wird mitprotokolliert, wer welche Veränderungen am Image vorgenommen hat, falls die Arbeit mehrerer Entwickler zusammenfließt. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

191 5.2.4 Pharo Werkzeuge System-Browser Zugriff auf den Quelltext aller Klassen das Programmierwerkzeug Workspace Aufruf oder interaktives Ausprobieren von Smalltalk-Code Transcript ein Textausgabefenster Monticello-Browser Exportieren/Importieren von Quelltext-Paketen aus dem bzw. in das Image Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

192 5.2.5 Pharo System-Browser oben ein Suchfeld unten ein Editorfenster zum Programmieren dazwischen vier Spalten: Kategorien logische Gruppierungen von Klassen Klassen der ausgewählten Kategorie Protokolle logische Gruppierungen von Methoden Methoden im ausgewählten Protokoll Klick auf Hierarchy listet Ober- und Unterklassen der gewählten Klasse auf; Klick auf Browse liefert die normale Ansicht. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

193 5.3 Projekt anlegen Kategorien Für jedes Projekt benötigt man eine oder mehrere Kategorien, in denen die neuen Klassen zusammengefasst werden. Typisch sind drei Kategorien pro Projekt Modell Klassen, die die gewünschte Funktionalität, also das Modell implementieren Ansicht Klassen, die für die Visualisierung am Bildschirm benötigt werden Tests Klassen, mit denen das Projekt getestet wird Namenskonvention für Kategorien Initialen-Projektname-Teilkategorie z. B. MS-Taxi-Modell Initialen und Anfangsbuchstaben der Namensbestandteile groß Bindestriche, keine Leerzeichen Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

194 Die eigenen Kategorien erscheinen künftig am Anfang oder Ende der Liste. 5.3 Projekt anlegen Kategorien Öffne einen Systembrowser. Rechtsklick in der linken Kategorienspalte Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

195 5.4 Projekt speichern Monticello-Pakete Damit die Änderungen gespeichert werden und erhalten bleiben, gibt es im wesentlichen zwei Möglichkeiten: Weltmenü Monticello Speichern (Save) sichert sämtliche Veränderungen im Pharo-Image, aber auch den aktuellen Zustand sämtlicher Fenster und sonstigen Objekte. Speichern unter... (Save as... ) sichert das gesamte Pharo-Image, also die ganze Entwicklungsumgebung unter einem anderen Namen. Es entsteht eine neue.image- sowie eine neue.changes-datei. Monticello-Pakete sind eine Möglichkeit, gezielt Quelltext aus dem Pharo-Image zu exportieren (oder zu importieren), sei es auf einen Web-Server oder in ein beliebiges Verzeichnis. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

196 5.4 Projekt speichern Monticello-Pakete Öffne einen Monticello-Browser. Füge mit +Package ein neues Paket hinzu. Name von Monticello-Paketen Beim Speichern werden sämtliche Klassen und Methoden exportiert, die zu Kategorien oder Protokollen gehören, deren Name mit mit dem Namen des Paketes beginnt. Typischer Paketname: Initialen-Projektname z. B. MS-Taxi Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

197 5.4 Projekt speichern Monticello-Pakete Wähle in der linken Spalte dein Projekt aus. In der rechten Spalte erscheint als Standardspeicherort ein Unterverzeichnis deines Pharoverzeichnisses. Füge mit +Repository einen neuen Speicherort hinzu in der Regel ein Verzeichnis (directory). Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

198 5.4 Projekt speichern Monticello-Pakete Wähle in der linken Spalte dein Projekt und in der rechten Spalte den gewünschten Speicherort aus. Wähle Save. In der Log Message sollte stichpunktartig stehen, was sich seit dem letzten Speichern, also der letzten Version deines Paketes verändert hat. Die exportierte Datei heißt wie der Versionsname, aber mit der Endung.mcz. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

199 5.4 Projekt speichern Monticello-Pakete Mit Browse kannst du nachsehen, was in dem Paket gespeichert wurde im Moment noch nichts. Spätestens jetzt solltest du aber auch das gesamte Image im Weltmenü speichern, um deinen momentanen Arbeitsstand festzuhalten. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

200 5.5 Anlegen einer Klasse Als einfachste Klasse im Taxi-Beispiel wird im folgenden die Klasse Taxileuchte implementiert. Wähle im Systembrowser die Kategorie aus, zu der die neue Klasse gehören soll hier deine Taxi-Modell-Kategorie: Um Namenskonflikte mit bestehenden Klassen zu vermeiden, empfiehlt es sich, dem Klassennamen die eigenen Initialen voranzustellen (ohne Bindestrich), also z. B. MSTaxileuchte. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

201 5.5 Anlegen einer Klasse Im Editor-Feld des Browsers siehst du eine Vorlage zum Anlegen einer neuen Klasse: 1 Object subclass: #NameOfSubclass 2 instancevariablenames: 3 classvariablenames: 4 pooldictionaries: 5 category: MS-Taxi-Modell Zeile 1 Jede neue Klasse ist Unterklasse einer bereits vorhandenen Klasse. Meist ist die allgemeine Klasse Object die benutzte Oberklasse, von der geerbt wird. Zeile 2 Instanzvariablen entsprechen den Attributen der Objekte einer Klasse. Zeile 3 4 zu Klassenvariablen und pool dictionaries vielleicht später mehr Zeile 5 der Name der Kategorie, zu der die neue Klasse gehören soll Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

202 5.5 Anlegen einer Klasse Verändere die Vorlage wie folgt: 1 Object subclass: #MSTaxileuchte 2 instancevariablenames: istan 3 classvariablenames: 4 pooldictionaries: 5 category: MS-Taxi-Modell Zeile 1 Trage den Namen der neuen Klasse ein. Achte auf das # vor dem Namen! Ändere ggf. die Oberklasse. Zeile 2 Trage die Instanzvariablen, durch Leerzeichen getrennt, zwischen den Anführungszeichen ein. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle Rechtsklick und Accept!

203 5.5 Anlegen einer Klasse Namenskonvention Klassennamen beginnen mit Großbuchstaben. Variablen- und Methodennamen beginnen klein. Nur englisches Alphabet und Ziffern, keine Leerzeichen! CamelCase bei Namen, die aus mehreren Teilwörtern bestehen, z.b. MannMitHut gehespazieren. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

204 5.6 Klassenkommentar Zu gutem Programmierstil gehören Kommentare. In Smalltalk sind das Kommentarzeilen im Quelltext von Methoden Klassenkommentare Im Klassenkommentar werden die Klasse und ihr Zweck kurz beschrieben, die Bedeutung der Instanzvariablen erklärt, ggf. Beispiele für Methodenaufrufe oder die Instanzerzeugung gegeben. Wähle die Klasse aus und klicke auf das Fragezeichen. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle Accept und zurück mit Klick auf Instance.

205 5.7 Accessoren Get- und Set-Methoden Attribute sind privat (Datenkapselung). Soll ein anderes Objekt auf die Attributwerte Zugriff haben (auslesen oder verändern), sind öffentliche Get- und Set-Methoden (Accessoren) nötig. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle Rechtsklick auf der Klasse Refactor class (oder Refactor instance variable ) Accessors

206 5.7 Accessoren Get- und Set-Methoden Accept im nachfolgenden Fenster (es zeigt die beiden Methoden) liefert dieses Ergebnis: ein neues Protokoll accessing für Zugriffsmethoden auf Instanzvariablen zwei Methoden istan und istan: istan Get-Methode, heißt genau wie die Instanzvariable istan: Set-Methode, beachte den Doppelpunkt am Ende Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

207 5.7 Accessoren Get- und Set-Methoden Vorsicht! Achte darauf, ob die beiden Methoden auch wirklich den gleichen Namen wie die Instanzvariable haben! Heißt eine Variable z. B. name, so erzeugt Pharo eine Get-Methode namens name1. Das liegt daran, dass es in der Oberklasse Object bereits eine Methode name gibt, die wegen der Vererbung auch eine Methode deiner Klasse ist. Lösche in so einem Fall die beiden Zugriffsmethoden, benenne deine Instanzvariable um und erzeuge die Accessoren erneut. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

208 5.8 Wertrückgabe Get-Methode Die Get-Methode gibt den Wert einer Instanzvariablen als Ergebnis zurück. 1 istan 2 ^ istan Zeile 1 Methodenkopf der Name der Methode Zeile 2 Wertrückgabe ˆ ist der Rückgabeoperator (oder Return-Operator) Als Ergebnis der Methode wird der Wert des Ausdruckes hinter dem Rückgabeoperator zurückgegeben, hier also der Wert der Instanzvariablen istan. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

209 5.9 Wertzuweisung Set-Methode Die Set-Methode verändert den Wert einer Instanzvariablen. 1 istan: anobject 2 istan := anobject Zeile 1 Methodenkopf der Name der Methode mit Angabe des Parameters anobject Der Name des Parameters ist frei wählbar (wie ein Variablenname), sinnvoll wäre hier z. B. einwahrheitswert (ggf. an allen Stellen im Quelltext dieser Methode ändern!). Zeile 2 Wertzuweisung := ist der Wertzuweisungsoperator Der Instanzvariablen istan wird der Wert des Ausdruckes hinter dem Wertzuweisungsoperator zugewiesen, hier der Wert des Parameters anobject. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

210 5.10 Grundgerüst einer Methode Wenn du im Systembrowser in die Protokollspalte klickst, wird unten im Editorfeld das Grundgerüst einer Methode in Smalltalk angezeigt: 1 messageselectorandargumentnames 2 "comment stating purpose of message" 3 4 temporary variable names 5 statements Zeile 1 Methodenkopf Name und ggf. Parameter Zeile 2 Methodenkommentar Kommentare in doppelten Anführungszeichen für Menschen, die verstehen sollen, was hier passiert Zeile 4 Hilfsvariablen leerzeichengetrennt, zwischen senkrechten Strichen nur innerhalb dieser Methode bekannt und gültig Zeile 5 Befehlszeilen was in der Methode ausgeführt werden soll Punkt am Ende jeder Anweisung. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

211 5.11 Instanzerzeugung im Workspace Zeit, die neue Klasse erstmals auszuprobieren. Speichere zunächst dein Monticello-Paket und auch das Pharo-Image. Öffne einen Workspace. Instanzerzeugung objektname := Klassenname new. Der Objektname ist frei wählbar (ein Variablenname) und notwendig, um dem Objekt in der Folge schicken zu können. Gib folgende Zeile mit deinem Klassennamen ein: Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle testleuchte := MSTaxileuchte new. Beachte den Punkt am Ende jeder Befehlszeile! Markiere die ganze Zeile Rechtsklick Do it In Klammern stehen Tastenkürzel mit Alt/Cmd/Strg

212 5.12 Inspektoren Objektüberwachung Wo ist nun die gerade erzeugte testleuchte? Sie ist kein graphisches Objekt und daher nicht am Bildschirm zu sehen, aber sie existiert nun in deinem Pharo-Image. Markiere im Workspace nur den Namen testleuchte. Rechtsklick Inspect it Es öffnet sich ein Inspektor für das Objekt. Links lassen sich Einträge zum Objekt selbst (self) oder seinen Instanzvariablen auswählen. Rechts werden stets die entsprechenden aktuellen Werte angezeigt. Im Feld unten kann man aus der Sicht dieses Objektes selbst senden. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

213 5.12 Inspektoren Objektüberwachung Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wähle im Inspector links all inst vars aus. Trage unten folgende vier Zeilen ein. 1 istan := false. 2 self istan: true. 3 Transcript open. 4 Transcript cr; show: self istan. Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle Markiere nacheinander jeweils eine Zeile Rechtsklick Do it Beobachte das rechte Feld.

214 5.12 Inspektoren Objektüberwachung 1 istan := false. 2 self istan: true. 3 Transcript open. 4 Transcript cr; show: self istan. Zeile 1 Wertzuweisung an die private Instanzvariable Zeile 2 Aufruf der eigenen Set-Methode self Schlüsselwort, wenn ein Objekt sich selbst referenziert. Zeile 3 Nachricht an das global bekannte (großes T) Ausgabefenster Transcript, sich zu öffnen. Zeile 4 Zwei an das Transcript, getrennt durch einen Strichpunkt (Kaskadierung): Zeilenumbruch (cr) und Anzeige (show:) des Ergebnisses der eigenen Get-Methode der testleuchte Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

215 5.13 Methodenaufrufe Trage in einem Workspace folgende Zeilen ein und führe sie nacheinander aus ( Do it ): 1 testleuchte := MSTaxileuchte new. 2 testleuchte inspect. 3 testleuchte istan. 4 testleuchte istan: true. 5 testleuchte istan: false; istan. 6 Transcript open; cr; show: testleuchte istan. self ist hier nicht zulässig, weil die testleuchte im Workspace von außen angesprochen wird. Zeile 1 Wertzuweisung mit Instanzerzeugung Zeile 2 3 unäre (gehen vor) Zeile 4 Schlüsselwortnachricht mit dem Parameterwert true Zeile 5 6 kaskadierungen (Strichpunkte) Zeile 3, 5 Willst du das Ergebnis der Get-Methoden sehen, wähle statt Do it Print it. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

216 5.14 Wichtige Datentypen In Smalltalk kann eine Variable beliebige Werte annehmen. Probiere in einem Workspace folgendes aus: 1 testleuchte istan: true. 2 testleuchte istan: 5. 3 testleuchte istan: testleuchte istan: testleuchte istan: hallo. 6 testleuchte istan: $A. 7 testleuchte istan: nil. 1 Wahrheitswert (Boolean) true oder false 2 ganze Zahl (Integer) 5 3 Dezimalzahl (Float) 6.7 mit Dezimalpunkt 4 Punktkoordinaten (Point) y 5 Zeichenkette (String) Text in einfachen Anführungszeichen 6 Schriftzeichen (Character) $A mit Dollarzeichen 7 Nichts nil ist der Nullwert: Wert nicht vorhanden Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

217 5.15 Konstruktor initialize Eine neue Taxileuchte ist entweder an oder aus. Neue Instanzen deiner Klasse haben für istan aber den Wert nil, also nichts weder an noch aus. Wie kann man das ändern? Was passiert überhaupt bei der Instanzerzeugung mit new? Öffne einen Systembrowser tippe in das Suchfeld oben new und drücke die Eingabetaste. Es öffnet sich ein Fenster namens Implementors of #new. Wähle dort gleich den ersten Treffer Behavior>>new: new "Answer a new initialized instance of the receiver (which is a class) with no indexable variables. Fail if the class is indexable." Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle ^ self basicnew initialize Ein Objekt erhält als erstes die Nachricht initialize.

218 5.15 Konstruktor initialize Konstruktor initialize ist die Methode zur Initialisierung eines Objektes: Belegung der Instanzvariablen mit Startwerten ggf. Aufruf von Methoden, die das Objekt von Anfang an ausführen soll Wähle im Browser deine Klasse und klicke in der Protokollspalte auf -- all --. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

219 5.15 Konstruktor initialize Ersetze die Methodenvorlage durch folgenden Quelltext und speichere mit Accept : 1 initialize 2 "initialisiere den Zustand des Objektes" 3 4 super initialize. "Konstruktor der Oberklasse" 5 self istan: false. "Leuchte aus" super initialize super referenziert die Oberklasse (hier die Klasse Object). Das ist i. a. die erste Zeile jedes Konstruktors. Sie sorgt dafür, dass beim Initialisieren des Objektes erst einmal alles erledigt wird, was in der Oberklasse bereits vorgesehen ist. So müssen in der Folge nur spezifische Ergänzungen eigens programmiert werden. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

220 5.15 Konstruktor initialize Erzeuge im Workspace eine neue Taxileuchte und untersuche den Startwert von istan im Inspector. Was bedeutet der grüne Pfeil vor initialize in der Methodenspalte? Klicke darauf! Eine gleichnamige Methode ist auch in einer Oberoder Unterklasse implementiert, du hast sie überschrieben. Du kannst die Klasse aus der Liste auswählen und den Quelltext studieren. Zurück geht es z. B. mit Rechtsklick auf die Kategorienspalte und Find class.... Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

221 5.16 Überschreiben vererbter Methoden Vererbung Jede Unterklasse erbt sämtliche Methoden und Attribute ihrer Oberklassen. Wenn es z. B. in einer Oberklasse eine Methode tuetwas gibt, so versteht ein Objekt jeder Unterklasse automatisch auch die Nachricht tuetwas und führt diese Methode so aus, wie sie in der nächstverwandten Oberklasse definiert ist. Sämtliche Varianten (samt Klasse) einer überschriebenen Methode werden angezeigt, wenn du die Methode auswählst und Inheritance anklickst. Ein Objekt der Unterklasse besitzt auch sämtliche Instanzvariablen (Attribute) der Oberklasse. Du siehst alle Variablen einer Klasse, wenn du die Klasse im Systembrowser auswählst und Variables anklickst. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

222 5.16 Überschreiben vererbter Methoden Überschreiben einer Methode Wenn in einer Unterklasse z. B. besagte Methode tuetwas eigens neu definiert und implementiert wird, so wird die Methode der Oberklasse überschrieben. In dieser Klasse und all ihren Unterklassen, in denen die Methode nicht wiederum überschrieben ist, wird tuetwas ab sofort so ausgeführt, wie es hier implementiert ist nicht mehr wie in der Oberklasse. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

223 5.16 Überschreiben vererbter Methoden Vorsicht Wenn in der Methodenliste des Browsers vor einer von dir definierten Methode ein grüner Pfeil nach oben erscheint, gibt es in einer Oberklasse eine Methode gleichen Namens, die du überschrieben hast. Solltest du die Methode nicht absichtlich überschrieben haben, benenne deine Methode um! Instanzvariablen lassen sich nicht überschreiben. Pharo meldet dann beim Speichern der Klasse einen DuplicatedVariableError mit der Information, in welcher Oberklasse die Variable bereits definiert ist. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

224 5.17 Protokolle Methoden gruppieren Protokolle dienen dazu, Methoden logisch zu gruppieren und so z. B. das Suchen zu erleichtern oder auch gezielt Methoden in Monticello-Pakete exportieren zu können. Die neue Methode initialize gehört noch zu keinem Protokoll, sondern ist as yet unclassified. automatisch manuell Rechtsklick auf Protokollspalte Categorize automatically klappt für Standardmethoden Vor dem Erstellen einer neuen Methode das gewünschte Protokoll markieren Rechtsklick auf Protokollspalte Add category... Auswahl aus einer Liste oder Eingabe eines neuen Protokollnamens (klein!) Methoden mit der Maus in das gewünschte Protokoll ziehen Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

225 5.17 Protokolle Methoden gruppieren Die Taxileuchte benötigt noch eine Methode schalteum. Zeichne ein Struktogramm der Methode Lege bei der Taxileuchte ein Protokoll steuerung an. Wähle das Protokoll aus, schreibe Kopf und Kommentar der Methode und speichere. Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Datentypen Konstruktor Überschreiben Protokolle

226 Teil VI Smalltalk mit Pharo II Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

227 Überblick Grundkonzepte Ablaufmodelliierung Smalltalk I die Entwicklungsumgebung Squeak Smalltalk II Grundzüge der Programmiersprache Pharo I Smalltalk-Entwicklung mit Pharo Pharo II Grundzüge von Smalltalk Java I Klassen in BlueJ anlegen Java II JGUIToolbox und weitere Konstrukte Zustandsmodellierung Anhang Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

228 Gliederung Pharo II Grundzüge von Smalltalk Boolesche Werte und Umschalten Konstruktoren mit Parametern Listen OrderedCollection an Instanzen Priorität/Rangfolge von Literale Typumwandlung isnil und ifnotnil: Existiert ein Objekt? Morphic Generalisierung und Spezialisierung Verzweigung bedingte Anweisungen Stepping periodische Aktivitäten Schleifen, Wiederholungen, Iteratoren Plan Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

229 6.1 Boolesche Werte und Umschalten Boolesche Werte (Wahrheitswerte) eignen sich als Antworten auf Ja-Nein-Fragen: Stimmt eine Aussage oder stimmt sie nicht? Ja oder Nein? Wahr oder falsch? Boolesche Werte in Smalltalk true oder false Boolesche Werte lassen sich mit der Nachricht not negieren (verneinen, in ihr Gegenteil umkehren). Negation in Smalltalk true not ergibt false. false not ergibt true. Die Verneinungsnachricht not (nicht) lässt sich auch an Variablen wie istan mit booleschem Wert senden. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

230 6.1 Boolesche Werte und Umschalten Umschalten mit Verzweigung Leuchte istan? WAHR FALSCH schalte Leuchte aus schalte Leuchte an Umschalten als Negation die elegante Lösung schalte Leuchte um Umsetzung durch Wertzuweisung an die Instanzvariable oder durch Verwendung der Accessoren Negation in Smalltalk istan := istan not. self istan: self istan not. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

231 6.1 Boolesche Werte und Umschalten Auftrag Schreibe Taxileuchte.schalteUm() bzw. Taxileuchte>>schalteUm in Pharo. Liefert diese Methode einen Rückgabewert? Teste die Methode z. B. vom Workspace aus mit geöffnetem Inspektor: testleuchte schalteum. Ein Vorteil von Smalltalk besteht darin, dass du die testleuchte nicht stets neu zu erzeugen brauchst, wenn du ihre Klasse im Browser veränderst. Sie lernt automatisch mit. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

232 6.1 Boolesche Werte und Umschalten schalteum "schaltet zwischen an und aus um" Auftrag self istan: self istan not. Lege in deiner Taxi-Modell-Kategorie die Klasse MSTaxameter (mit deinen Initialen) an. Accessoren für die Instanzvariablen einen Konstruktor, der sinnvolle Startwerte für betrag und istan vorsieht; tarif (der aktuell eingestellte Tarif) soll nil sein (kein Tarif eingestellt), die tarifliste erst einmal auch nil ein Protokoll steuerung mit den Methoden schalteein und schalteaus Kommentare! Teste das Taxameter mit Workspace und Inspektor! Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

233 6.1 Boolesche Werte und Umschalten Zur Kontrolle: Object subclass: #MSTaxameter instancevariablenames: istan betrag tarif tarifliste classvariablenames: pooldictionaries: category: MS-Taxi-Modell initialize "initialisiere den Zustand des Objektes" super initialize. "Konstruktor der Oberklasse" self istan: false. "Taxameter aus" self betrag: "Startbetrag 0 Euro" self tarif: nil. "Noch gibt es keine Tarife" schalteein "schaltet das Taxameter ein" self istan: true schalteaus "schaltet das Taxameter aus" self istan: false Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

234 6.2 Konstruktoren mit Parametern Auftrag Lege in deiner Taxi-Modell-Kategorie die Klasse MSTarif (mit deinen Initialen) an. Accessoren für die Instanzvariablen Konstruktor für einen Standardtarif mit sinnvollem Tarifnamen, Grundgebühr, Kilometer- und Minutenpreis Object subclass: #MSTarif instancevariablenames: grundgeb tarifname kmpreis minpreis classvariablenames: pooldictionaries: category: MS-Taxi-Modell initialize "Initialisierung eines Standardtarifs" super initialize. tarifname := Standardtarif. grundgeb := kmpreis := minpreis := 0.35 Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

235 6.2 Konstruktoren mit Parametern Mit diesem Konstruktor lässt sich nur ein fester Standardtarif erzeugen. Das Taxameter benötigt aber zumindest einen Tagund einen Nachttarif, vielleicht auch Gruppen- oder andere Sondertarife. Was tun? Objektorientierte Programmiersprachen erlauben auch Konstruktoren mit Parameterlisten. Auch kann eine Klasse mehrere Konstruktoren besitzen, etwa einen ohne und einen mit Parameterliste. Das ist auch in Smalltalk möglich. Nötig wären alternative Klassenmethoden zu new. Einfacher löst man dieses Problem aber mit einer Schlüsselwortnachricht, die unmittelbar nach der Instanzerzeugung an das Objekt geschickt wird: "Standardtarif" starif := MSTarif new. "Wunschtarif" Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen wtarif := MSTarif new mitname: Nachttarif grundgeb: 4.20 kmpreis: 1.60 minpreis: Bedingte Wiederholung 0.70.

236 6.2 Konstruktoren mit Parametern Auftrag Programmiere im Protokoll initialize-release die fehlende Methode mitname: grundgeb: kmpreis: minpreis:. Wähle für die vier Parameter sinnvolle Namen! Erzeuge im Workspace verschiedene Standard- und Wunschtarife und untersuche sie im Inspektor! Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic mitname: einname grundgeb: einegrundgeb kmpreis: einkmpreis minpreis: einminpreis Ein- und Ausgabefenster "Initialisierung eines Wunschtarifs" "Benutzung: MSTarif new mitname: grundgeb: kmpreis: minpreis: " tarifname := einname. grundgeb := einegrundgeb. kmpreis := einkmpreis. minpreis := einminpreis. Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

237 6.3 Listen OrderedCollection Ein Taxameter bietet in der Regel verschiedene Tarife zur Auswahl an. Diese sollen in der Tarifliste gespeichert sein. Für die Tarifwahl an einem Taxameter sind zwei Möglichkeiten vorstellbar: Man kann eine Nummer (einen Listenindex) wählen. Der entsprechende Tarif wird eingestellt. Man hat einen Knopf, mit dem man die Tarife der Reihe nach durchschalten kann. Auf den letzten Tarif folgt wieder der erste. Auftrag Entwirf Struktogramme für diese beiden Methoden des Taxameters. Welche Methoden muss die Tarifliste beherrschen, damit beides funktioniert? Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

238 6.3 Listen OrderedCollection Collections Sammlungen Zum Speichern einer Ansammlung von Objekten bietet Smalltalk die Klasse Collection mit einer großen Zahl von Unterklassen. Besonders wichtig: OrderedCollection durchnummerierte Liste Set Menge keine Reihenfolge, keine Duplikate Bag keine Reihenfolge, aber Duplikate erlaubt wie eine Urne in der Mathematik Dictionary Schlüssel-Wert-Paare wie im Wörterbuch Auftrag Lies im Systembrowser die Klassenkommentare dieser Klassen. Durchstöbere ihre Methoden. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

239 6.3 Listen OrderedCollection Auftrag Die Tarifliste soll eine neue Instanz der Klasse OrderedCollection werden. Passe den Konstuktor des Taxameters an. Suche im Systembrowser in der Klasse OrderedCollection und ihren Oberklassen nach Methoden, um Objekte hinzuzufügen, die Länge (Größe) der Liste auszugeben, ein Listenelement mit einem bestimmten Index auszuwählen, den Index eines Listenelementes auszugeben. Ergänze den Konstruktor des Taxameters so, dass in der Tarifliste ein Standard- und drei Wunschtarife eingetragen werden. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

240 6.3 Listen OrderedCollection OrderedCollection wichtige Methoden add: einobjekt fügt einobjekt als neuen Eintrag am Ende der Liste ein at: einindex gibt das aktuelle Objekt an der Stelle einindex der Liste aus at: einindex put: einobjekt ersetzt das aktuelle Objekt an der Stelle einindex durch einobjekt indexof: einobjekt liefert den Index der ersten Stelle in der Liste, an der einobjekt vorkommt; 0, falls einobjekt nicht in der Liste enthalten ist size gibt die Länge der Liste aus removeat: einindex entfernt den Eintrag an der Stelle einindex aus der Liste; das entsprechende Objekt selbst wird aber nicht vernichtet removeall entfernt alle Einträge aus der Liste Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

241 6.3 Listen OrderedCollection Auftrag Erzeuge eine neues Taxameter und untersuche es im Inspektor. Untersuche auch die Tarifliste und die darin enthaltenen Tarife. Rechtsklick auf die Namen der Instanzvariablen in der linken Inspektorspalte erlaubt z. B. Inspect. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

242 6.3 Listen OrderedCollection Auftrag Programmiere die beiden Methoden zur Tarifwahl und teste sie. Beobachte die Veränderungen im Inspektor. Evtl. sind die beiden folgenden Abschnitte zu und deren Priorität hilfreich. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

243 6.4 an Instanzen Instanzen können empfangen. Es gibt drei Arten von. Pharo II Boolesche Werte Konstruktor II Listen Unäre Nachricht (ohne Argument) empfaenger methodenname. Arithmetik Vergleiche Logik Priorität von Literale Zahlen testleuchte schalteum. testball := EllipseMorph new. testfeld := PasteUpMorph new. testball openinhand. testball delete. testfeld openinworld. Time now. Date today. 5 squared. 41 Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen 41 Probiere die Anweisungen in einem Workspace aus! Die Bspe. zu Daten und Zahlen wertest du besser mit Alt-p aus (print it). Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

244 6.4 an Instanzen Schlüsselwortnachricht (mit Argument) empfaenger mwort1: wert1 mwort2: wert2. 42 testleuchte istan: false. testfeld extent: testfeld openinwindowlabeled: Mein Feld. testfeld color: Color blue. testball openinworld: testfeld. testball position: testfeld removemorph: testball. testfeld addmorph: testball centerednear: 5 raisedto: 3. Beachte die Doppelpunkte! Methodennamen können aus beliebig vielen Teilwörtern bestehen. Am Ende jeder Nachricht steht ein Punkt. 42 Natürlich ist blue auch nur eine (unäre) Nachricht an eine Instanz der Klasse Color. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

245 6.4 an Instanzen Binäre Nachricht (zwei Objekte) empfaenger binärenachricht parameterobjekt. Binäre haben die Gestalt von arithmetischen Operatoren. Arithmetik: + - * / // \\ 15+4 "Addition" 15-4 "Subtraktion" 15*4 "Produkt" 15/4 "Division" 15//4 "Division (ganzzahlig)" 15\\4 "Divisionsrest" 43 Die Bspe. zu binären wertest du am besten mit Alt-p aus (print it) 43 Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

246 6.4 an Instanzen Vergleich: < <= > >= = ~= == ~~ Vergleichsoperatoren liefern als Ergebnisse die booleschen Werte true oder false. Erzeugt im Workspace erst einmal zwei Variablen mit der gleichen Zeichenkette als Wert (Alt-d): a := Squeak. b := Squeak. Vergleich von Werten 15 < 4 "kleiner als" 15 <= 4 "kleiner oder gleich" 15 > 4 "groesser als" 15 >= 4 "groesser oder gleich" 15 = 4 "gleich" a = b a = Scratch 15 ~= 4 "nicht gleich" Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

247 6.4 an Instanzen Vergleich: < <= > >= = ~= == ~~ a := Squeak. b := Squeak. Vergleich von Identitäten 15 == 4 "identisch gleich - " 15 == 15 " gleiches Objekt" Squeak == Squeak a == b "!!!" 15 ~~ 4 "nicht das gleiche Objekt" 15 ~~ 15 a ~~ b Überrascht? Auch Variablen sind eigenständige Objekte! Zunächst wirst du aber vor allem den Vergleich von Werten benötigen. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

248 6.4 an Instanzen Logik: & true & true "logisches Und (AND)" true & false false & true false & false true true "logisches Oder (OR)" true false false true false false Wie in der Mathematik üblich, ist ein Oder stets ein Oder auch. -> Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Haus, halt "Konkatenation (Aneinanderhaengen)" 100@200 "Ein Punkt mit x- und y-koordinate" 44 Erforscht diese Beispiele: Auswählen und Alt-i 45 -> Assoziation, vielleicht später... Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

249 6.5 Priorität/Rangfolge von Priorität von Abarbeitung von links nach rechts, aber Unär vor Binär vor Schlüsselwort Änderung der Reihenfolge durch Klammern () Transcript show: Haus, halt. Transcript cr. "Neue Zeile im Transcript" Transcript show: 16 sqrt. Transcript show: 16 sqrt negated. Transcript show: Transcript show: squared. Transcript show: * 2. "!" Transcript show: 16 + (3 * 2). Transcript show: squared * 2. Transcript show: 4 raisedto: 9. "!!!" Transcript show: (4 raisedto: 9). Transcript show: (4 raisedto: 9-7). Transcript show: (4 sqrt raisedto: 9). Transcript show: (4 raisedto: 9 sqrt). Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

250 6.6 Literale Literale sind Objekte, auf die (auch ohne Referenzierung durch Variablen) durch einfaches Hinschreiben Bezug genommen werden kann. Smalltalk kennt fünf Arten von Literalen: Zahl (Number) Zeichen (Character) Zeichenkette (String) Symbol Feld (Array) Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

251 6.6.1 Literale Zahlen In Smalltalk gibt es verschiedene Zahlenklassen: Integer Ganze Zahlen, z. B Unterklassen sind SmallInteger sehr effizient zu rechnen, aber nicht beliebig groß oder klein LargePositiveInteger beliebig groß LargeNegativeInteger beliebig klein Je nach Größe der Zahl wählt Smalltalk die Klasse automatisch. Übung 1. Sucht die Klassen im Browser und findet heraus, wie groß SmallInteger-Zahlen höchstens sein können. 2. Lasst euch von einem Workspace aus im Transcript ganze Zahlen eurer Wahl als römische Zahlen, im 16er-System (als Hex-Zahl) oder z. B. im Vierersystem ausgeben. 3. Was berechnen die Methoden factorial, gcd:, lcm:? Fraction Rationale Zahlen, z. B. (1/3) (-8/5) Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

252 6.6.2 Literale Zeichen Einzelzeichen gehören der Klasse Character an. Druckbare Einzelzeichen werden mit vorangestelltem Dollarzeichen dargestellt, z. B. $a, $R, $, $3, $$. Für nichtdruckbare Zeichen stehen an die Klasse 46 Character zur Verfügung, z. B. Leerzeichen Character space Tabulator Character tab Zeilenumbruch Character cr Rückwärtslöschen Character backspace Eurozeichen Character euro 47 Besonders wichtig ist das Protokoll testing. Erkundet die Wirkung der zugehörigen in einem Workspace (Alt-p). 46 Klassenmethoden werden im Browser angezeigt, wenn ihr in der Klassenspalte statt instance das Feld class aktiviert. 47 Eine Liste weiterer Zeichen findet ihr im Klassenprotokoll accessing untypeable characters, auch eine Erklärung, warum das Eurozeichen evtl. nicht funktioniert. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

253 6.6.3 Literale Zeichenketten Zeichenketten (Strings) werden in Smalltalk durch einfache Hochkommata begrenzt, z. B. Das ist ein String. Smalltalk rocks :-) (Das ist keine Zahl!) u (Das ist etwas Anderes als $u!) Soll der String ein Hochkomma ( ) als Zeichen enthalten, muss dieses verdoppelt werden: Wie geht s? wird zu Wie geht s? Vorsicht, doppelte Hochkommata (") kennzeichnen in Smalltalk Kommentare: "Das ist ein Kommentar im Quelltext." Strings beherrschen zahlreiche nützliche Methoden, die sie teilweise auch von der Oberklasse SequenceableCollection erben. Besonders interressant sind die Protokolle comparing, converting und testing. Probiert die eine oder andere aus! Später mehr dazu. Eine Übersicht bietet der Terse Guide to Squeak. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

254 6.6.4 Literale Symbole Symbole sind besondere Zeichenketten, also eine Unterklasse von String. Symbole werden durch ein vorangestelltes Doppelkreuz (#) gekennzeichnet, z. B. #Symbol #Feb13 # Ich bin ein Symbol! Enthält der Symbolbezeichner auch andere Zeichen als Buchstaben oder Ziffern, sind die einfachen Hochkommata notwendig. Anders als gewöhnliche Strings gibt es ein Symbol immer nur ein einziges Mal im ganzen System. Symbole werden z. B. als Namen von Klassen oder Methoden verwendet. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

255 6.6.5 Literale Arrays Arrays (deutsch oft als Felder bezeichnet) sind Listen mit einer festen Anzahl von Elementen. Ein Array wird durch ein vorangestelltes Doppelkreuz und runde Klammern gekennzeichnet und kann beliebige Elemente getrennt durch Leerzeichen enthalten, z. B. #( ) #( squeak $s #Feb13) #($a $b #($s smalltalk ) 4) Ein Array kann also auch andere Arrays als Elemente enthalten. Bei einem Spiel wie dem Schlangenrennen könnte man z. B. das Labyrinth als Array von Arrays implementieren, wenn jeder Rasterzeile ein Array von Labyrinthfeldern und dem ganzen Labyrinth ein Array dieser Zeilen zugeordnet wird. Einen Überblick über die wichtigsten Methoden von Arrays findet sich wieder im Terse Guide to Squeak. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

256 6.7 Typumwandlung Öffne ein Transcript und probiere folgendes im Workspace: testtax := MSTaxameter new. testtax waehletarif: 2. Transcript cr; show: Grundgebuehr:. "Anzeige der Grundgebuehr des eingestellten Tarifs" Transcript cr; show: testtax tarif grundgeb. "Anzeige der Grundgebuehr mit Text davor" Transcript cr; show: Grundgebuehr:, testtax tarif grundgeb. Der letzte Befehl liefert einen Fehler von wegen indexable object. Das Problem ist die Konkatenation mit dem Komma. Eine Zahl (die Grundgebühr) kann man nicht an eine Zeichenkette hängen. Lösung: Wandle die Zahl in eine Zeichenkette um: Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping "Anzeige der Grundgebuehr mit Text davor" Transcript cr; show: Grundgebuehr:, testtax tarif grundgeb asstring. Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

257 6.7 Typumwandlung Typumwandlung einobjekt asneuertyp Gibt es für viele Klassen und Typen. Öffne im Weltmenü unter Tools einen Finder. Gib im Suchfeld as ein. Wie viele Methodennamen beginnen mit as? Umwandlung in eine Zeichenkette 42 asstring Umwandlung in eine Zahl 2.50 Euro asnumber Umwandlung in eine Dezimalzahl (5/4) asfloat Umwandlung in eine geordnete Liste einzelner Zeichen Smalltalk asorderedcollection Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

258 6.8 isnil und ifnotnil: Existiert ein Objekt? Die beiden Methoden zur Tarifwahl sehen etwa so aus: waehletarif: einenummer "waehlt einen Tarif aus der Tarifliste" self tarif: (self tarifliste at: einenummer). "alternativ mit Wertzuweisung" "tarif := self tarifliste at: einenummer." tnummer und trest sind temporäre Hilfvariablen, die nur innerhalb dieser Methode gültig sind. schaltetarifweiter "wechselt zum naechsten Tarif aus der Liste, nach dem letzten Tarif wieder zum ersten" tnummer trest "suche Nummer des eingestellten Tarifs" tnummer := self tarifliste indexof: self tarif. "Rest modulo der Listenlaenge ausrechnen" trest := tnummer \\ self tarifliste size. "waehle Tarif mit der naechsten Nummer" self waehletarif: trest + 1. Was passiert, wenn gar kein Tarif eingestellt ist? Probiere es mit Workspace und Inspektor aus! Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

259 6.8 isnil und ifnotnil: Existiert ein Objekt? Bei einem frisch erzeugten Taxameter hat der eingestellte Tarif den Wert nil: Es ist kein Tarif eingestellt. Nach Aufruf der Methode schaltetarifweiter zeigt der Inspektor an, dass plötzlich ein Tarif eingestellt ist. Untersuchst du den eingestellten Tarif im Inspektor, siehst du, dass es sich um den Standardtarif handelt, also den ersten Eintrag in der Tarifliste. Warum? Es liegt an dem Aufruf der Methode indexof:. Gib den Namen dieser Methode im Suchfeld eines Systembrowsers ein. Studiere die Implementierung in der Klasse SequenceableCollection. Klar, warum der erste Tarif eingestellt wurde? Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

260 6.8 isnil und ifnotnil: Existiert ein Objekt? Vielleicht ist das genau das Verhalten, das du haben möchtest: Wenn der Fahrer auf den Knopf zum Weiterschalten drückt, obwohl noch gar kein Tarif eingestellt ist, soll einfach der erste Tarif ausgewählt werden. Vielleicht willst du genau das aber vermeiden: Wenn kein Tarif eingestellt ist, soll auch keiner eingestellt bleiben. Wie lässt sich das realisieren? Zeichne ein Struktogramm! schaltetarifweiter WAHR kein Tarif eingestellt? FALSCH suche eingestellte Tarifnummer berechne neue Tarifnummer stelle neuen Tarif ein Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

261 6.8 isnil und ifnotnil: Existiert ein Objekt? In Smalltalk versteht jedes Objekt die beiden isnil und ifnotnil:. Gib die beiden Methodennamen im Suchfeld eines Systembrowsers ein und lies die beiden Implementierungen jeder dieser Methoden. isnil einobjekt isnil. gibt false zurück, falls das Objekt existiert, sonst true. Probiere die folgenden Zeilen (mit deinen Bezeichnungen) mit do it bzw. print it in einem Workspace aus: testtax := MSTaxameter new. testtax isnil. testtax tarif isnil. testtax tarifliste isnil. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

262 6.8 isnil und ifnotnil: Existiert ein Objekt? ifnotnil: einobjekt ifnotnil: [ Anweisungsblock ]. bewirkt, dass die Anweisungen innerhalb der eckigen Klammern nur dann ausgeführt werden, wenn einobjekt tatsächlich existiert. Probiere die folgenden Zeilen (mit deinen Bezeichnungen) in einem Workspace aus: testtax := MSTaxameter new. testtax ifnotnil: [Transcript open.]. testtax tarif ifnotnil: [ Transcript show: ein Tarif eingestellt.]. testtax tarifliste ifnotnil: [ Transcript cr. Transcript show: testtax tarifliste size. ]. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

263 6.8 isnil und ifnotnil: Existiert ein Objekt? Die angepasste Methode schaltetarifweiter sieht dann etwa so aus: schaltetarifweiter "wechselt zum naechsten Tarif aus der Liste, nach dem letzten Tarif wieder zum ersten" tnummer trest self tarif ifnotnil: [ "suche Nummer des eingestellten Tarifs" tnummer := self tarifliste indexof: self tarif. "Rest modulo der Listenlaenge ausrechnen" trest := tnummer \\ self tarifliste size. "waehle Tarif mit der naechsten Nummer" self waehletarif: trest + 1. ]. Beachte den Punkt nach der schließenden eckigen Klammer! Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

264 6.9 Morphic Oberklasse aller grafischen Objekte ist in Smalltalk die Klasse Morph. Suche diese Klasse im Systembrowser und lass dir mit der Hierarchie-Ansicht all ihre Unterklassen anzeigen. Nützliche Klassen: LabelMorph SimpleButtonMorph PasteUpMorph StandardWindow Nützliche Methoden: EllipseMorph RectangleMorph PolygonMorph ImageMorph openinworld openinhand openinworld: open openinwindowlabeled: delete Lies die Klassenkommentare. Experimentiere im Workspace mit diesen Klassen. Halo durch Anklicken mit der mittleren Maustaste bei gedrückter Umschalttaste Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

265 6.9.1 Morphic Ein- und Ausgabefenster Probiere folgende drei Befehlszeilen im Workspace: fenster := StandardWindow new. ergebnis := fenster textentry: Wie findest du Smalltalk title: Meine Frage entrytext: Bitte kurz, aber ehrlich. ergebnis ifnotnil:[ fenster message: ergebnis title: Deine Antwort.]. Die Klasse StandardWindow bietet im Protokoll Services noch weitere nützliche Methoden. Im Textfeld eingegebener Text lässt sich mit einer Wertzuweisung in einer Variablen speichern. Beachte ifnotnil: prüfe, ob überhaupt etwas eingegeben wurde. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

266 6.9.2 Morphic Schaltknöpfe Probiere folgende zwei Befehlszeilen im Workspace: testleuchte := MSTaxileuchte new. knopf := SimpleButtonMorph new target: testleuchte; actionselector: #schalteum; label: Leuchte umschalten ; useroundedcorners; openinworld. Öffne einen Inspektor für die Leuchte, lass dir die Werte der Instanzvariablen anzeigen und klicke auf den Knopf! target Name des Objektes, das auf den Knopfdruck reagieren soll actionselector Name der aufzurufenden Methode beachte das Doppelkreuz! label Knopfbeschriftung Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

267 6.9.3 Morphic Beschriftungen Probiere folgende Zeilen im Workspace: label := LabelMorph new. label openinworld. "Zugriff auf die installierten Schriftarten:" label changefont. "Waehle in dem Fenster update und speichere das Image." label font: (LogicalFont familyname: Arial pointsize:48). "emphasis regelt den Schriftstil per Zifferncode, vgl. Kommentar im Quelltext von StringMorph>>emphasis. 1 ist fett." label emphasis: 1. label color: Color yellow. label contents: TAXI. label disable. label enable. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

268 6.9.4 Morphic Behälter und Spielfelder... aus Etoys sind ein PasteUpMorph. ball := EllipseMorph new. tor := RectangleMorph new. text := LabelMorph new. "Erzeugen und Anpassen eines Spielfeldes" feld := PasteUpMorph new. feld openinworld. feld color: Color blue. feld extent: "Objekte einfuegen" feld addmorph: ball. feld addmorphcentered: tor. feld addmorph: text centerednear: "enthaltene Objekte -- Print it!" feld submorphs. (feld submorphs at: 1) color: Color red. "ein Objekt gegen Mausklicks sperren -- klick es danach jeweils an" ball lock. ball unlock. "Objekte entfernen" feld removemorph: text. feld removeallmorphs. feld delete. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

269 6.9 Morphic Auftrag Mit den gezeigten Morph-Klassen lassen sich eine Taxileuchte oder ein Taxameter visualisieren. Entwickle in einem Workspace eine Befehlsfolge, die die Visualisierung einer Taxileuchte auf dem Bildschirm erzeugt. Entwickle in einem Workspace eine Befehlsfolge, die die Visualisierung eines Taxameters auf dem Bildschirm erzeugt. Erzeuge in dem Workspace auch eine Taxameterinstanz, deren Tarifwerte von der Visualisierung angezeigt werden. Wie du etwa den Inhalt eines LabelMorphs zur Anzeige der Grundgebühr erhältst, hast du im Abschnitt Typumwandlung schon einmal gesehen. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

270 6.9 Morphic Auftrag Lege im Systembrowser eine neue Kategorie MS-Taxi-Ansicht an (mit deinen Initialen) und darin die beiden Klassen MSTaxileuchtenAnzeige und MSTaxameterAnzeige. Verfasse jeweils einen Klassenkommentar. Übernimm die beiden Befehlsfolgen aus dem Workspace als (vorläufigen) Konstruktor (initialize-methode) der jeweiligen Klasse. Beim Speichern wirst du Fehlermeldungen wegen der Namen der verwendeten Variablen erhalten. Entscheide, welche Instanzvariablen der Klasse, welche nur temporäre Hilfsvariablen der Methode sein sollen. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

271 6.9 Morphic Auftrag Prüfe dein Ergebnis im Workspace mit lanzeige := MSTaxileuchtenAnzeige new. tanzeige := MSTaxameterAnzeige new. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

272 6.10 Generalisierung und Spezialisierung Was ist eine Anzeige? Was hat sie mit einem Gerät zu tun? Was muss sie wissen/kennen, d. h. welche Attribute benötigt sie? Welche Methoden muss sie beherrschen? Aus welchen Bestandteilen setzt sie sich zusammen? Auftrag Zeichne ein UML-Diagramm und eine Klassenkarte. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

273 6.10 Generalisierung und Spezialisierung Anzeigefeld Anzeige geraet elemente aktualisieredich() Schaltknopf beobachtet > 1 Gerät Gibt es hierfür bereits vorhandene Morph-Klassen? Anzeigefeld: LabelMorph Schaltknopf: SimpleButtonMorph Anzeige: PasteUpMorph passt als Rahmen, kennt auch seine Elemente Was tun? (submorphs), kann aber weder ein Gerät beobachten, noch sich entsprechend aktualisieren Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

274 6.10 Generalisierung und Spezialisierung Nutze die Morph-Klassen und mache die Anzeige zu einer Unterklasse von PasteUpMorph: PasteUpMorph submorphs openinworld(einewelt) LabelMorph TaxiAnzeige geraet aktualisieredich() beobachtet > SimpleButtonMorph 1 Gerät TaxileuchtenAnzeige TaxameterAnzeige Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

275 6.10 Generalisierung und Spezialisierung Auftrag Lege in deiner Kategorie MS-Taxi-Ansicht die Klasse MSTaxiAnzeige an (mit deinen Initialen). Mache sie zu einer Unterklasse von PasteUpMorph, indem du in der Vorlage zum Anlegen der Klasse das erste Wort Object durch PasteUpMorph ersetzt. Erzeuge die Accessoren. Lege ein Protokoll anzeige und darin eine vorerst leere Methode aktualisieredich an. MSTaxiAnzeige soll eine allgemeine 48 Oberklasse für alle möglichen Anzeigen in einem Taxi sein. Was kann/soll man da sinnvollerweise in den Konstruktor schreiben? 48 Man nennt so etwas auch eine abstrakte Klasse, weil es nur von Unterklassen wirklich Instanzen gibt. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

276 6.10 Generalisierung und Spezialisierung Klassendefinition von MSTaxiAnzeige: PasteUpMorph subclass: #MSTaxiAnzeige instancevariablenames: geraet classvariablenames: pooldictionaries: category: MS-Taxi-Ansicht Minimaler Konstruktor Initialisierung der Instanzvariablen: initialize "Initialisierung einer neuen Instanz" super initialize. "zu beobachtendes MSTaxiGeraet, zunaechst leer" geraet := nil. Der Konstruktor könnte auch noch Standardwerte etwa für Abmessungen und Hintergrundfarbe einer typischen Anzeige vorgeben. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

277 6.10 Generalisierung und Spezialisierung Setzen von Standardwerten Wie wird das z. B. in Morph»initialize gemacht? Studiere auch den Quelltext der darin aufgerufenen Methoden! Welche Standardfarbe hat ein Morph und welche Standardabmessungen? Standardmäßig ist ein Morph blau, 50 Pixel breit und 40 Pixel hoch. Hast du das gefunden? Stimmt das auch für ein PasteUpMorph? Erzeuge eines im Workspace: testfeld := PasteUpMorph new openinworld. "testfeld wieder loeschen" testfeld delete. Warum ist das so? Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

278 6.10 Generalisierung und Spezialisierung Überschreiben von Methoden Hat eine Methode einer Unterklasse denselben Namen wie eine Methode einer Oberklasse, wird bei einem Aufruf stets die Methode gemäß ihrer Definition in der gerade aktuellen Klasse ausgeführt und nicht so, wie sie in der jeweils anderen Klasse definiert ist. Beim Erzeugen eines PasteUpMorph wird in PasteUpMorph»initialize mit super initialize. letztlich der Konstruktor Morph»initialize der Oberklasse Morph aufgerufen. In Morph»initialize steht color := self defaultcolor. self ist das Objekt, das gerade erzeugt wird. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

279 6.10 Generalisierung und Spezialisierung In der Klasse Morph: defaultcolor "answer the default color/fill style for the receiver" ^ Color blue In der Klasse PasteUpMorph: defaultcolor "answer the default color/fill style for the receiver" ^ Color r: 0.8 g: 1.0 b: 0.6 Da ein PasteUpMorph erzeugt wird, erhält es letztere Farbe statt Blau. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

280 6.10 Generalisierung und Spezialisierung Auftrag Überschreibe in deiner Klasse MSTaxiAnzeige die beiden Methoden defaultbounds und defaultcolor so, dass eine Anzeige normal 200 Pixel breit und 100 Pixel hoch ist und eine Farbe deiner Wahl als Hintergrundfarbe besitzt. 49 Überprüfe dein Ergebnis in einem Workspace mit testanzeige := MSTaxiAnzeige new openinworld. Definiere eine Methode sfarbe, die eine Standard-Schriftfarbe deiner Wahl für Anzeigen bereitstellt. 49 Lies zu Farben den Klassenkommentar der Klasse Color. Klicke bei dieser Klasse im Browser auf Class und wähle das Protokoll named colors für einen Überblick über Farbnamen. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

281 6.10 Generalisierung und Spezialisierung Alle Unterklassen von MSTaxiAnzeige haben nun erst einmal diese defaultbounds als Abmessungen und defaultcolor als Hintergrundfarbe. Außerdem können sie mit Befehlen wie schriftzug color: self sfarbe. auf die von dir gewählte Schriftfarbe zugreifen. Bei Bedarf aber kannst du die Methoden für die Standardfarben und -maße in Unterklassen auch erneut überschreiben. Der große Vorteil solcher Standardmethoden besteht darin, dass du ggf. nur an einer einzigen Stelle etwas zu ändern brauchst, um etwa die Farbe zahlreicher Elemente anzupassen, z. B. sämtlicher Beschriftungen einer Anzeige. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

282 6.10 Generalisierung und Spezialisierung Auftrag Mache die Klassen MSTaxileuchtenAnzeige und MSTaxameterAnzeige zu Unterklassen von MSTaxiAnzeige. Überschreibe die Methoden defaultbounds, defaultcolor und sfarbe jeweils geeignet. Passe die Konstruktoren der beiden Klassen an die neue Situation an. Beachte insbesondere, dass die Anzeigen nun selbst auch Unterklassen von PasteUpMorph sind! Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

283 6.10 Generalisierung und Spezialisierung MSTaxileuchtenAnzeige MSTaxiAnzeige subclass: #MSTaxileuchtenAnzeige instancevariablenames: label classvariablenames: pooldictionaries: category: MS-Taxi-Ansicht Standardwerte defaultbounds ^ 0 corner: 80 defaultcolor "Hintergrundfarbe" ^ Color black. sfarbe "Farbe des Schriftzugs" ^ Color yellow. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

284 6.10 Generalisierung und Spezialisierung Konstruktor Auftrag initialize "Initialisierung einer neuen Instanz" super initialize. "Beschriftung -- Fettdruck" label := LabelMorph new. label font: (LogicalFont familyname: Arial pointsize: 48); emphasis: 1; color: self sfarbe; contents: self schriftzug. "Zentrierung im Feld" self addmorphcentered: label. "sperre Schriftzug gegen Mauszeiger" label lock. Wie muss der Quelltext der Methode MSTaxileuchtenAnzeige»schriftzug lauten? Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

285 6.10 Generalisierung und Spezialisierung Erzeuge im Workspace eine Taxileuchtenanzeige und teste sie: testanzeige := MSTaxileuchtenAnzeige new. testanzeige openinworld. testanzeige aktualisieredich. Was passiert? Vermutlich gar nichts weder eine Veränderung der Anzeige, noch eine Fehlermeldung. MSTaxileuchtenAnzeige erbt die Methode aktualisieredich von der Oberklasse MSTaxiAnzeige. Daher versteht die testanzeige diese Nachricht keine Fehlermeldung. MSTaxiAnzeige»aktualisiereDich hat aber einen leeren Methodenrumpf. Deshalb passiert nichts. Stellt das ein Problem dar? Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

286 6.10 Generalisierung und Spezialisierung Problem Was bei aktualisieredich passieren soll, hängt vom jeweiligen Gerät ab. Sinnvolle Vorgaben in der allgemeinen Oberklasse MSTaxiAnzeige sind daher nicht möglich. Jede konkrete Unterklasse muss die Methode (auf ihre eigene Art und Weise) beherrschen. Daher ist es sinnvoll, diese Methode in der allgemeinen Oberklasse vorzusehen. Falls du als Entwickler aber bei einer Unterklasse vergisst, aktualisieredich zu programmieren, solltest du von deiner Entwicklungsumgebung automatisch darauf hingewiesen werden. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

287 6.10 Generalisierung und Spezialisierung Lösung: abstrakte Methoden MSTaxiAnzeige»aktualisiereDich muss so aussehen: aktualisieredich "Aktualisierung der Anzeige - abstrakt" self subclassresponsibility. Teste die Aktualisierung nochmals mit testanzeige. Du solltest nun diese Meldung erhalten: Es wurde die von MSTaxiAnzeige geerbte Methode aktualisieredich ausgeführt. Diese muss überschrieben werden. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

288 6.11 Verzweigung bedingte Anweisungen Unter einer Verzweigung oder bedingten Anweisung versteht man ein Konstrukt der Form einseitige Verzweigung wenn Bedingung, dann Aktion oder zweiseitige Verzweigung wenn Bedingung, dann Aktion, sonst Alternative Flussdiagramm WAHR Aktion Bedingung FALSCH Alternative Struktogramm Bedingung WAHR FALSCH Aktion Alternative Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

289 6.11 Verzweigung bedingte Anweisungen Eine Bedingung ist ein boolescher Ausdruck, d. h. sie liefert den Wert true oder false. Ein Beispiel für Bedingungen sind Vergleiche, evtl. verknüpft durch logische Operatoren: Die Zahl x liegt zwischen 5 und 13. (5<=x) & (x<=13) Die Zahl y ist ein Vielfaches von 5. y\\5 = 0 Die Zahl z ist ungerade oder größer als 100. (z\\2 ~= 0) (z > 100) Das Wort name ist weder Hans noch Elke. (name ~= Hans ) & (name ~= Elke ) oder 50 ((name = Hans ) (name = Elke )) not 50 Die Nachricht not kehrt einen booleschen Wert um: true not ergibt false und umgekehrt. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

290 6.11 Verzweigung bedingte Anweisungen Manche Klassen (z. B. alle Literale) bieten in den Protokollen comparing und testing weitere Methoden, die als Bedingungen taugen, z. B. Die ganze Zahl x ist durch die ganze Zahl y teilbar. x isdivisibleby: y Die Zahl z ist gerade. z even Das Wort name beginnt mit Small. name beginswith: Small Das Zeichen zeichen ist eine Ziffer. zeichen isdigit Das vierte Zeichen im Wort name ist kein Buchstabe (name at: 4) isletter not Die MSTaxileuchte testleuchte ist an testleuchte istan Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

291 6.11 Verzweigung bedingte Anweisungen Teste die vorangegangenen Beispiele in einem Workspace, indem du dort den auftretenden Variablen erst einen typischen Wert zuordnest, dann die Bedingung schreibst, alles auswählst und dann mit Alt-p anzeigen lässt, z. B. name := Heidschnucke. name beginswith: Small Entwickle folgende Bedingungen und teste sie mit guten und schlechten Werten: 51 Eine Zahl ist durch 7 teilbar, aber nicht positiv. Eine Zahl liegt zwischen 0 und 4 oder -7 und -3. Bis auf Groß- und Kleinschreibung lautet ein Wort smalltalk. Ein Wort enthält einen Bindestrich. Ein Wort hat höchstens 18 Zeichen, enthält kein Leerzeichen und beginnt mit einem Kleinbuchstaben. 51 Hinweis: Manchmal findet sich die passende Methode in einer Oberklasse! Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

292 6.11 Verzweigung bedingte Anweisungen Bedingte Anweisungen in Smalltalk (Bedingung) iftrue: [Anweisungsblock]. (Bedingung) iffalse: [Anweisungsblock]. (Bedingung) iftrue: [Anweisungsblock] iffalse: [Alternativblock]. (Bedingung) iffalse: [Anweisungsblock] iftrue: [Alternativblock]. Ein Beispiel 52 x := 100 atrandom. (x > 50) iftrue: [Transcript cr; show: x asstring, : gewonnen!.] iffalse: [Transcript cr; show: x asstring, : leider verloren.]. 52 Öffne ein Transcript und probiere es in einem Workspace aus! Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

293 6.11 Verzweigung bedingte Anweisungen Auftrag Implementiere MSTaxileuchtenAnzeige»aktualisiereDich gemäß folgendem Struktogramm: aktualisieredich WAHR geraet existiert? geraet ist an? WAHR FALSCH aktiviere label deaktiviere label FALSCH Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

294 6.11 Verzweigung bedingte Anweisungen Auftrag Erzeuge im Workspace eine Taxileuchte sowie eine TaxileuchtenAnzeige und mache die Leuchte mittels Aufruf der Set-Methode geraet: zum Gerät der Anzeige. Öffne einen Inspektor für die Leuchte, damit du sehen kannst, ob sie an oder aus ist. Lass dann vom Workspace aus im Wechsel die Leuchte umschalten und die Anzeige sich aktualisieren. Passt alles, wie gewünscht? Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

295 6.12 Stepping periodische Aktivitäten MSTaxileuchtenAnzeige»aktualisiereDich kann z. B. so aussehen: aktualisieredich "gibt es das geraet?" self geraet ifnotnil: [ "Anpassung von Schrift und Hintergrund an den Zustand des geraetes" ( self geraet istan ) iftrue: [ label enable. self color: self defaultcolor.] iffalse: [ label disable. self color: label color.]. ]. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

296 6.12 Stepping periodische Aktivitäten Es wäre doch praktisch, wenn sich die Anzeige automatisch aktualisieren würde, sobald sich der Zustand des Gerätes ändert. Da MSTaxiAnzeige eine Unterklasse von PasteUpMorph ist, erbt die Klasse alles Nötige von Morph: step eine Methode, die periodisch ausgeführt wird (in Etoys sind das die laufenden Skripte) steptime die Zeitdauer in Millisekunden zwischen den Wiederholungen von step isstepping liefert true, falls step gerade periodisch läuft start startet die periodische Ausführung von step (in der Regel passiert das automatisch, wenn ein Morph in der Welt erscheint) stop beendet die periodische Ausführung Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

297 6.12 Stepping periodische Aktivitäten Auftrag Lies den Quelltext all dieser Methoden in der Klasse Morph. Wähle in deiner Oberklasse MSTaxiAnzeige in der Protokollspalte -- all -- aus und überschreibe die beiden Methoden step und steptime: step enthält als einzigen Befehl den Aufruf der Methode aktualisieredich. steptime sollte z. B. 100 Millisekunden für zehn Durchläufe pro Sekunde zurückgeben. Sortiere die beiden Methoden mit Categorize automatically in ihre Protokolle ein. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

298 6.12 Stepping periodische Aktivitäten Auftrag Schicke deiner Taxileuchte vom Workspace aus oder auch mit einem SimpleButtonMorph die Nachricht schalteum. Beobachte die TaxileuchtenAnzeige. Falls sich die Anzeige nicht ändert, überprüfe, ob sie wirklich deine Leuchte als Gerät beobachtet und ob sie wirklich läuft (isstepping), sende ihr dann ggf. die Nachricht start oder erzeuge eine neue Anzeige für die Leuchte. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

299 6.12 Stepping periodische Aktivitäten Die beiden Methoden der Klasse MSTaxiAnzeige sollten folgendermaßen aussehen: step Protokoll stepping 1 step 2 "periodische zu wiederholende Aktivitaeten" 3 "automatische Aktualisierung" 4 self aktualisieredich. steptime Protokoll testing 1 steptime 2 "Zeitdauer in Millisekunden fuer 3 automatische Wiederholung" 4 ^ 100. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

300 6.13 Schleifen, Wiederholungen, Iteratoren Bei der TaxameterAnzeige gibt es im Unterschied zur TaxileuchtenAnzeige mehrere Labels, die aktuell zu halten sind. Elegant lässt sich so etwas mit einer Wiederholung (Schleife) lösen: geraet ist an? WAHR FALSCH für alle label für alle label aktiviere label deaktiviere label Welche Schleifenkonstrukte gibt es in Smalltalk? Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

301 6.13 Schleifen, Wiederholungen, Iteratoren Probiere die folgenden Beispiele im Workspace aus! Beachte beim Ausführen (Do it), dass du stets alle Zeilen auf einmal markierst, die zu einer Schleife gehören. Fünfmal dasselbe: 1 Transcript open. 2 5 timesrepeat: [ 3 Transcript show: Smalltalk rules! ;cr. 4 ]. Für fünf Zahlen das Gleiche: 1 Transcript clear. 2 1 to: 5 do: [ :zahl 3 Transcript show: Zahl, zahl asstring ;cr. 4 ]. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

302 6.13 Schleifen, Wiederholungen, Iteratoren Für hundert Zahlen etwas mehr: 1 Transcript clear. 2 1 to: 100 do: [ :zahl 3 Transcript show: zahl squared. 4 Transcript show: Character tab. 5 ]. Um welche Zahlen geht es hier? 1 Transcript clear to: 100 by: 3 do: [ :zahl 3 Transcript show: zahl asstring, 4 zum Quadrat ist, 5 zahl squared asstring. 6 Transcript cr. 7 ]. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

303 6.13 Schleifen, Wiederholungen, Iteratoren Eine lokale Hilfsvariable (Zeile 4) im Schleifenblock: 1 liste := OrderedCollection new to: 100 do: [ :zahl 4 ellipse 5 ellipse := EllipseMorph new. 6 ellipse position: zahl@(0.05 * zahl squared). 7 ellipse openinworld. 8 liste add: ellipse. 9 ]. Die Hilfsvariable ist nur innerhalb des Blocks gültig: 1 var := nix. 2 Transcript show: var; cr. 3 5 to: 7 do: [ :zahl 4 var 5 var := zahl. 6 Transcript show: var; cr. 7 ]. 8 Transcript show: var; cr. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

304 6.13 Schleifen, Wiederholungen, Iteratoren Iteration über eine Liste: 1 Transcript clear. 2 liste do: [ :figur 3 Transcript show: figur position; cr. 4 ]. Klar, was hier passieren wird? 1 liste do: [ :figur 2 figur position: figur position * (5@1). 3 ]. Objekte wieder verstecken oder vergessen: 1 "Entfernen der Ellipsen vom Bildschirm" 2 liste do: [ :element element delete.]. 3 "Leeren der Liste -- die Objekte selbst 4 werden nicht geloescht, koennen danach aber 5 nicht mehr ueber die Liste angesprochen werden!" 6 liste removeall. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

305 6.13 Schleifen, Wiederholungen, Iteratoren Falls du deine Ellipsen nicht mehr ansprechen kannst: 1 "Liste aller Objekte in der Welt" 2 World submorphs do: [ :ding 3 "gehoert ding zur Klasse EllipseMorph?" 4 (ding iskindof: EllipseMorph) iftrue: [ 5 ding delete. 6 ]. 7 ]. Jeder Morph hat diese beiden Attribute: submorphs die Liste aller Morphe, die in ihn eingebettet / enthalten sind owner der Morph, in dem er selbst eingebettet / enthalten ist Jedes Objekt versteht diese Nachricht: iskindof: EineKlasse ergibt true, falls das Objekt zu dieser Klasse oder einer Unterklasse davon gehört Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

306 6.13 Schleifen, Wiederholungen, Iteratoren Wiederholung, solange: 1 ball := EllipseMorph new. 2 ball openinworld. 3 "[]fork. sorgt dafuer, dass du auch etwas siehst" 4 [ 5 [ball position x < (World right - ball width).] 6 whiletrue: [ 7 ball position: ball position + (2@1). 8 (Delay forseconds: 0.01) wait.]. 9 ] fork. Wiederholung, bis: 1 [ 2 [ball position x < 1.] whilefalse: [ 3 ball position: ball position / (Delay forseconds: 0.2) wait.]. 5 ] fork. 6 7 ball position: 0@0. 8 ball delete. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

307 6.13 Schleifen, Wiederholungen, Iteratoren Zählschleife zahl timesrepeat: [ Anweisungsblock ]. Der Anweisungsblock wird zahl-mal identisch wiederholt. Beachte den Punkt nach dem Anweisungsblock. Fünfmal dasselbe: 1 Transcript open. 2 5 timesrepeat: [ 3 Transcript show: Smalltalk rules! ;cr. 4 ]. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

308 6.13 Schleifen, Wiederholungen, Iteratoren Intervalldurchlauf startzahl to: endzahl do: [ :zahl Anweisungen mit zahl ]. startzahl to: endzahl by: schritt do: [ :zahl Anweisungen mit zahl ]. 2 to: 10 ist die Folge aller ganzen Zahlen von 2 bis 10, also 2, 3, 4, 5, 6, 7, 8, 9, to: 10 by: 3 ist die Folge der ganzen Zahlen von 2 bis 10 in Dreierschritten, also 2, 5, 8. do: bewirkt, dass der nachfolgende Anweisungsblock für jede Zahl aus der Folge einmal ausgeführt wird. zahl ist eine Blockvariable, die bei jedem Schleifendurchlauf den Wert der gerade aktuellen Zahl aus der Folge annimmt. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

309 6.13 Schleifen, Wiederholungen, Iteratoren Für jede dritte Zahl von 90 bis 100 das Gleiche: 1 Transcript clear to: 100 by: 3 do: [ :zahl 3 Transcript show: zahl asstring, 4 zum Quadrat ist, 5 zahl squared asstring. 6 Transcript cr. 7 ]. Blockvariablen [ :bvar1 :bvar2 Anweisungen mit bvar1 und bvar2 ]. Blockvariablen werden im Anweisungsblock mit vorangestelltem Doppelpunkt vor einem senkrechten Trennstrich deklariert. Sie sind nur innerhalb dieses Anweisungsblocks gültig. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

310 6.13 Schleifen, Wiederholungen, Iteratoren Neben Blockvariablen kann ein Anweisungsblock auch temporäre Hilfsvariablen beinhalten, um vorübergehend Objekte ansprechen oder Zwischenergebnisse speichern zu können: 1 liste := OrderedCollection new to: 100 do: [ :zahl 4 ellipse 5 ellipse := EllipseMorph new. 6 ellipse position: zahl@(0.05 * zahl squared). 7 ellipse openinworld. 8 liste add: ellipse. 9 ]. Blockvariablen erhalten ihre Werte von außerhalb des Blocks, etwa durch einen Iterator wie do:. Hilfsvariablen erhalten ihre Werte aus einer Wertzuweisung. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

311 6.13 Schleifen, Wiederholungen, Iteratoren Iteratoren zu Kollektionen einekollektion do: [ :element Anweisungen mit element ]. einekollektion muss zu einer Unterklasse von Collection gehören. element nimmt als Blockvariable der Reihe nach jedes Element der Kollektion als Wert an. do: ist ein Iterator Mache etwas für jedes Element der Kollektion. Weitere nützliche Iteratoren sind collect:, select:, reject: und detect:. Lies ggf. den Kommentar in der jeweiligen Methode der Klasse Collection. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

312 6.13 Schleifen, Wiederholungen, Iteratoren 1 liste do: [ :figur 2 figur position: figur position * (5@1). 3 ]. Kollektionen sind ein äußerst mächtiges programmiersprachliches Konzept. Smalltalk kennt eine ganze Reihe von Kollektionen, die alle Unterklassen der abstrakten Klasse Collection sind: ArrayedCollection Array Bitmap String Text SequenceableCollection Collection Bag Interval LinkedList OrderedCollection Symbol SortedCollection Set Dictionary Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

313 6.13 Schleifen, Wiederholungen, Iteratoren Auftrag Schreibe für die Klasse MSTaxameterAnzeige den Konstruktor initialize neu. Führe zwei Instanzvariablen labelliste und knopfliste ein. Da die Labels bei aktualisieredich jeweils eigens angesprochen werden müssen, sind auch Instanzvariablen für die einzelnen Labels sinnvoll. Für die einzelnen Schaltknöpfe (an, aus, Tarif weiterschalten) genügen temporäre Hilfsvariablen. Füge alle Labels in die Labelliste und alle Schaltknöpfe in die Knopfliste ein. Nutze die Labelliste und einen Iterator, um z. B. für alle Labels eine einheitliche Schriftart und -farbe zu setzen. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

314 6.13 Schleifen, Wiederholungen, Iteratoren MSTaxileuchtenAnzeige»initialize kann so aussehen: Überschreibe für Größe und 1 initialize 2 "Initialisierung einer TaxameterAnzeige ohne Taxameter" 3 label anknopf ausknopf tarifknopf Farbe defaultbounds und 4 super initialize. 5 "vorerst kein Taxameter" 6 geraet := nil. defaultcolor geeignet! 7 "Anzeigefelder mit Startbeschriftungen" 8 labelliste := OrderedCollection new. 9 #( Preis: 0.00 Tarif: kein Tarif GdGeb: kein Tarif kmpr : kein Tarif minpr: kein Tarif ) do: [ :text 10 label := LabelMorph new contents: text. 11 labelliste add: label. 12 ]. 13 "Einen Ueberblick ueber die Schriften bietet StringMorph new changefont. Dort update." 14 labelliste do: [ :element 15 element font: (LogicalFont familyname: Courier New pointsize: 24); 16 color: self sfarbe. 17 "labels einfuegen und sperren" 18 self addmorph: element. 19 element lock. 20 ]. 21 "labels untereinander anordnen" 22 1 to: labelliste size do: [ :i 23 label := labelliste at: i. 24 label position: (-20 + (i*30)). 25 ]. 26 "Schaltknoepfe" 27 anknopf := SimpleButtonMorph new Zeile Iteration über die 28 target: self geraet; 29 actionselector: #schalteein; 30 label: an ; labelliste 31 useroundedcorners; 32 position: 10@ ausknopf := SimpleButtonMorph new 34 target: self geraet; Zeile Intervalldurchlauf 35 actionselector: #schalteaus; 36 label: aus ; 37 useroundedcorners; 38 position: 50@ tarifknopf := SimpleButtonMorph new 40 target: self geraet; 41 actionselector: #schaltetarifweiter; 42 label: Tarifwahl ; 43 useroundedcorners; 44 position: 100@ knopfliste := OrderedCollection new. Zeile 49 Iteration über die 46 knopfliste add: anknopf; 47 add: ausknopf; 48 add: tarifknopf. 49 knopfliste do: [ :knopf self addmorph: knopf.]. Zeile 9 12 Iteration über ein Array verschiedener Zeichenketten über die Indizes der labelliste Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

315 6.13 Schleifen, Wiederholungen, Iteratoren Auftrag Schreibe für die Klasse MSTaxameterAnzeige eine Methode aktualisieredich. Lege dazu auch ein Protokoll anzeige an. Prüfe in der Methode, ob es ein Taxameter gibt und ob dort auch ein Tarif eingestellt ist. Lasse die einzelnen Labels dann die gerade aktuellen Attributwerte des Taxameters anzeigen. Nutze die Labelliste und Iteratoren, um passend zu an bzw. aus alle Labels zu (de-)aktivieren. Probiere die Schaltknöpfe aus und sende ggf. vom Workspace aus ein aktualisieredich oder start an die TaxameterAnzeige, falls isstepping den Wert false liefert. Nichts passiert oder Fehlermeldungen? Hat deine Anzeige ein Gerät? Falls ja, lies weiter! Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

316 6.13 Schleifen, Wiederholungen, Iteratoren In MSTaxameterAnzeige»initialize wird der Wert von geraet auf nil gesetzt. Anschließend erhalten die Schaltknöpfe als target den Wert von geraet, was in dem Moment aber nil ist. Setzt du mit MSTaxameterAnzeige»geraet: später den Wert von geraet auf ein Taxameter, ändert sich das target der Schaltknöpfe aber nicht. Was tun? Überschreibe die Set-Methode geraet: in der Klasse MSTaxameterAnzeige: 1 geraet: anobject 2 geraet := anobject. 3 "ergaenzt, falls MSTaxameter>>waehleTarif 4 bei leerem Tarif nichts tut" 5 (geraet iskindof: MSTaxameter) iftrue: [ 6 geraet waehletarif: 1.]. 7 "ergaenzt, damit die Schaltknoepfe 8 das neue Taxameter steuern" 9 knopfliste do: [ :knopf knopf target: geraet.]. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

317 6.13 Schleifen, Wiederholungen, Iteratoren Bedingte Wiederholung While-Schleife Wiederholung, solange etwas zutrifft [Bedingung] whiletrue: [Anweisungsblock]. Wiederholung, bis etwas zutrifft [Bedingung] whilefalse: [Anweisungsblock]. Vor jeder Ausführung des Anweisungsblocks wird die Bedingung überprüft. Ist sie wahr (bzw. falsch), wird der Anweisungsblock erneut ausgeführt. Beachte, dass hier auch die Bedingung in eckigen Klammern stehen muss. Hoch- und Herunterzählen, Startwert 1: 1 zahl := 1. 2 [zahl < 10 ] whiletrue: [ zahl := zahl + 1. ]. 3 [zahl < 1 ] whilefalse: [ zahl := zahl - 1. ]. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

318 6.13 Schleifen, Wiederholungen, Iteratoren Tricks für Animationen Einen Moment warten Delay (Delay forseconds: einedezimalzahl) wait. einedezimalzahl ist die Wartezeit in Sekunden kann an jeder Stelle in einer Methode stehen Mehreres gleichzeitig fork [ Anweisungsblock ] fork. Schleifen z. B. blockieren während ihrer Ausführung andere Dinge, etwa die Bildschirmaktualisierung. Packt man Anweisungen mit eckigen Klammer in einen Block und schickt diesem die Nachricht fork, wird der Anweisungsblock parallel zu anderen in einem eigenen Thread ausgeführt. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

319 6.13 Schleifen, Wiederholungen, Iteratoren Auftrag Lege in der Kategorie MS-Taxi-Modell eine Klasse MSTaxi an (mit deinen Initialen) MSTaxi soll zwei Instanzvariablen position und v (Geschwindigkeit) vom Typ Point haben, also mit Werten der Form 5@10. Außerdem braucht es eine boolesche Instanzvariable unterwegs. Lege ein Protokoll steuerung und darin eine Methoden fahrezu: neueposition an. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

320 6.13 Schleifen, Wiederholungen, Iteratoren Auftrag In der Methode fahrezu: neueposition soll folgendes passieren: Prüfe, ob du unterwegs bist. Falls nein, setze unterwegs auf true und fahre los: Setze v auf (neueposition - position) normalized (Lies den Quelltext von Point»normalized!). Ändere die Position des Taxis so lange um v, bis der Abstand position dist: neueposition von position zu neueposition kleiner als 5 ist. Setze unterwegs auf wieder auf false. Nutze fork und (Delay forseconds:)wait! Erzeuge im Workspace ein Taxi und öffne einen Inspektor, um die position zu beobachten. Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

321 6.14 Plan I in Konstruktor des Taxameters einfach tarif := Tarif new. und sehen, was beim Speichern passiert. OrderedCollection für die Tarifliste -> add: at: indexof: size Klammern zur Gliederung der Reihenfolge beim add:-befehlen im Taxameter-Konstruktor Klassenhierarchie für Anzeigen MSTaxameterAnzeige mit mehreren Labels und SimplebuttonMorphs für Tarifweiterschalten sowie An/Aus Konstruktor mit temporärer Hilfsvariable? MSTaxameterAnzeige führt zu Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen self submorphs do: [:subm (subm iskindof: #LabelMorph) Stepping Schleifen Iteratoren und Schleifen Schleifenunterbrechung Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

322 6.14 Plan II Animationen []fork. -> threads (Delay forseconds: anum) wait. TransformationMorph, addflexshell, removeflexshell Pharo II Boolesche Werte Konstruktor II Listen Arithmetik Vergleiche Logik Priorität von Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isnil und ifnotnil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung

323 Teil VII Java I Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

324 Anhang Überblick Grundkonzepte Ablaufmodelliierung Smalltalk I die Entwicklungsumgebung Squeak Smalltalk II Grundzüge der Programmiersprache Pharo I Smalltalk-Entwicklung mit Pharo Pharo II Grundzüge von Smalltalk Java I Klassen in BlueJ anlegen Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand Java II JGUIToolbox und weitere Konstrukte Zustandsmodellierung

325 Gliederung Java I Klassen in BlueJ anlegen Taxifahren BlueJ Klassengrundgerüst in Java Taxileuchte Konstruktor in Java Variablen in Java Einfache Datentypen in Java Datenkapselung Sichtbarkeit in Java Accessoren Zugriff auf Variablen Angabe von Parameterwerten Boolesche Werte und Umschalten Konstruktoren mit Parametern Überladen von Variablennamen this das aktuelle Objekt Taxi Zwischenstand Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

326 7.1 Taxifahren Bei den Grundkonzepten kam im Abschnitt 12 zur Datenkapselung ein Taxifahrer mit seiner Schuhgröße vor. Das Modell von dort soll in den folgenden Abschnitten ausgebaut und in der Programmiersprache Java umgesetzt, man sagt auch implementiert werden. Entwirf ein UML-Klassendiagramm zum Taxifahren. Welche Klassen sind beteiligt? Was ist an einem Taxi anders als an einem gewöhnlichen PKW? Wonach richtet sich der Fahrpreis? Entwirf Klassenkarten der beteiligten Klassen. Beachte die Datenkapselung (Abschnitt 12). Vergiss die Schuhgröße nicht. Zum Vergleich findest du auf den beiden folgenden Seiten eine mögliche Lösung. Ergänze dein Modell ggf. entsprechend. Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

327 7.1 Taxifahren steuert > Person 1 Taxifahrer fährt_zu > 1 1 Taxi Taxileuchte Fahrgast will_zu > 1 Ort 1 Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst wartet_bei > Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand transportiert > 1 < bestellt 1 Taxameter 1 benutzt > Tarif

328 7.1 Taxifahren Taxifahrer - schuhgröße - geld - taxi - steuere(taxi,ziel) - veränderegeld(betrag) + sageschuhgröße() + fahre(passagier,start,ziel) + gibwechselgeld(betrag,bezahlt) Taxi - nummer - km - leuchte - taxameter + gibnummer() + gibleuchte() + gibtaxameter() + gibkm() - erhöhekm(betrag) + fahre() Fahrgast - startort - zielort - geld - istzufrieden + bestelle(taxifahrer) - veränderegeld(betrag) + gibstartort() + gibzielort() + bezahle(betrag) - wechslezufriedenheit() - zahletrinkgeld(betrag) Taxileuchte - istan + gibistan() + wechslezustand() Tarif - grundgebühr - km_preis - min_preis + gibgrundgebühr() + gibkmpreis() + gibminpreis() Person - name - ort Java I Taxifahren BlueJ + gibname() Klassen anlegen + gibort() Projektkommentar Ort - name - position Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen + gibname() + gibposition() Datentypen Sichtbarkeit Accessoren Taxameter - tarif Parameterwerte Boolesche Werte Konstruktor II Überladen - betrag this Zwischenstand - istan + gibtarif() + setzetarif(tarif) + wechslezustand() + ermittlebetrag() - erhöhebetrag(betrag) + gibbetrag()

329 7.2 BlueJ... eine interaktive Entwicklungsumgebung zum Erlernen von Java BlueJ BlueJ-Anleitung in verschiedenen Sprachen Java-Kurs Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

330 7.2.1 BlueJ Klassen anlegen Abstrakte Klasse Eine abstrakte Klasse hat keine Instanzen. Klassennamen Beginn mit einem Großbuchstaben A Z, a z, 0 9, _ CamelCase Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand Person ist eine abstrakte Oberklasse zu Taxifahrer und Fahrgast: Im ganzen Projekt wird keine allgemeine Person vorkommen, nur Spezialisten wie Taxifahrer oder Fahrgäste.

331 7.2.2 BlueJ Projektkommentar Kommentare sind beim Programmieren unerlässlich! für den Programmierer wie für den Benutzer des Programms für das gesamte Projekt wie innerhalb des Programmquelltextes zum Verstehen des Projektes wie für die Fehlersuche oder Erweiterung Datum/Version und Beschreibung aktuell halten! Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

332 7.2.3 BlueJ Klassenbeziehungen Pfeile beim Planen ziehen (Quelltext wird teilweise angepasst) oder Pfeile entstehen automatisch beim Ändern des Quelltextes Entfernen mit Rechtsklick BlueJ kann zwei Arten von Beziehungen darstellen: Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand Abhängigkeit Eine Klasse benutzt die Zielklasse. Im Quelltext treten Instanzen der Zielklasse auf. Generalisierung Unterklasse einer anderen Klasse

333 7.2.4 BlueJ Instanzen erzeugen Rechtsklick auf der Klassenkarte Konstruktoraufruf new Klassenname() Objektnamen Beginn mit einem Kleinbuchstaben a z, A Z, 0 9, _ camelcase Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand Objektkarte unten in der Objektbank.

334 hier nur eine einzige Variable x Datentyp: int ganze Zahl (integer) Sichtbarkeit: private BlueJ Instanzen untersuchen Rechtsklick auf der Objektkarte von Oberklassen geerbte Methoden hier nur Object die Signatur vorhandener eigener Methoden int samplemethod(int y) zum Aufruf einfach anklicken inspect bzw. Untersuchen Objektinspektor Der Inspektor bietet Zugriff von außen auf die Werte aller Instanzvariablen eines Objektes. Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

335 7.2.6 BlueJ Quelltext verändern Doppelklick oder Rechtsklick auf der Klassenkarte öffnet den Editor Für Java genügt auch ein gewöhnlicher Texteditor. Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

336 7.3 Klassengrundgerüst in Java 1 /** 2 * Write a description of class Testklasse here. 3 * 4 (your name) 5 (a version number or a date) 6 */ 7 public class Testklasse 8 { 9 // instance variables - replace the example below with your own 10 private int x; /** 13 * Constructor for objects of class Testklasse 14 */ 15 public Testklasse() 16 { 17 // initialise instance variables 18 x = 0; 19 } /** 22 * An example of a method - replace this comment with your own 23 * 24 y a sample parameter for a method 25 the sum of x and y 26 */ 27 public int samplemethod(int y) 28 { 29 // put your code here 30 return x + y; 31 } 32 } Klassenkommentar Klassendefinition Deklaration der Instanzvariablen Konstruktor Methodenkommentar Methodendefinition Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

337 7.4 Taxileuchte 1 /** 2 * Eine Taxileuchte, die anzeigt, ob das Taxi besetzt ist (aus) oder frei (an). 3 * Nach der Erzeugung ist die Leuchte erst einmal aus. 4 * 5 () 6 ( ) 7 */ 8 public class Taxileuchte 9 { 10 // instance variables - replace the example below with your own 11 private boolean istan; /** 14 * Constructor for objects of class Taxileuchte 15 */ 16 public Taxileuchte() 17 { 18 // initialise instance variables 19 // Die Leuchte ist aus. 20 istan = false; 21 } 22 } 1 7 Klassenkommentar 8 22 minimale Klassendefinition Deklaration der Instanzvariablen mit Variablentyp Konstruktor Name = Klassenname! 20 Initialisierung der Instanzvariablen mit Startwerten Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

338 7.5 Konstruktor in Java Methode zur Erzeugung von Instanzen einer Klasse /** * Constructor for objects of class Taxileuchte */ public Taxileuchte() { // initialise instance variables // Die Leuchte ist aus. istan = false; } Name = Klassenname kein Rückgabetyp angegeben ggf. mit Parameterliste Initialisierung der Instanzvariablen mit Startwerten ggf. Aufruf von Startmethoden auf die Plätze! Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand Konstruktoraufruf objekt = new Klassenname(); objekt = new Klassenname(Parameterliste);

339 7.6 Variablen in Java private boolean istan; public Taxileuchte() { istan = false; } In Java wird jede Variable zunächst deklariert. Dann wird sie durch eine Wertzuweisung initialisiert. Variablennamen beginnen klein. Variablendeklaration Sichtbarkeit Datentyp Variablenname; private boolean istan; Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand Wertzuweisung Variablenname = Wert; istan = false;

340 7.7 Einfache Datentypen in Java Name Beschreibung Beispielwerte int ganze Zahl (32 Bit) double Gleitkommazahl (64 Bit) e13 boolean boolescher Wahrheitswert true false char einzelnes Schriftzeichen c 5 String Zeichenkette "Info 10" Objekttypen Jede Klasse ist als Datentyp geeignet. Deklaration: private int nummer; private String name; private Taxileuchte leuchte; private Tarif tarif; Initialisierung: nummer = 345; name = "Herbert"; leuchte = new Taxileuchte(); tarif = null; //leerer Wert Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

341 7.8 Datenkapselung Sichtbarkeit in Java Auftrag private public alle Instanzvariablen Methoden, die ein Objekt nur intern benötigt, die es nur selbst aufrufen kann Methoden, die auch von anderen Objekten aufgerufen werden können. Konstruktoren Klassendefinitionen Schreibe in BlueJ Variablendeklarationen und minimale Konstruktoren für alle Klassen deines Taxi-Projektes. Speichern und Überprüfen mit Compile Erzeuge Instanzen deiner Klassen und untersuche sie mit Inspektoren. Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

342 7.9 Accessoren Zugriff auf Variablen Get-Methode: Ausgabe des Variablenwertes 1 /** 2 * Ausgabe des aktuellen Tarifs 3 * 4 5 tarif 6 */ 7 public Tarif gibtarifaus() 8 { 9 // Wertausgabe 10 return tarif; 11 } Zeile 7 Methodensignatur: Rückgabewert vom Datentyp Tarif keine Parameter Zeile 10 Rückgabeanweisung (return) für den Wert der Instanzvariable tarif Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

343 7.9 Accessoren Zugriff auf Variablen Set-Methode: Verändern des Variablenwertes Java I Taxifahren BlueJ 1 /** 2 * Setzen des aktuellen Tarifs 3 * 4 Tarif neuertarif 5 6 */ 7 public void setzetarif(tarif neuertarif) 8 { 9 // Wertzuweisung 10 tarif = neuertarif; 11 } Zeile 7 Methodensignatur: kein Rückgabewert (Datentyp void) Parameter neuertarif vom Datentyp Tarif Zeile 10 Wertzuweisung (=) des Parameterwertes neuertarif an die Instanzvariable tarif Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

344 7.9 Accessoren Zugriff auf Variablen Auftrag Schreibe in BlueJ bei den Klassen, auf deren Instanzvariablen andere Objekte zugreifen können müssen, die notwendigen Get- und Set-Methoden. Schreibe diese Methoden nicht, wo sie nicht nötig sind Datenschutz! Erzeuge Instanzen deiner Klassen und probiere deren neue Methoden aus (Rechtsklick auf der Objektkarte). Gibt es speziell beim Aufruf der Set-Methoden Probleme? Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

345 7.10 Angabe von Parameterwerten Eine Methode mit Parametern methodenname(parametertyp parametername) verlangt beim Aufruf die Angabe eines Wertes: int, double: eine Zahl boolean: true oder false char: ein Schriftzeichen in einfachen Anführungszeichen String: eine Zeichenkette in doppelten Anführungszeichen sonstige Klasse: eine Instanz der Klasse Name einer Instanz, die bereits erzeugt wurde und z.b. in BlueJ als Objektkarte vorliegt Konstruktoraufruf für eine neue Instanz: new Klasse(Parameterliste) immer möglich: Name einer Variablen vom richtigen Typ Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

346 Der Verneinungsoperator! (nicht) kann auch vor Variablen wie istan mit booleschem Wert stehen Boolesche Werte und Umschalten Boolesche Werte (Wahrheitswerte) eignen sich als Antworten auf Ja-Nein-Fragen: Stimmt eine Aussage oder stimmt sie nicht? Ja oder Nein? Wahr oder falsch? Boolesche Werte in Java true oder false Boolesche Werte lassen sich negieren verneinen, in ihr Gegenteil umkehren Negation in Java Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand!true ergibt false.!false ergibt true.

347 7.11 Boolesche Werte und Umschalten Umschalten mit Verzweigung Leuchte istan? WAHR FALSCH schalte Leuchte aus schalte Leuchte an Umschalten als Negation die elegante Lösung schalte Leuchte um Umsetzung durch Wertzuweisung an die Instanzvariable Negation in Java istan =!istan; Auftrag Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand Schreibe Taxileuchte.schalteUm() in BlueJ. Liefert diese Methode einen Rückgabewert? Teste die Methode mit geöffnetem Inspektor.

348 7.11 Boolesche Werte und Umschalten /** * Umschalten der Leuchte * keine Parameter kein Rueckgabewert */ public void schalteum() { // neuer Zustand ist das Gegenteil des alten Zustandes // Negation mit! istan =!istan; } Auftrag Schreibe auch die anderen Umschaltmethoden in deinem Taxiprojekt etwa die für die Zufriedenheit des Fahrgastes und teste sie, wobei du die Variablenwerte im geöffneten Inspektor beobachten kannst. Achte jeweils auf die Sichtbarkeit der Methode! Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

349 7.12 Konstruktoren mit Parametern Vermutlich sieht der Konstruktor der Klasse Tarif momentan etwa so aus: // instance variables private double grundgeb; private double km_preis; private double min_preis; /** * Constructor for objects of class Tarif * Standardtarif */ public Tarif() { // initialise instance variables grundgeb = 3.50; km_preis = 1.40; min_preis = 0.35; } Damit lässt sich nur ein fester Standardtarif erzeugen. Das Taxameter benötigt aber zumindest einen Tagund einen Nachttarif, vielleicht auch Gruppen- oder andere Sondertarife. Was tun? Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

350 7.12 Konstruktoren mit Parametern Java erlaubt auch Konstruktoren mit Parameterlisten. Auch kann eine Klasse mehrere Konstruktoren mit unterschiedlicher Signatur besitzen, z. B. /** * Constructor for objects of class Tarif * Standardtarif */ public Tarif() { // initialise instance variables grundgeb = 3.50; km_preis = 1.40; min_preis = 0.35; } /** * Constructor for objects of class Tarif * Wunschtarif */ public Tarif(double grundgeb, double km_preis, double min_preis) { // initialise instance variables grundgeb = grundgeb; km_preis = km_preis; min_preis = min_preis; } Übernimm die Konstruktoren für deine Tarif-Klasse. Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

351 7.12 Konstruktoren mit Parametern BlueJ bietet nun zum Erzeugen von Instanzen beide Konstruktoren an: Erzeuge mit beiden Konstruktoren Instanzen und untersuche sie mit Inspektoren. Passt alles? Beim Wunschtarif werden die eingegebenen Parameterwerte nicht übernommen. Warum? Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand public Tarif(double grundgeb, double km_preis, double min_preis) { // initialise instance variables grundgeb = grundgeb; km_preis = km_preis; min_preis = min_preis; }

352 7.13 Überladen von Variablennamen public Tarif(double grundgeb, double km_preis, double min_preis) { // initialise instance variables grundgeb = grundgeb; km_preis = km_preis; min_preis = min_preis; } Überladen Wenn lokale Variablen (Parameter) und Instanzvariablen den gleichen Namen tragen, werden die Instanzvariablen verschattet: Alle Variablenzugriffe innerhalb des Blocks beziehen sich nur auf die lokalen Variablen. Die Instanzvariablen werden nicht gelesen und bleiben unverändert, solange die lokalen Variablen gültig sind. Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand Auswege?

353 7.13 Überladen von Variablennamen Ausweg 1: andere Namen für die Parameter // instance variables private double grundgeb; private double km_preis; private double min_preis; /** * Constructor for objects of class Tarif * Wunschtarif mit anderen Parameternamen */ Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I public Tarif(double grundgeb_neu, double km_preis_neu, double min_preis_neu) Variablen { } // initialise instance variables grundgeb = grundgeb_neu; km_preis = km_preis_neu; min_preis = min_preis_neu; Nachteil: zusätzliche, umständliche Variablennamen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

354 7.14 this das aktuelle Objekt Ausweg 2: das Schlüsselwort this // instance variables private double grundgeb; private double km_preis; private double min_preis; /** * Constructor for objects of class Tarif * Wunschtarif */ public Tarif(double grundgeb, double km_preis, double min_preis) { // initialise instance variables // Parameternamensproblem durch this verbessern: this.grundgeb = grundgeb; this.km_preis = km_preis; this.min_preis = min_preis; } Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand this meint stets das aktuelle Objekt. Damit ist klar, dass die angegebene Instanzvariable gemeint ist und nicht die lokale Variable aus dem aktuellen Kontext.

355 7.14 this das aktuelle Objekt Auftrag Übernimm die Veränderungen der Konstruktoren der Klasse Tarif. Ergänze die Klasse Taxameter um Instanzvariablen für den aktuell eingestellten Tarif (Startwert null), einen Tagtarif und einen Nachttarif (Startwert zwei passende Tarife mit Grundgebühr, Kilometer- und Minutenpreis). Passe ggf. die Accessoren (get/set) an. Erzeuge eine Taxameter-Instanz und untersuche sie mit dem Inspektor. Kannst du auch die Tarife des Taxameters im Inspektor untersuchen? Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

356 7.15 Taxi Zwischenstand Vorschläge für die bisher behandelten Klassen Kommentare wurden weggelassen Taxileuchte 1 public class Taxileuchte 2 { 3 private boolean istan; 4 public Taxileuchte() 5 { 6 istan = false; 7 } 8 public boolean gibistan() 9 { 10 return istan; 11 } 12 public void schalteum() 13 { 14 istan =!istan; 15 } 16 } Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

357 7.15 Taxi Zwischenstand Tarif 1 2 public class Tarif { 3 private double grundgeb; Java I Taxifahren 4 private double km_preis; BlueJ 5 private double min_preis; Klassen anlegen 6 public Tarif() Projektkommentar 7 { Klassenbeziehungen 8 grundgeb = 3.50; Instanzen erzeugen Instanzen untersuchen 9 km_preis = 1.40; Quelltext verändern 10 min_preis = 0.35; Klassengrundgerüst 11 } Taxileuchte 12 public Tarif(double grundgeb, double km_preis, double min_preis) Konstruktor I 13 { Variablen Datentypen 14 this.grundgeb = grundgeb; Sichtbarkeit 15 this.km_preis = km_preis; Accessoren 16 this.min_preis = min_preis; Parameterwerte } public double gibgrundgebaus() Boolesche Werte Konstruktor II Überladen 19 { this 20 return grundgeb; Zwischenstand 21 } 22 public double gibkmpreisaus() 23 { 24 return km_preis; 25 } 26 public double gibminpreisaus() 27 { 28 return min_preis; 29 } 30 }

358 7.15 Taxi Zwischenstand Taxameter 1 public class Taxameter 2 { 3 private boolean istan; 4 private double betrag; 5 private Tarif tarif; 6 private Tarif tagtarif; 7 private Tarif nachttarif; 8 public Taxameter() 9 { 10 istan = false; 11 betrag = 0.00; 12 tarif = null; 13 tagtarif = new Tarif(3.00,1.70,0.50); 14 nachttarif = new Tarif(3.20,1.90,0.70); 15 } 16 public boolean gibistan() 17 { 18 return istan; 19 } 20 public void schalteum() 21 { 22 istan =!istan; 23 } 24 public double gibbetragaus() 25 { 26 return betrag; 27 } 28 public Tarif gibtarifaus() 29 { 30 return tarif; 31 } 32 public void setzetarif(tarif neuertarif) 33 { 34 tarif = neuertarif; 35 } 36 } Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand

359 Java II Referenzen Sammlungen Import Teil VIII JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Java II Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

360 Anhang Überblick Grundkonzepte Ablaufmodelliierung Smalltalk I die Entwicklungsumgebung Squeak Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Smalltalk II Grundzüge der Programmiersprache Pharo I Smalltalk-Entwicklung mit Pharo Pharo II Grundzüge von Smalltalk Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Java I Klassen in BlueJ anlegen Schleifenunterbrechung Java II JGUIToolbox und weitere Konstrukte Zustandsmodellierung

361 Gliederung Java II JGUIToolbox und weitere Konstrukte BlueJ Referenzen im Inspektor Objektsammlungen variabler Größe Import Bibliotheken benutzen Die JGUIToolbox Grafikkomponenten Vererbung Unterklassen anlegen Verzweigung in Java if else Taxameteranzeige Zeichenketten Konkatenation Geschachtelte Methodenaufrufe Taxianzeige Zwischenstand Taxitester eine Testklasse Lokale Variablen JGUIToolbox Fenster Thread.sleep Programm anhalten for while Bedingte Wiederholung continue / break Schleifenunterbrechung Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

362 8.1 BlueJ Referenzen im Inspektor Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

363 8.2 Objektsammlungen variabler Größe Das Taxameter kennt zwei (oder mehr) Tarife, zwischen denen der Taxifahrer umschalten kann. Wie stellt man an einem echten Taxameter den Tarif ein/um? mit einem (beschrifteten) Drehknopf, der bei jedem Tarif einrastet mit einem Druckknopf der zum nächsten Tarif weiterschaltet Wie implementiert man das in einer Programmiersprache? Wie implementiert man das in einer Programmiersprache so, dass wenig, oder besser gar kein weiterer Programmieraufwand nötig ist, wenn sich z.b. einmal die Anzahl der Tarife verändert? mit einer Objektsammlung, z. B. einer Liste Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

364 8.2 Objektsammlungen variabler Größe In Java gibt es für Listen z. B. die Klasse ArrayList variable Länge: Elemente können hinzugefügt oder entfernt werden. Indizierung: Die Elemente sind der Reihe nach durchnummeriert. Deklaration: private ArrayList<Elementtyp> liste; Initialisierung: liste = new ArrayList<Elementtyp>(); Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung Zwischen spitzen Klammern muss der Datentyp der Listenelemente angegeben werden, z. B.: private ArrayList<Tarif> tarifliste; tarifliste = new ArrayList<Tarif>();

365 8.3 Import Bibliotheken benutzen ArrayList gehört nicht zu den Standardklassen von Java, sondern zur Bibliothek oder dem Paket java.util. Bibliotheken bzw. darin enthaltende Klassen müssen in Java eingebunden werden. Dies geschieht mit einer import-anweisung import java.paket.klasse; import java.util.arraylist; Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung allererste Zeile in der Java-Datei vor den Klassendefinitionen In BlueJ finden sich Informationen zu Bibliotheken unter Hilfe Java Klassenbibliothek

366 8.3 Import Bibliotheken benutzen Auftrag Öffne in der BlueJ-Hilfe die Java-Klassenbibliothek. Wähle oben links das Paket java.util und dann unten links die Klasse ArrayList aus. Blättere rechts bis zum Method Summary und verschaffe dir einen Überblick über die Methoden der Klasse ArrayList. Erweitere den Konstruktor deiner Klasse Taxameter um eine Instanzvariable tarifliste. Sorge dafür, dass die vorhandenen Tarife (Tag/Nacht/...) zur Tarifliste hinzugefügt werden. Überprüfe deine Veränderungen mit einem Inspektor für eine Taxameter-Instanz! Wie viele Elemente hat die Tarifliste? Welche Nummer (Index) hat der erste Tarif in der Liste? Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

367 8.3 Import Bibliotheken benutzen Auftrag Programmiere eine Methode Taxameter.waehleTarif(nummer), die die Eingabe einer Zahl verlangt und den Tarif mit diesem Index aus der Liste als aktuellen Tarif des Taxameters in der entsprechenden Instanzvariablen speichert. Die Methode soll deine set-methode Taxameter.setzeTarif(Tarif) benutzen. Probiere die Methode mit verschiedenen Nummern aus und überprüfe mit einem Inspektor. Programmiere eine Methode Taxameter.schalteTarifWeiter(), die den gerade aktuellen Tarif durch den jeweils nächsten aus der Tarifliste ersetzt. Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

368 8.3 Import Bibliotheken benutzen 1 // Einbinden der Klasse ArrayList aus dem Paket java.util 2 import java.util.arraylist; 3 public class Taxameter 4 { 5 private Tarif tarif; 6 private Tarif tagtarif; 7 private Tarif nachttarif; 8 private ArrayList<Tarif> tarifliste; 9 public Taxameter() 10 { 11 tarif = null; 12 tagtarif = new Tarif(3.00,1.70,0.50); 13 nachttarif = new Tarif(3.20,1.90,0.70); 14 tarifliste = new ArrayList<Tarif>(); 15 tarifliste.add(tagtarif); 16 tarifliste.add(nachttarif); 17 } 18 public void setzetarif(tarif neuertarif) 19 { 20 tarif = neuertarif; 21 } 22 public void waehletarif(int nummer) 23 { 24 setzetarif(tarifliste.get(nummer)); 25 } 26 public void schaltetarifweiter() 27 { 28 waehletarif(tarifliste.indexof(this.tarif)+1); 29 } 30 } Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

369 8.4 Die JGUIToolbox Grafikkomponenten Download: JGUIToolbox von Hans Witt Zweck: einfache Integration von grafischen Formen, Schaltknöpfen und Ausgabeelementen Verwendung: benötigte Klassen (java-dateien) aus den Unterverzeichnissen von JToolbox in das Projektverzeichnis kopieren und Projekt neu öffnen stets alle Klassen aus Basis Beispiel: Visualisierung der Taxileuchte Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung mit einem AusgabePanel Auftrag: Kopiere die benötigten Klassen in dein Projekt, kompiliere es neu, erzeuge ein AusgabePanel, spiele damit herum und verändere die Instanz geeignet.

370 8.5 Vererbung Unterklassen anlegen Probleme: Lösung: AusgabePanel kennt keine get-methode für seine Beschriftung, nur eine (private) Instanzvariable anzeigetext. evtl. nötig, falls z. B. ein Fahrgast die optische Anzeige auswerten soll AusgabePanel weiß nichts von einer Taxileuchte (und umgekehrt). Welche Klassen sollten verändert werden? Keine bestehende Klasse verändern! Die Taxileuchte (das Modell) tut, was sie soll. AusgabePanel wird von Hans Witt gepflegt, nicht von dir. Lege eine angepasste Unterklasse von AusgabePanel an: Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung Taxileuchte TaxileuchtenPanel AusgabePanel < beobachtet 1

371 8.5 Vererbung Unterklassen anlegen TaxileuchtenPanel braucht Instanzvariablen für die zu beobachtende Leuchte, evtl. für die verwendeten Farben. Beim Konstruktoraufruf soll die Beschriftung angegeben werden können. Im Konstruktor muss ein AnzeigenPanel (Oberklasse) erzeugt und dann angepasst werden. Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

372 8.5 Vererbung Unterklassen anlegen 1 public class TaxileuchtenPanel extends AusgabePanel 2 { 3 // instance variables - replace the example below with your own 4 private Taxileuchte leuchte; 5 private String hfarbe; // Helle Farbe 6 private String dfarbe; // Dunkle Farbe 7 8 /** 9 * Constructor for objects of class TaxileuchtenPanel 10 */ 11 public TaxileuchtenPanel(Taxileuchte leuchte, String aufschrift) 12 { 13 // Konstruktor der Oberklasse 14 super(aufschrift,100,50); 15 // initialise instance variables 16 this.leuchte = leuchte; 17 this.hfarbe = "gelb"; 18 this.dfarbe = "schwarz"; 19 setzeschriftgroesse(32); 20 aktualisieredich(); //Aussehen passend zum Zustand der Leuchte 21 } 22 } Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung extends: Angabe der Oberklasse super: als erstes Konstruktoraufruf der Oberklasse

373 8.6 Verzweigung in Java if else Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Was soll bei aktualisieredich() passieren? Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Wenn Taxileuchte an, dann: Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Sonst, also wenn Taxileuchte aus, dann: Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

374 8.6 Verzweigung in Java if else WAHR Anweisungen, falls Bedingung erfüllt Bedingte Anweisung Anweisungen vorher Bedingung erfüllt? FALSCH Anweisung nachher Anweisungen, falls Bedingung nicht erfüllt if (Bedingung für true oder false ) { Anweisungen nur im Fall von true; } else { Anweisungen nur im Fall von false; } Der else-zweig kann auch entfallen. Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

375 8.6 Verzweigung in Java if else Beim TaxileuchtenPanel: Java II Referenzen Sammlungen Import 1 /** 2 * Aktualisierung des Aussehens 3 4 */ 5 public void aktualisieredich() 6 { 7 if (leuchte.gibistan()) { 8 setzehintergrundfarbe(hfarbe); 9 setzeschriftfarbe(dfarbe); 10 } 11 else { 12 setzehintergrundfarbe(dfarbe); 13 setzeschriftfarbe(hfarbe); 14 } 15 } JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

376 8.7 Taxameteranzeige Auftrag Programmiere analog eine TaxameterAnzeige. Angezeigt werden sollen der Name des eingestellten Tarifs die Grundgebühr der km-preis der Minutenpreis Möglicherweise musst du dazu erst noch die Klassen Tarif und Taxameter anpassen! Benutze die Klasse Behaelter aus der JGUIToolbox für die Darstellung des gesamten Taxameters als Oberklasse der TaxameterAnzeige. Behaelter werden z. B. sichtbar, wenn man den Beschreibungstext setzt. Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

377 8.8 Zeichenketten Konkatenation Problem: Die Klasse AusgabePanel erwartet als Ausgabetext Zeichenketten, also Werte vom Typ String. Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Stringkonkatenation Mehrere Zeichenketten lassen sich mit einem + zu einer einzigen zusammenfügen (konkatenieren) "Java" + "-" + "Programm" ergibt "Java-Programm" Wird ein Wert von einem anderen Datentyp (etwa eine Zahl) an einen String konkateniert, wird der Wert Bestandteil der neuen Zeichenkette. "Die Antwort lautet " "." ergibt "Die Antwort lautet 42." Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

378 8.8 Zeichenketten Konkatenation Umwandlung in eine Zeichenkette Ein Wert von einem anderen Datentyp (etwa eine Zahl) lässt sich am einfachsten in eine Zeichenkette umwandeln, indem man ihn an die leere Zeichenkette " " konkateniert. " " ergibt "3.14" " " + meintaxameter.gibfahrpreisaus() ergibt "0.0" (falls der Fahrpreis gerade diesen Zahlenwert hat) Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

379 8.9 Geschachtelte Methodenaufrufe Wie kommt die Taxameteranzeige an den Namen des eingestellten Tarifs? Java II Referenzen Sammlungen taxameteranzeige gibtarifaus() taxameter Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung gibtarifnameaus() tarif Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten Der eingestellte Tarif ist für die Taxameteranzeige das Rückgabeobjekt taxameter.gibtarifaus() Diesem Objekt schickt die Anzeige die Nachricht taxameter.gibtarifaus().gibtarifnameaus() Rückgabewert ist der Name (als Zeichenkette). Empfänger dieses Wertes ist der Sender der gesamten Nachricht, also die Taxameteranzeige. for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

380 8.9 Geschachtelte Methodenaufrufe Ein echtes Taxameter kennt mehr als nur zwei Tarife. Die bisherige Implementierung sieht so aus: 1 public class Taxameter 2 { 3 private boolean istan; 4 private double betrag; 5 private Tarif tarif; 6 private Tarif tagtarif; 7 private Tarif nachttarif; 8 private ArrayList<Tarif> tarifliste; 9 public Taxameter() 10 { 11 istan = false; 12 betrag = 0.00; 13 tarif = null; 14 tagtarif = new Tarif(); 15 nachttarif = new Tarif("Nachttarif",3.20,1.90,0.70); 16 tarifliste = new ArrayList<Tarif>(); 17 tarifliste.add(tagtarif); 18 tarifliste.add(nachttarif); 19 } 20 } Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung Was ist ungünstig, wenn diese Taxameter-Klasse auf mehrere Tarife erweitert werden soll?

381 8.9 Geschachtelte Methodenaufrufe Eigene Instanzvariablen für jeden Tarif sind unnötig, weil ohnehin jeder Tarif einen Index in der Tarifliste besitzt, über den er angesprochen werden kann. Der Konstruktoraufruf des Tarifs kann (wie jede andere Nachricht auch) direkt als Parameter an eine Methode übergeben werden: 1 public class Taxameter 2 { 3 private boolean istan; 4 private double betrag; 5 private Tarif tarif; //aktuell eingestellter Tarif 6 private ArrayList<Tarif> tarifliste; 7 public Taxameter() 8 { 9 istan = false; 10 betrag = 0.00; 11 tarif = null; 12 tarifliste = new ArrayList<Tarif>(); 13 tarifliste.add(new Tarif()); //Standardtarif 14 tarifliste.add(new Tarif("Nachttarif",3.20,1.90,0.70)); 15 tarifliste.add(new Tarif("Gruppentarif",5.20,2.50,0.70)); Java II 16 tarifliste.add(new Tarif("Gruppentarif-Nacht",6.30,2.80,0.90)); 17 } 18 } Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

382 8.10 Taxianzeige Zwischenstand Vorschläge für die neu hinzugekommenen Anzeigeklassen und Veränderungen in anderen Klassen Kommentare wurden weggelassen. Für die Anzeige des Tarifnamens sind Anpassungen in den Klassen Tarif und Taxameter nötig. Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

383 8.10 Taxianzeige Zwischenstand Tarif 1 public class Tarif 2 { 3 private String tarifname; 4 private double grundgeb; 5 private double km_preis; 6 private double min_preis; 7 public Tarif() 8 { 9 tarifname = "Standardtarif"; 10 grundgeb = 3.50; 11 km_preis = 1.40; 12 min_preis = 0.35; 13 } 14 public Tarif(String tarifname, 15 double grundgeb, 16 double km_preis, 17 double min_preis) 18 { 19 this.tarifname = tarifname; 20 this.grundgeb = grundgeb; 21 this.km_preis = km_preis; 22 this.min_preis = min_preis; 23 } 24 public String gibtarifnameaus() 25 { 26 return tarifname; 27 } 28 } Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

384 8.10 Taxianzeige Zwischenstand Taxameter 1 // Einbinden der Klasse ArrayList aus dem Paket java.util 2 import java.util.arraylist; 3 public class Taxameter 4 { 5 private boolean istan; 6 private double betrag; 7 private Tarif tarif; //aktuell eingestellter Tarif 8 private ArrayList<Tarif> tarifliste; 9 public Taxameter() 10 { 11 istan = false; 12 betrag = 0.00; 13 tarif = null; 14 tarifliste = new ArrayList<Tarif>(); 15 tarifliste.add(new Tarif()); //Standardtarif 16 tarifliste.add(new Tarif("Nachttarif",3.20,1.90,0.70)); 17 tarifliste.add(new Tarif("Gruppentarif",5.20,2.50,0.70)); Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife 18 tarifliste.add(new Tarif("Gruppentarif-Nacht",6.30,2.80,0.90)); 19 } 20 } Schleifenunterbrechung

385 8.10 Taxianzeige Zwischenstand TaxameterAnzeige Java II Referenzen Sammlungen 1 public class TaxameterAnzeige extends Behaelter Import 2 { JGUIToolbox 3 private Taxameter taxmet; Vererbung 4 private AusgabePanel tariffeld; Verzweigung 5 private AusgabePanel grundgebfeld; Taxameteranzeige 6 private AusgabePanel kmpreisfeld; Konkatenation 7 private AusgabePanel minpreisfeld; Verschachtelung 8 private AusgabePanel fahrpreisfeld; Zwischenstand 9 public TaxameterAnzeige(Taxameter taxameter) Testklasse 10 { Lokale Variablen 11 this.taxmet = taxameter; JGUIToolbox Fenster 12 setzegroesse(220,330); Warten 13 setzeposition(50,60); for-schleife 14 this.fahrpreisfeld = new AusgabePanel(this,"kein Preis", 10, 20, 200, 50); Wiederholung mit fester 15 this.tariffeld = new AusgabePanel(this, "kein Tarif", 10, 80, 200, 50); Anzahl 16 this.grundgebfeld = new AusgabePanel(this, "kein Tarif", 10, 140, 200, 50); Listendurchlauf mit Indizes 17 this.kmpreisfeld = new AusgabePanel(this, "kein Tarif", 10, 200, 200, 50); for each Listendurchlauf 18 this.minpreisfeld = new AusgabePanel(this, "kein Tarif", 10, 260, 200, while-schleife 50); Schleifenunterbrechung 19 setzebeschreibungstext("taxameter"); 20 setzehintergrundfarbe("rot"); 21 } 22 public void aktualisieredich() 23 { 24 fahrpreisfeld.setzeausgabetext(""+taxmet.gibbetragaus()); 25 tariffeld.setzeausgabetext(taxmet.gibtarifaus().gibtarifnameaus()); 26 grundgebfeld.setzeausgabetext(""+taxmet.gibtarifaus().gibgrundgebaus()); 27 kmpreisfeld.setzeausgabetext(""+taxmet.gibtarifaus().gibkmpreisaus()); 28 minpreisfeld.setzeausgabetext(""+taxmet.gibtarifaus().gibminpreisaus()); 29 } 30 }

386 8.11 Taxitester eine Testklasse Kaum etwas ist so wichtig wie das Testen der eigenen Software auf Fehler und Funktion. In BlueJ besteht eine Möglichkeit darin, jeweils händisch Objektinstanzen zu erzeugen und mit Inspektoren zu untersuchen. Probleme: mühsam Bei jedem Kompiliervorgang verschwinden alle erzeugten Instanzen. Lösung: Lege eine eigene Klasse Taxitester an, die nur dazu da ist, Objektinstanzen zu erzeugen (und wieder zu löschen), ihnen zu schicken und ggf. die Ergebnisse zu überprüfen. keine Instanzvariablen für jeden Test eine eigene Methode Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

387 8.11 Taxitester eine Testklasse Grundgerüst: 1 public class Taxitest 2 { 3 public Taxitest() 4 { 5 } 6 7 /** 8 * Test der Taxileuchte 9 */ 10 public void testetaxileuchte() 11 { 12 } /** 15 * Test der Taxameteranzeige 16 */ 17 public void testetaxameter() 18 { 19 } 20 } Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

388 8.11 Taxitester eine Testklasse Test der Taxileuchte: testetaxileuchte() erzeuge Fenster mit Titel Leuchtentest erzeuge Taxileuchte tl erzeuge TaxileuchtenPanel tlp für tl Wiederhole zweimal tl.schalteum() tlp.aktualisieredich() warte 5 Sekunden schließe Fenster Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung Auftrag Entwirf analog ein Struktogramm für den Test des Taxameters und der Taxameteranzeige.

389 8.12 Lokale Variablen Problem: Die Testklasse besitzt keinerlei Instanzvariablen, benötigt zum Testen aber Namen für die Objekte, um ihnen zu schicken. Lösung: Innerhalb einer Methode lassen sich lokale Variablen deklarieren. keine Angabe der Sichtbarkeit (public/private) Namen nur innerhalb dieser Methode gültig Leuchtentest: Benötigt werden eine Zeichnung fenster eine Taxileuchte tl ein TaxileuchtenPanel tlp Vorsicht: Gleichnamige Instanzvariablen wären innerhalb dieser Methode verschattet. Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

390 8.12 Lokale Variablen public void testetaxileuchte() { /** * Deklaration lokaler Variablen * _ohne_ Angabe der Sichtbarkeit */ Zeichnung fenster; Taxileuchte tl; TaxileuchtenPanel tlp; // Fenster und Objekte erzeugen fenster = new Zeichnung("Leuchtentest"); tl = new Taxileuchte(); tlp = new TaxileuchtenPanel(tl,"TAXI"); // Methoden ausprobieren tlp.aktualisieredich(); } Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

391 8.13 JGUIToolbox Fenster Benötigt wird die Klasse Zeichnung aus dem Verzeichnis Basis der JGUIToolbox. Zeichnung deklarieren: private Zeichnung fenster; // Instanzvariable Zeichnung fenster; // lokale Variable Zeichnung erzeugen: fenster = new Zeichnung(); fenster = new Zeichnung("Titel"); Nachfolgend erzeugte JGUI-Objekte erscheinen automatisch in diesem Fenster. Fenstergröße anpassen: fenster.setsize(200,300); // Pixel Fenster schließen: fenster.dispose(); Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

392 8.14 Thread.sleep Programm anhalten Um die Programmausführung z. B. 5 Sekunden warten zu lassen, müssen in Java an der betreffenden Stelle folgende Zeilen eingefügt werden: Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige try { Thread.sleep(5000); } catch (InterruptedException ex) { ex.printstacktrace(); } Zeitangaben erfolgen stets als ganze Zahl in Millisekunden, hier Einfacher geht es mit der JGUIToolbox: Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung StaticTools.warte(5000);

393 8.15 for Ist bekannt, wie oft eine Anweisungssequenz wiederholt werden soll, bietet sich für die Wiederholung eine Zählschleife (auch for-schleife) an: Wiederhole etwas zehnmal. Mache etwas für alle ungeraden Zahlen zwischen 100 und 200. Mache etwas für alle Elemente aus einer Liste. Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

394 for Wiederholung mit fester Anzahl Wiederhole bis zum Endwert der Schleifenvariablen zu wiederholende Anweisungen Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung for-schleife for (Initialisierung; Abbruch; Schritt) { zu wiederholende Anweisungen; } Initialisierung der Schleifenvariablen mit Datentyp und Startwert Abbruchbedingung an die Schleifenvariable Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung Schritt zur Veränderung der Schleifenvariablen (meist Erhöhung um 1)

395 for Wiederholung mit fester Anzahl Lampe zweimal umschalten: for (int versuch = 0; versuch < 2; versuch++) { tl.schalteum(); tlp.aktualisieredich(); } Die Schleifenvariable versuch ist eine ganze Zahl. ++ erhöht den Wert von versuch um 1. Benutzung der Schleifenvariablen im Schleifenkörper: Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl for (int versuch = 0; versuch < 2; versuch++) { // Terminalausgabe der Versuchsnummer while-schleife System.out.println("Versuch: " + versuch); tl.schalteum(); tlp.aktualisieredich(); System.out.println("Lampe ist an: " + tl.gibistan()); } Einfache Textausgabe mit System.out.println(Wert) Listendurchlauf mit Indizes for each Listendurchlauf Schleifenunterbrechung

396 for Listendurchlauf mit Indizes Durchschalten aller Tarife: tm.waehletarif(0); tma.aktualisieredich(); for (int tnum = 0; tnum < tm.gibtariflisteaus().size(); tnum++) { tm.schaltetarifweiter(); tma.aktualisieredich(); } for (int tnum = 0; tnum < tm.gibtariflisteaus().size(); tnum++) { tm.waehletarif(tnum); tma.aktualisieredich(); } Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung Listenindizes beginnen in der Regel mit 0. size() liefert die Anzahl der Elemente einer ArrayList.

397 for for each Listendurchlauf Eleganter ohne Indizes direkt mit den Listenelementen: for (Tarif tarif : tm.gibtariflisteaus()) { tm.setzetarif(tarif); tma.aktualisieredich(); } Die Methode gibtariflisteaus() der Klasse Taxameter liefert als Rückgabewert die ganze Tarifliste vom Typ ArrayList<Tarif>. Die Schleifenvariable tarif nimmt der Reihe nach jeden Tarif aus der Liste als Wert an. for-each-schleife Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung for (Datentyp variable : liste) { zu wiederholende Anweisungen; }

398 8.16 while Bedingte Wiederholung Soll ein Anweisungsblock wiederholt werden, solange eine Bedingung erfüllt ist, verwendet man eine bedingte Wiederholung (auch while-schleife): Fahre, solange du noch nicht am Ziel bist. Warte, solange die Ampel rot ist. Belade den Kofferraum, solange noch Taschen draußen stehen. Wiederhole, solange eine Bedingung erfüllt ist zu wiederholende Anweisungen Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

399 8.16 while Bedingte Wiederholung Häufig wird in der Bedingung der Wert einer Schleifenvariablen überprüft, der bei jedem Durchlauf im Anweisungsblock verändert wird. Diese Variable muss vor der Schleife mit einem Startwert initialisiert werden: Initialisierung der Schleifenvariablen Wiederhole, solange eine Bedingung erfüllt ist zu wiederholende Anweisungen mit Veränderung der Schleifenvariablen Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

400 8.16 while Bedingte Wiederholung while-schleife ohne eigene Schleifenvariable: while (Bedingung) { zu wiederholende Anweisungen; } mit eigener Schleifenvariable svar: svar = Startwert; while (Bedingung) { zu wiederholende Anweisungen; svar = neuer_wert; } Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

401 8.16 while Bedingte Wiederholung Taxifahren Programmiere eine Klasse Ort. Ein Ort kennt seine x- und y-koordinate (ganze Zahlen). Ein Ort kann seine x- bzw. y-koordinate ausgeben. Dem Konstruktor können eine x- und y-koordinate übergeben werden. Programmiere die Klasse Taxi. Importiere aus der JGUIToolbox die Klasse Kreis. Mache Taxi zu einer Unterklasse von Kreis. Das Taxi kennt seine Leuchte, sein Taxameter und seinen Kilometerstand (ganzzahlig). Als Unterklasse von Kreis kennt es seine x- und y-koordinate (wie heißen die entsprechenden Instanzvariablen von Kreis?) Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

402 8.16 while Bedingte Wiederholung Taxifahren Programmiere eine Methode Taxi.fahreZu(Ort ziel). Das Taxi soll sich in kleinen Schritten bewegen, bis seine Koordinaten mit den Zielkoordinaten übereinstimmen. Taxi erbt von Kreis die Methoden horizontalbewegen(int entfernung) und vertikalbewegen(int entfernung). StaticTools.warte(int millisekunden) hilft bei der Geschwindigkeit. Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

403 8.16 while Bedingte Wiederholung 1 public class Taxi extends Kreis 2 { 3 public void fahrezu(ort ziel) 4 { 5 // Leuchte ausschalten 6 // Taxameter einschalten und Grundgeb. als Fahrpreis 7 // km zuruecksetzen 8 while (xpos < ziel.gibx()) 9 { 10 horizontalbewegen(1); 11 aktualisiereanzeigen(); 12 StaticTools.warte(10); 13 } 14 // Leuchte einschalten 15 // Taxameter ausschalten 16 } /* 19 * Aktualisierung aller Anzeigen 20 */ 21 private void aktualisiereanzeigen() 22 { 23 // km-stand 24 // Taxameterbetrag 25 } } Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

404 8.17 continue / break Schleifenunterbrechung Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox Fenster Warten for-schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each Listendurchlauf while-schleife Schleifenunterbrechung

405 Zustandsmodelle Zustandsübergänge Zustände Automaten Teil IX Zustandsmodellierung Einfachstes Beispiel der Lichtschalter Zustandsdiagramme Modellierung eines CD-Spielers Modellierung eines Münztelephons endliche Automaten Zustandstabellen Noch einmal der CD-Spieler Kara Zustandsmodellierung Unit-Tests

406 Anhang Überblick Grundkonzepte Ablaufmodelliierung Smalltalk I die Entwicklungsumgebung Squeak Smalltalk II Grundzüge der Programmiersprache Pharo I Smalltalk-Entwicklung mit Pharo Zustandsmodelle Zustandsübergänge Zustände Automaten Einfachstes Beispiel der Lichtschalter Zustandsdiagramme Modellierung eines CD-Spielers Modellierung eines Münztelephons endliche Automaten Zustandstabellen Noch einmal der CD-Spieler Kara Zustandsmodellierung Unit-Tests Pharo II Grundzüge von Smalltalk Java I Klassen in BlueJ anlegen Java II JGUIToolbox und weitere Konstrukte Zustandsmodellierung

407 Gliederung Zustandsmodellierung Zustandsübergänge Zustände (Endliche) Automaten Einfachstes Beispiel der Lichtschalter Zustandsübergangsdiagramme Modellierung eines CD-Spielers Modellierung eines Münztelephons Automaten aus Sicht der Informatik Zustandsübergangstabellen Noch einmal der CD-Spieler Kara auch ein Käfer Zustandsmodellierung Programmierung von Unit-Tests Zustandsmodelle Zustandsübergänge Zustände Automaten Einfachstes Beispiel der Lichtschalter Zustandsdiagramme Modellierung eines CD-Spielers Modellierung eines Münztelephons endliche Automaten Zustandstabellen Noch einmal der CD-Spieler Kara Zustandsmodellierung Unit-Tests

408 9.1 Zustandsübergänge Beim Spiel Tausammler ändern die beteiligten Objekte im Lauf der Zeit ihren jeweiligen Zustand: Ein frischer Tropfen wird erst alt, dann unsichtbar. Zustandsmodelle Zustandsübergänge Zustände Automaten Einfachstes Beispiel der Lichtschalter Zustandsdiagramme Modellierung eines CD-Spielers Modellierung eines Münztelephons Der Käfer ist mal beladen, mal unbeladen. endliche Automaten Zustandstabellen Noch einmal der CD-Spieler Kara Zustandsmodellierung Unit-Tests Der anfangs leere Speicher wird nach und nach voll. Wodurch werden diese Zustandsübergänge ausgelöst, welche Veränderungen haben sie zur Folge?

Smalltalk mit Squeak

Smalltalk mit Squeak mit Objektorientierte Programmierung in info10 Gymnasium Untergriesbach 25. Februar 2012 Vorbemerkungen I Die Folien stellen einen Auszug aus Unterrichtsmaterial dar, das im Rahmen des Informatikunterrichtes

Mehr

Squeak verwenden. Neues Projekt starten. Werkzeuge. Einführung in die objektorientierte Programmierung

Squeak verwenden. Neues Projekt starten. Werkzeuge. Einführung in die objektorientierte Programmierung Einführung in die objektorientierte Programmierung mit Squeak Teil 2 Squeak verwenden Image unter neuem Namen speichern und verwenden - immer ein intaktes Image zur Sicherheit verfügbar alle Änderungen

Mehr

Objektorientierte Modellierung (1)

Objektorientierte Modellierung (1) Objektorientierte Modellierung (1) Die objektorientierte Modellierung verwendet: Klassen und deren Objekte Beziehungen zwischen Objekten bzw. Klassen Klassen und Objekte Definition Klasse Eine Klasse ist

Mehr

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden. Grundwissen Informatik Objekt Attribut Methoden Als Objekte bezeichnet man alle Gegenstände, Dinge, Lebewesen, Begriffe oder Strukturen unserer Welt ( Autos, Räume, Bakterien, Lehrer, Schüler, Kunden,

Mehr

Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich

Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich WS 02/03 Warum muss ein Objekt wissen, zu welcher Klasse es gehört? Damit die Klassenzugehörigkeit

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 34 Einstieg in die Informatik mit Java Klassen mit Instanzmethoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 34 1 Definition von Klassen 2 Methoden 3 Methoden

Mehr

3. Die Programmiersprache Java

3. Die Programmiersprache Java 3. Die Programmiersprache Java 3.1 Arbeiten mit BlueJ 3.2 Objekte und Klassen 3.3 Klassen und Unterklassen 3.4 Daten und Operationen 3.5 Ausdrücke 3.6 Algorithmische Kernsprache 3.7 Sprachbeschreibung

Mehr

Algorithmen und ihre Programmierung

Algorithmen und ihre Programmierung Veranstaltung Pr.-Nr.: 101023 Algorithmen und ihre Programmierung Veronika Waue WS 07/08 Einführung Definition: Algorithmus Ein Algorithmus ist eine genau definierte Folge von Anweisungen zur Lösung eines

Mehr

Repetitorium Informatik (Java)

Repetitorium Informatik (Java) Repetitorium Informatik (Java) Tag 6 Lehrstuhl für Informatik 2 (Programmiersysteme) Übersicht 1 Klassen und Objekte Objektorientierung Begrifflichkeiten Deklaration von Klassen Instanzmethoden/-variablen

Mehr

Tutorium Java. Softwaretechnologie: Java I. Marco Jürgens und Mihail Atanassov.

Tutorium Java. Softwaretechnologie: Java I. Marco Jürgens und Mihail Atanassov. Tutorium Java Softwaretechnologie: Java I Marco Jürgens und Mihail Atanassov tutoren@spinfo.uni-koeln.de Themen Entwicklungsumgebung: Eclipse-Installation MrTurtle und Plugins für Eclipse Java: Klassen

Mehr

8. Objektorientierte Programmierung. Informatik II für Verkehrsingenieure

8. Objektorientierte Programmierung. Informatik II für Verkehrsingenieure 8. Objektorientierte Programmierung Informatik II für Verkehrsingenieure Grundbegriffe ALAN KAY, ERFINDER DER SPRACHE SMALLTALK, HAT DIE GRUNDBEGRIFFE DER OBJEKTORIENTIERTEN PROGRAMMIERUNG WIE FOLGT ZUSAMMENGEFASST:

Mehr

01 Einführung in PHP. Einführung in PHP 1/13 PHP in Aktion

01 Einführung in PHP. Einführung in PHP 1/13 PHP in Aktion 01 Einführung in PHP Einführung in PHP 1/13 PHP in Aktion PHP ist eine Programmiersprache, die ganz verschiedene Dinge tun kann: von einem Browser gesendete Formularinhalte auswerten, angepasste Webinhalte

Mehr

Algorithmen und Datenstrukturen 06

Algorithmen und Datenstrukturen 06 31. Mai 2012 1 Besprechung Blatt 5 Fragen 2 Objektorientierte Programmierung Allgemein Sichtbarkeit Konstanten 3 Unified Modeling Language (UML) Klassendiagramme Anwendungsfalldiagramme 4 Vorbereitung

Mehr

Java Einführung Objektorientierte Grundkonzepte

Java Einführung Objektorientierte Grundkonzepte Java Einführung Objektorientierte Grundkonzepte Inhalt Verständnis der grundlegenden Konzepte der Objektorientierung: Objekte Nachrichten Kapselung Klassen und Instanzen Vererbung Polymorphismus Darstellung

Mehr

Algorithmen und Programmierung II

Algorithmen und Programmierung II Algorithmen und Programmierung II Vererbung Prof. Dr. Margarita Esponda SS 2012 1 Imperative Grundbestandteile Parameterübergabe String-Klasse Array-Klasse Konzepte objektorientierter Programmierung Vererbung

Mehr

Aufgaben. Objektorientierte Programmierung

Aufgaben. Objektorientierte Programmierung Aufgaben Objektorientierte Programmierung 1. Baue in die Klasse Wombat eine Methode turnright() ein, damit sich der Wombat auch im Uhrzeigersinn drehen kann 2. Notiere alle Befehle (Stift und Blatt Papier

Mehr

Objektorientierte Analyse (OOA) Strukturmodellierung

Objektorientierte Analyse (OOA) Strukturmodellierung Strukturmodellierung Seite 1 Strukturmodellierung Seite 2 Anwendung im Projekt Strukturmodellierung Voraussetzung: Use Case Diagramm liefert die funktionelle Gliederung mit Angabe der Ein- und Ausgaben

Mehr

Java-Programmierung mit NetBeans

Java-Programmierung mit NetBeans Java-Programmierung mit NetBeans Klassen, Objekte, Alternativen Dr. Henry Herper Otto-von-Guericke-Universität Magdeburg - WS 2012/13 Grundlegende Definitionen - Objekt Ein Objekt ist allgemein ein Gegenstand

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

Mehr

FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung

FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung C Sprachelemente für Übung 2 Typumwandlungen (type casts) Bei Ausdrücken, in denen Operanden mit unterschiedlichem Typ vorkommen, werden diese vom Compiler vor der Ausführung automatisch in einen gemeinsamen

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Skript zur Vorlesung: Einführung in die Programmierung WiSe 2009 / 2010 Skript 2009 Christian Böhm, Peer Kröger, Arthur Zimek Prof. Dr. Christian Böhm Annahita Oswald Bianca Wackersreuther Ludwig-Maximilians-Universität

Mehr

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ Objektorientierte Programmierung Objektorientierte Programmierung Eine Einführung mit BlueJ stellt die Daten, ihre Struktur und ihre Beziehungen zueinander in den Vordergrund. Weniger im Blickpunkt: die

Mehr

Einführung in die Informatik

Einführung in die Informatik Einführung in die Informatik Jochen Hoenicke Software Engineering Albert-Ludwigs-University Freiburg Sommersemester 2014 Jochen Hoenicke (Software Engineering) Einführung in die Informatik Sommersemester

Mehr

Äußere Form ArrayList Vererbung API. Einführung in Java. Arne Hüffmeier. Michelle Liebers, Dennis Hoffmann. Tilman Lüttje, Jean Wiele

Äußere Form ArrayList Vererbung API. Einführung in Java. Arne Hüffmeier. Michelle Liebers, Dennis Hoffmann. Tilman Lüttje, Jean Wiele Einführung in Java Arne Hüffmeier Michelle Liebers, Dennis Hoffmann Tilman Lüttje, Jean Wiele Angelehnt an Java-Vorkurs der Freitagsrunde 1 / 28 1 Äußere Form Kommentare Formatierung Schreibweise 2 ArrayList

Mehr

wenige Konzepte, keine Adressen, Anlehnung an C++ -Syntax Vererbung, Polymorphie/dynamisches Binden, umfangreiche Klassenbibliotheken

wenige Konzepte, keine Adressen, Anlehnung an C++ -Syntax Vererbung, Polymorphie/dynamisches Binden, umfangreiche Klassenbibliotheken 1 Java ist... gut erlernbar wenige Konzepte, keine Adressen, Anlehnung an C++ -Syntax objektorientiert Vererbung, Polymorphie/dynamisches Binden, umfangreiche Klassenbibliotheken robust keine Adressen,

Mehr

Am Anfang werden die Attribute deklariert public class Kreis {

Am Anfang werden die Attribute deklariert public class Kreis { Klassendiagramm Kreis Entwerfen Sie ein Klassendiagramm der Klasse Kreis mit allen Attributen und min. drei Methoden. public class Kreis { sichtbar Platz für Atributeund Methoden protected int xposition;

Mehr

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML. JavaScript JavaScript wird direkt in HTML-Dokumente eingebunden. Gib folgende Zeilen mit einem Texteditor (Notepad) ein: (Falls der Editor nicht gefunden wird, öffne im Browser eine Datei mit der Endung

Mehr

Selbstbestimmtes Lernen. Proinformatik III Objektorientierte Programmierung. Format. Inhalt. Buzzwords

Selbstbestimmtes Lernen. Proinformatik III Objektorientierte Programmierung. Format. Inhalt. Buzzwords 4.0 Proinformatik III Objektorientierte Programmierung Michael Kölling University of Kent Canterbury, UK Selbstbestimmtes Lernen Vorlesung Tutorium Übungen Buch Web-Seite Üben, üben, üben! Format Vorlesung:

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 25 Einstieg in die Informatik mit Java Objektorientierte Programmierung und Klassen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 25 1 Die Philosophie 2 Definition

Mehr

Unified Modeling Language (UML)

Unified Modeling Language (UML) Kirsten Berkenkötter Was ist ein Modell? Warum Modellieren? Warum UML? Viele, viele Diagramme UML am Beispiel Was ist ein Modell? Ein Modell: ist eine abstrakte Repräsentation eines Systems, bzw. ist eine

Mehr

UML-Basics: Einführung in Objekt- Orientierte Modellierung mit der Unified Modeling Language

UML-Basics: Einführung in Objekt- Orientierte Modellierung mit der Unified Modeling Language UML-Basics: Einführung in Objekt- Orientierte Modellierung mit der Unified Modeling Language ADV-Seminar Leiter: Ziel dieses Seminars Verständnis von Objekt-Orientierung Was sind Klassen? Was ist Vererbung?

Mehr

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH Java Einleitung - Handout Kurzbeschreibung: Eine kleine Einführung in die Programmierung mit Java. Dokument: Autor: Michael Spahn Version 1.0 Status: Final Datum: 23.10.2012 Vertraulichkeit: öffentlich

Mehr

Kapitel 3 Die erste Klasse selbst erstellen: MAMPFI

Kapitel 3 Die erste Klasse selbst erstellen: MAMPFI Kapitel 3 Die erste Klasse selbst erstellen: MAMPFI Seite 1 / 12 Kapitel 3 Die erste Klasse selbst erstellen: MAMPFI Lernziele: Eine Klasse in Java erstellen: Attribute, Datentypen, Konstruktor, Referenzattribute,

Mehr

Übungen Softwaretechnik I

Übungen Softwaretechnik I Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich Übungen Softwaretechnik I Übung 5: Objektorientierte Analyse Einführung Objektorientierung in der

Mehr

3. Konzepte der objektorientierten Programmierung

3. Konzepte der objektorientierten Programmierung 3. Konzepte der objektorientierten Programmierung 3.1 Basiskonzepte 3.2 Generalisierung / Spezialisierung 3.3 Aggregation 3.4 Assoziation 3.5 Nachrichten 3.6 Polymorphismus 3. Konzepte der Objektorientierung

Mehr

15 Unified Modeling Language (UML) 7 UML und Java Informatik 2 (SS 07) 595

15 Unified Modeling Language (UML) 7 UML und Java Informatik 2 (SS 07) 595 Überblick 15. Unified Modeling Language (UML) 15.1 Grundlagen 15.2 Klassen und Objekte 15.3 Vererbung 15.4 Schnittstellen 15.5 Generische Typen 15.6 Pakete 15.7 UML und Java 15.8 Zusammenfassung 15 Unified

Mehr

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008 PIWIN I Kap. 7 Objektorientierte Programmierung - Einführung 1 PIWIN I Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I Vorlesung 3 SWS WS 2007/2008 FB Informatik

Mehr

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte Grundkonzepte Objektorientierter Programmierung Nicole Himmerlich FSU Jena mit Java, Oberon-2, Object-Pascal und Python Inhaltsüberblick I. Grundbegriffe 1) Kopplung 2) Datenkaspelung 3) Konstruktor 4)

Mehr

Java Einführung Klassendefinitionen

Java Einführung Klassendefinitionen Java Einführung Klassendefinitionen Inhalt dieser Einheit Java-Syntax Klassen definieren Objekte instanziieren Instanzvariable deklarieren Klassenvariable deklarieren 2 Klassen definieren In der Problemanalyse

Mehr

[Beziehungen, Ereignisse und Aktionen: Benutzer hinzufügen und anmelden] Schritt 1: Java-Editor öffnen

[Beziehungen, Ereignisse und Aktionen: Benutzer hinzufügen und anmelden] Schritt 1: Java-Editor öffnen Seite 1 [Beziehungen, Ereignisse und Aktionen: Benutzer hinzufügen und anmelden] Schritt 1: Java-Editor öffnen Öffnen Sie ihre Entwicklungsumgebung, den Java-Editor: Start >> Programme >> Java-Editor Seite

Mehr

Javakurs für Anfänger

Javakurs für Anfänger Javakurs für Anfänger Einheit 05: Weitere Kontrollstrukturen Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme 1. Teil: Weitere Kontrollstrukturen Wiederholungsstrukturen (Schleifen) While-,do-,for-Schleifen

Mehr

Software. Die Erste. C o m p u t e r G r u n d w i s s e n Te i l I I. S o f t w a r e. H a r d w a r e. C D / D V D B r e n n e n.

Software. Die Erste. C o m p u t e r G r u n d w i s s e n Te i l I I. S o f t w a r e. H a r d w a r e. C D / D V D B r e n n e n. C o m p u t e r G r u n d w i s s e n Te i l I I H a r d w a r e C D / D V D B r e n n e n S o f t w a r e I n t e r n e t Software Die Erste S y s t e m p f l e g e Te x t v e r a r b e i t u n g V i

Mehr

Organisatorisches. drei Gruppen Gruppe 1: 10:10-11:40, Gruppe 2: 11:45-13:15 Gruppe 3: 13:20-14:50

Organisatorisches. drei Gruppen Gruppe 1: 10:10-11:40, Gruppe 2: 11:45-13:15 Gruppe 3: 13:20-14:50 Organisatorisches Vorlesung Donnerstag 8:35 bis 10:05 Übung drei Gruppen Gruppe 1: 10:10-11:40, Gruppe 2: 11:45-13:15 Gruppe 3: 13:20-14:50 Tutorium (Mehr oder weniger) abwechselnd Mo und Mi 10-11:30 Termine

Mehr

Installation und Benutzung. LangCorr ApS Erritsoegaardsvej 11 DK 7000 Fredericia Denmark

Installation und Benutzung. LangCorr ApS Erritsoegaardsvej 11 DK 7000 Fredericia Denmark Installation und Benutzung Herzlich Willkommen zu Language Corrector! Language Corrector herunterladen: Auf unserer Seite www.langcorr.com finden Sie unten, Mitte links, den Link zu LanguageCorrector.

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 39 Einstieg in die Informatik mit Java Objektorientierte Programmierung und Klassen mit Instanzmethoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 39 1 Überblick:

Mehr

Etoys für Einsteiger

Etoys für Einsteiger Etoys für Einsteiger Esther Mietzsch (nach einem Vorbild von Rita Freudenberg) März 2010 www.squeakland.org www.squeak.de Starten von Etoys 1. Du steckst Deinen USB Stick in die USB Schnittstelle am Computer.

Mehr

Inhalt: Version 1.7.5

Inhalt: Version 1.7.5 Inhalt: Objekte ohne Methoden Objekte mit einfachen Methoden Objekte und Methoden mit Parametern Objekte und Methoden mit Rückgabewert Objekte mit einem Array als Attribut Beziehungen zwischen Objekten

Mehr

Einführung in die Programmierung mit VBA

Einführung in die Programmierung mit VBA Einführung in die Programmierung mit VBA Vorlesung vom 07. November 2016 Birger Krägelin Inhalt Vom Algorithmus zum Programm Programmiersprachen Programmieren mit VBA in Excel Datentypen und Variablen

Mehr

Java. Prof. Dr. Stefan Enderle NTA Isny

Java. Prof. Dr. Stefan Enderle NTA Isny Java Prof. Dr. Stefan Enderle NTA Isny 6. Klassen (Einführung, UML) Nachtrag Objekte In einem Software-System können, je nach Anwendung, viele "Objekte" vorkommen. Beispiele: Beteiligte oder betroffene

Mehr

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden Kapitel 8 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Methoden Überladen von Methoden Der this-zeiger Konstruktoren Vererbung WS 07/08

Mehr

Arbeiten mit BlueJ. Objektorientiertes Programmieren in Java mit BlueJ

Arbeiten mit BlueJ. Objektorientiertes Programmieren in Java mit BlueJ Arbeiten mit BlueJ Compilieren, Editieren, Objekte erzeugen, Methoden aufrufen, Objekte inspizieren, vorhandene Klassen benutzen, eigene Klassen und Methoden erstellen In BlueJ geht es einfach BlueJ durch

Mehr

Graphische Benutzungsoberflächen mit Java. Einführung in NetBeans

Graphische Benutzungsoberflächen mit Java. Einführung in NetBeans Graphische Benutzungsoberflächen mit Java Einführung in NetBeans Graphische Benutzungsoberflächen! Interaktion mit dem Programm! Datenein- und ausgabe! Rückmeldungen über Verarbeitung der Daten! Visualisierung

Mehr

Javakurs für Anfänger

Javakurs für Anfänger Javakurs für Anfänger Einheit 12: Einführung in UML und Java API Dokumentation Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda 1. Teil: Einführung in UML Sequenzdiagramm Klassendiagramm

Mehr

Teil II: OOP und JAVA (Vorlesung 9)

Teil II: OOP und JAVA (Vorlesung 9) Teil II: OOP und JAVA (Vorlesung 9) Modul: Programmierung B-PRG Grundlagen der Programmierung II Prof. Dot.-Ing. Roberto Zicari Professur für Datenbanken und Informationssysteme (FB 12) 14.06.06 1 Teil

Mehr

Bedienung von BlueJ. Klassenanzeige

Bedienung von BlueJ. Klassenanzeige Im Folgenden werden wichtige Funktionen für den Einsatz von BlueJ im Unterricht beschrieben. Hierbei wird auf den Umgang mit Projekten, Klassen und Objekten eingegangen. Abgeschlossen wird dieses Dokument

Mehr

Natur und Technik - Informatik 7 Grundwissenskatalog

Natur und Technik - Informatik 7 Grundwissenskatalog Natur und Technik - Informatik 7 Grundwissenskatalog 1. Vernetzte Informationsstrukturen Klassen VERWEIS und VERWEISZIEL Verweist_auf -Beziehung zwischen Objekten der Klassen VERWEIS und VERWEISZIEL. VERWEIS

Mehr

Kurzeinführung in UML

Kurzeinführung in UML Kurzeinführung in UML Die Unified Modeling Language (UML) ist eine Sprache zur Beschreibung von Softwaresystemen. Der Grundgedanke bei UML bestand darin, eine einheitliche Notation für viele Einsatzgebiete

Mehr

DLR SchoolLab Lektion 1 Erste Schritte

DLR SchoolLab Lektion 1 Erste Schritte 1 Navigation Die Entwicklungsoberfläche lässt sich durch sechs Buttons am unteren Bildschirmrand bedienen. Alternativ kann man auch über die Tastatur navigieren. Hierfür gibt es folgdende Abkürzungen:

Mehr

Kapitel 1: Die ersten Schritte Thema: Programmieren Seite: 1

Kapitel 1: Die ersten Schritte Thema: Programmieren Seite: 1 Kapitel 1: Die ersten Schritte Thema: Programmieren Seite: 1 Kapitel 1: Die ersten Schritte mit Greenfoot 1 Starten Sie Greenfoot. (Wenn Sie Greenfoot das erste Mal öffnen, erscheint ein Dialogfenster,

Mehr

Javakurs für Anfänger

Javakurs für Anfänger Javakurs für Anfänger Einheit 09: Vererbung Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda 1. Teil Einführung in die Vererbung Motivation Das Schlüsselwort extends Einführendes

Mehr

Grundlagen der Programmierung

Grundlagen der Programmierung Grundlagen der Programmierung Dr. Tom Kamphans 1. Vorlesung 12.10.2016 1 Organisatorisches Vorlesung: Mittwochs 14:00 15:30, Raum F 201 Übung: Mittwochs 15:45 19:00, Raum F 225 Übung: alle zwei Wochen

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java Einführung in die objektorientierte Programmierung 2 Einordnung in den Softwareentwicklungsprozess Softwareentwicklung mit JAVA Planung Entwurf Programmierung Test/Evaluation/Pflege

Mehr

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie Anwendungsentwicklung mit Java Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie Vererbung (1) 2 Problem: Objekte mit gleichen Attributen/Methoden, aber nicht völlig identisch, z.b., LKW, PKW,

Mehr

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode Methoden und Klassen Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik Wiederholung Jede Applikation braucht eine Klasse mit einer main-methode Eintrittspunkt in das Programm Die main-methode

Mehr

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8 Java 8 Elmar Fuchs Grundlagen Programmierung 1. Ausgabe, Oktober 2014 JAV8 5 Java 8 - Grundlagen Programmierung 5 Kontrollstrukturen In diesem Kapitel erfahren Sie wie Sie die Ausführung von von Bedingungen

Mehr

1 Aufgaben 1.1 Objektorientiert: ("extended-hamster") Sammel-Hamster

1 Aufgaben 1.1 Objektorientiert: (extended-hamster) Sammel-Hamster 1 Aufgaben 1.1 Objektorientiert: ("extended-hamster") Sammel-Hamster Aufgabe: Bearbeitungszeit: ca. 1/4 Std) Schreiben Sie ein "objektorientiertes" Programm ("CuB_05_1") für das Sammeln der Körner. Aufgabenbeschreibung:

Mehr

Java Vererbung. Inhalt

Java Vererbung. Inhalt Java Vererbung Inhalt 1 Zielsetzung... 2 1.1 Bewertung... 2 2 Grundlagen der Vererbung... 2 2.1 Super und Subklassen... 2 3 Überladen von Methoden... 4 3.1 Unterschiedliche Parameter... 4 3.2 Gleiche Parameter

Mehr

SEQUENZDIAGRAMM. Christoph Süsens

SEQUENZDIAGRAMM. Christoph Süsens SEQUENZDIAGRAMM Christoph Süsens DEFINITION Das Sequenzdiagramm gibt Auskunft darüber: Welche Methoden für die Kommunikation zwischen ausgewählten Objekten zuständig sind. Wie der zeitliche Ablauf von

Mehr

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes Verschlüsseln eines Bildes Visuelle Kryptographie Anwendung von Zufallszahlen Wir wollen ein Bild an Alice und Bob schicken, so dass Alice allein keine Information über das Bild bekommt Bob allein keine

Mehr

1 Karol stellt sich vor

1 Karol stellt sich vor Kapitel 1 Karol stell sich vor Seite 1 1 Karol stellt sich vor 1.1 Algorithmus Fritz hat zum Geburtstag einen CD-Player als Geschenk erhalten. Natürlich will er sofort das Geschenk ausprobieren und legt

Mehr

Greenfoot: Verzweigungen

Greenfoot: Verzweigungen Greenfoot: Verzweigungen Nicolas Ruh und Dieter Koch Betrachten wir die act()-methode des Wombats aus dem Wombats-Szenario: Wie interpretieren Sie diesen Code? (einfach übersetzen) Falls der Wombat ein

Mehr

Entwurf von Algorithmen - Kontrollstrukturen

Entwurf von Algorithmen - Kontrollstrukturen Entwurf von Algorithmen - Kontrollstrukturen Eine wichtige Phase in der Entwicklung von Computerprogrammen ist der Entwurf von Algorithmen. Dieser Arbeitsschritt vor dem Schreiben des Programmes in einer

Mehr

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik Programmieren II Innere Klassen Heusch 10, 13.10 Ratz 5.2.1, 9.8 KIT Die Forschungsuniversität in der Helmholtz-Gemeinschaft www.kit.edu Innere Klassen Bisher kennen wir nur Klassen, die entweder zusammen

Mehr

Flappy Bird Greenfoot Station 1: Flappy erstellen und bewegen

Flappy Bird Greenfoot Station 1: Flappy erstellen und bewegen Flappy Bird Greenfoot Station : Flappy erstellen und bewegen In diesem Arbeitsblatt geht es darum, dass bekannte Spiel Flappy Bird zu erstellen, indem das Spielfeld erstellt wird. Flappy erstellt wird.

Mehr

Algorithmen und Datenstrukturen 07

Algorithmen und Datenstrukturen 07 5. Dezember 2011 1 Besprechung Blatt 6 Fragen 2 Vererbung Allgemein abstract Interfaces 3 Unified Modeling Language (UML) Ablaufdiagramme Klassendiagramme Anwendungsfalldiagramme 4 Vorbereitung Blatt 7

Mehr

Techniken der Projektentwicklungen

Techniken der Projektentwicklungen Dynamische Modellierung 8. Termin Rückblick auf statische Modellierung Dynamische Modellierung Basiskonzepte Beispiel Erweiterungen Eigenschaften Syntax Rückblick auf statische Modellierung Dynamische

Mehr

1 Einführung... 13. 2 Erste Schritte... 19. 3 Programmierkurs... 33. 4 Datentypen... 81. 5 Weiterführende Programmierung... 139

1 Einführung... 13. 2 Erste Schritte... 19. 3 Programmierkurs... 33. 4 Datentypen... 81. 5 Weiterführende Programmierung... 139 Auf einen Blick 1 Einführung... 13 2 Erste Schritte... 19 3 Programmierkurs... 33 4 Datentypen... 81 5 Weiterführende Programmierung... 139 6 Objektorientierte Programmierung... 191 7 Verschiedene Module...

Mehr

UML (Unified Modelling Language) von Christian Bartl

UML (Unified Modelling Language) von Christian Bartl UML (Unified Modelling Language) von Inhaltsverzeichnis Inhaltsverzeichnis... 2 1 UML Unified Modelling Language... 3 2 Diagrammtypen... 3 2.1 Aktivitätsdiagramm... 3 2.1.1 Notation... 4 2.1.2 Beispieldiagramm...

Mehr

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen Klassenvariablen Wir wollen die Zahl der instantiierten Studentenobjekte zählen. Dies ist jedoch keine Eigenschaft eines einzelnen Objektes. Vielmehr gehört die Eigenschaft zu der Gesamtheit aller Studentenobjekte.

Mehr

Linux-Einführung Übung

Linux-Einführung Übung Linux-Einführung Übung Mark Heisterkamp 24. 25. Februar 2010 1 Einführung und Grundlagen 1.1 Erste Schritte... 1.1.1 Xterminalfenster Öffnen Sie ein weiteres Xterminalfenster mit der Maus. mittels Kommando.

Mehr

GI Vektoren

GI Vektoren Vektoren Problem: Beispiel: viele Variablen vom gleichen Typ abspeichern Text ( = viele char-variablen), Ergebnisse einer Meßreihe ( = viele int-variablen) hierfür: Vektoren ( = Arrays = Feld ) = Ansammlung

Mehr

In BlueJ geht es einfach

In BlueJ geht es einfach Arbeiten mit BlueJ Compilieren, Editieren, Objekte erzeugen, Methoden aufrufen, Objekte inspizieren, vorhandene Klassen benutzen, eigene Klassen und Methoden erstellen In BlueJ geht es einfach BlueJ durch

Mehr

EinfÅhrung in die objektorientiere Programmierung (OOP) unter Delphi 6.0. EDV Kurs 13/2

EinfÅhrung in die objektorientiere Programmierung (OOP) unter Delphi 6.0. EDV Kurs 13/2 EinfÅhrung in die objektorientiere Programmierung (OOP) unter Delphi 6.0 EDV Kurs 13/2 Inhaltsverzeichnis 1 Objekte... 1 2 Klassen... 3 2.1 Beziehungen zwischen Klassen... 4 2.1.1 Vererbung... 4 2.1.2

Mehr

Jason T. Roff UML. IT Tutorial. Übersetzung aus dem Amerikanischen von Reinhard Engel

Jason T. Roff UML. IT Tutorial. Übersetzung aus dem Amerikanischen von Reinhard Engel Jason T. Roff UML IT Tutorial Übersetzung aus dem Amerikanischen von Reinhard Engel Inhaltsverzeichnis Inhaltsverzeichnis Einführung 11 Grundlagen der UML 15 Warum wir Software modellieren 16 Analyse,

Mehr

StR C. Müller/Dr. M. Ehmann. Objektorientierung in den (Grund-) Modulen

StR C. Müller/Dr. M. Ehmann. Objektorientierung in den (Grund-) Modulen StR C. Müller/Dr. M. Ehmann Objektorientierung in den (Grund-) Modulen StR Carsten Müller carsten.mueller@uni-bayreuth.de Didaktik der Informatik Universität Bayreuth Dr. Matthias Ehmann matthias.ehmann@uni-bayreuth.de

Mehr

Vorlesung Programmieren

Vorlesung Programmieren Vorlesung Programmieren 1. Objekte und Klassen 27.10.2014 Prof. Dr. Ralf H. Reussner Version 1.1 LEHRSTUHL FÜR SOFTWARE-DESIGN UND QUALITÄT (SDQ) INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION (IPD),

Mehr

Arbeiten mit JavaKara

Arbeiten mit JavaKara Arbeiten mit JavaKara 1. Programmierumgebung Möchte man ein neues Programm erstellen, so wird einem ein Programmeditor zur Verfügung gestellt, der bereits eine vorgefertigte Schablone darstellt. In der

Mehr

Aufwandprotokoll für Amtstierärzte Bedienungsanleitung

Aufwandprotokoll für Amtstierärzte Bedienungsanleitung Aufwandprotokoll für Amtstierärzte Bedienungsanleitung Inhalt 1 Anwendung auswählen... 2 1.1 Anwendung starten... 3 1.1.1 Installation von Silverlight beim ersten Aufruf... 3 1.2 Anmeldung... 4 1.2.1 Kennwort

Mehr

Processing Info zu Variablen und Bedingungen

Processing Info zu Variablen und Bedingungen Processing Info zu Variablen und Bedingungen Dieses Dokument enthält - Variablen (Variablen, Datentypen, Deklaration, Geltungsbereich, Benennung) - Bedingungen (if, mousepressed, else) Variablen Eine Variable

Mehr

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI Universität Osnabrück Drei-Schichten-Architektur 3 - Objektorientierte Programmierung in Java Vorlesung 6: 3-Schichten-Architektur Fachkonzept - GUI SS 2005 Prof. Dr. F.M. Thiesing, FH Dortmund Ein großer

Mehr

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2 Java Einführung VARIABLEN und DATENTYPEN Kapitel 2 Inhalt dieser Einheit Variablen (Sinn und Aufgabe) Bezeichner Datentypen, Deklaration und Operationen Typenumwandlung (implizit/explizit) 2 Variablen

Mehr

Javakurs für Anfänger

Javakurs für Anfänger Javakurs für Anfänger Einheit 04: Einführung in Kontrollstrukturen Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda 1. Teil: Einführung in Kontrollstrukturen 3 Grundstrukturen von

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung Ein Computerprogramm besteht aus Funktionen (Programmabschnitten, die etwas tun) und Variablen (Speicherplätzen für Informationen). Werden Funktionen aktiviert, verändern

Mehr

Flussdiagramm / Programmablaufplan (PAP)

Flussdiagramm / Programmablaufplan (PAP) Flussdiagramm / Programmablaufplan (PAP) Basissysmbole Grenzstelle (Anfang, Zwischenhalt oder Ende des Programms/Algorithmus) Verbindung Zur Verdeutlichung der Ablaufrichtung werden Linien mit einer Pfeilspitze

Mehr

Einführung in die OOP mit Java

Einführung in die OOP mit Java Einführung in die OOP mit Java Unterlagen zum Modul OOP mit Java V 3.0 2007 by WBR1/HTI 2011 by MOU2/TI Einführung in die OOP V3.0 2011 by WBR1/MOU2 BFH-TI Beziehungen zwischen Klassen, Packages, UML Einführung

Mehr

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik WS 2011/12 Inhalt Test-Besprechung! Ziele verdeutlichen Große Bild von OOP Wiederholung: Einbettung als Technik

Mehr

Orientierte Modellierung mit der Unified Modeling Language

Orientierte Modellierung mit der Unified Modeling Language UML-Basics: Einführung in Objekt- Orientierte Modellierung mit der Unified Modeling Language Michael Hahsler Ziel dieses Seminars Verständnis von Objekt-Orientierung Was sind Klassen? Was ist Vererbung?

Mehr

10. Programmierungs-Phase: Objektorientierung Software Engineering

10. Programmierungs-Phase: Objektorientierung Software Engineering 10. Programmierungs-Phase: Objektorientierung Software Engineering Fachhochschule Darmstadt Haardtring 100 D-64295 Darmstadt Prof. Dr. Bernhard Humm FH Darmstadt, 15. Dezember 2005 Einordnung in den Kontext

Mehr

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny 3. UML Klassendiagramm Nachtrag 3.1 Einführung UML UML ist eine standardisierte Sprache zur Modellierung von Systemen. In UML werden graphische

Mehr

Java Einführung Methoden in Klassen

Java Einführung Methoden in Klassen Java Einführung Methoden in Klassen Lehrziel der Einheit Methoden Signatur (=Deklaration) einer Methode Zugriff/Sichtbarkeit Rückgabewerte Parameter Aufruf von Methoden (Nachrichten) Information Hiding

Mehr