info10 – OOP Markus Schlager
Objektorientierte Modellierung und Programmierung Einführung im Informatikunterricht der 10. Klasse
Markus Schlager Gymnasium
Untergriesbach
13. März 2015
Vorbemerkungen I
info10 – OOP Markus Schlager
I
Das vorliegende Unterrichtsmaterial entsteht im Rahmen des Informatikunterrichtes der 10. Jahrgangsstufe am Staatlichen Landschulheim Marquartstein1 sowie am Gymnasium Untergriesbach.
I
Ziel ist eine Einführung in die objektorientierte Programmierung unter Einbeziehung verschiedener Modellierungstechniken.
I
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.
Vorbemerkungen II I
Die verwendete Programmiersprache ist I
I
I
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.
I
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.
I
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.
info10 – OOP Markus Schlager
Gliederung
info10 – OOP Markus Schlager
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
info10 – OOP Markus Schlager Grundkonzepte Klassen Namen UML-Darstellung Tausammler
Teil I
Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen
Grundkonzepte
Nachrichten Kapselung Sequenzdiagramme Datentypen
Überblick
info10 – OOP Markus Schlager
Grundkonzepte
Grundkonzepte Klassen Namen
Ablaufmodelliierung
UML-Darstellung Tausammler Assoziation Multiplizitäten
Smalltalk I – die Entwicklungsumgebung Squeak
Aggregation Vererbung Verfeinerung Variablen
Smalltalk II – Grundzüge der Programmiersprache
Nachrichten Kapselung Sequenzdiagramme
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
Datentypen
Gliederung
info10 – OOP Markus Schlager
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 Nachrichten Kapselung und Delegierung Zeitliche Abfolgen – Sequenzdiagramme Datentypen
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
info10 – OOP
1.1 Objekte und Klassen
Objekt
Markus Schlager Grundkonzepte Klassen
mein_Fahrrad
Namen UML-Darstellung Tausammler
Objekte
Assoziation Multiplizitäten Aggregation
I
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.
I
Die Merkmale eines Objektes nennt man Attribute, den Wert eines Attributs Attributwert.
I
Die Dienste, die ein Objekt bietet und ausführen kann, nennt man seine Methoden.
Attribute und ihre Werte: I typ = “Herrenrad” I bereifung = “28” mit Blitzventil”
I farbe = “blau” I rahmennummer = 12345
Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
1.1 Objekte und Klassen
info10 – OOP Markus Schlager
Punktschreibweise
Grundkonzepte Klassen Namen
objektname . attributname = Attributwert objektname . methodenname( Parameterwert1,. . . )
UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung
Für das Objekt mein_Fahrrad:
Variablen Nachrichten Kapselung Sequenzdiagramme
mein_Fahrrad.typ = “Herrenrad” mein_Fahrrad.bereifung = “28” mit Blitzventil” mein_Fahrrad.farbe = “blau” mein_Fahrrad.schaltung = “21-Gang-Kette” mein_Fahrrad.rahmennummer = 12345 mein_Fahrrad.fahren() mein_Fahrrad.transportieren( meine_Tasche )
Datentypen
info10 – OOP
1.1 Objekte und Klassen
Markus Schlager
#
Grundkonzepte
mein_Fahrrad
FAHRRAD
Klassen Namen UML-Darstellung Tausammler Assoziation
(allgemein)
(konkret)
Multiplizitäten Aggregation Vererbung
"
!
Verfeinerung Variablen Nachrichten Kapselung
Klassenzugehörigkeit – Instanzen I
Das Objekt mein_Fahrrad gehört zur Klasse FAHRRAD.
I
mein_Fahrrad ist eine Instanz der Klasse FAHRRAD.
I
Die Klasse eines Objektes kann man mit objektname: KLASSE angeben, z.B. mein_Fahrrad: FAHRRAD
Sequenzdiagramme Datentypen
1.1 Objekte und Klassen
info10 – OOP Markus Schlager
Klasse
Grundkonzepte Klassen Namen
FAHRRAD
UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation
Klassen
Vererbung Verfeinerung Variablen
I
I
Alle Objekte mit gleichen Attributen und Methoden (nicht Attributwerten) lassen sich zu einer Klasse zusammenfassen. Eine Klasse ist ein Schema, das angibt, I I
I
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.
Nachrichten Kapselung Sequenzdiagramme Datentypen
1.2 Namenskonventionen
info10 – OOP Markus Schlager
Konventionen für Bezeichnner
Grundkonzepte Klassen Namen
I
I
Namen von Objekten beginnen stets mit einem Kleinbuchstaben. Bezeichner von Attributen und Methoden sowie Parametern beginnen ebensfalls stets mit einem Kleinbuchstaben.
I
Namen von Klassen beginnen stets mit einem Großbuchstaben.
I
In Diagrammen schreiben wir Klassennamen in der Regel mit lauter Großbuchstaben.
UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
info10 – OOP
1.3 Objekt- und Klassenkarten
Markus Schlager Grundkonzepte Klassen Namen
mein_Fahrrad: FAHRRAD
FAHRRAD
typ = “Herrenrad” bereifung = 28 farbe = “blau” schaltung = (“Kette”, 21) rahmennummer = 12345
typ bereifung farbe schaltung rahmennummer
UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
fahren() transportieren( last ) objektname: KLASSE
KLASSENNAME
attribut1 = WertA attribut2 = WertB
attribut1 attribut2
Die Felder für Attribute und Methoden können auch fehlen.
methode1() methode2( parameter )
1.4 Ein Beispiel – der Tausammler
info10 – OOP Markus Schlager
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 Nachrichten 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. . .
1.4 Ein Beispiel – der Tausammler
info10 – OOP Markus Schlager
I
Wie viele Objekte sind an dem Spiel beteiligt?
I
Zu wie vielen Klassen gehören sie?
I
Zeichne die entsprechenden Klassenkarten.
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
1.4 Ein Beispiel – der Tausammler
info10 – OOP Markus Schlager
Klassenkarten – Erstfassung
Grundkonzepte Klassen Namen UML-Darstellung
KÄFER
TROPFEN
position richtung punkte
position kostüm lebensdauer
laufen() transportieren(objekt) sammeln(tropfen)
verdunsten()
Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung
SPEICHER
WELT
elementzahl farbe
tropfenzahl
schlucken(objekt)
starten() reset()
Sequenzdiagramme Datentypen
1.5 Beziehungen – Assoziation
info10 – OOP Markus Schlager
I
Entwirf ein Klassendiagramm, das die Beziehungen (Assoziationen) zwischen diesen Klassen widerspiegelt.
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
info10 – OOP
1.5 Beziehungen – Assoziation
Markus Schlager
Klassendiagramm – Erstfassung WELT
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten
enthält >
Aggregation Vererbung Verfeinerung Variablen Nachrichten
nth
lt
el t> m m
hä
nt
>
10..15 umsorgt >
beschäftigt >
SCHÜLER 1
1..∗
KÖNIGIN
MITARBEITER
∗ bedeutet beliebig viele (auch keine). 1..∗ bedeutet mindestens ein(e).
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
1.6 Vielfachheiten – Multiplizitäten
info10 – OOP Markus Schlager
I
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 Nachrichten Kapselung Sequenzdiagramme Datentypen
info10 – OOP
1.6 Vielfachheiten – Multiplizitäten
Markus Schlager
Klassendiagramm – Vielfachheiten WELT 1
1
Grundkonzepte Klassen Namen
1
UML-Darstellung Tausammler Assoziation Multiplizitäten
enthält >
Aggregation Vererbung Verfeinerung Variablen Nachrichten
lt
nth m m
hä
sa
t>
nt
>
n
1
< gehört zu
n
n
Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
TEIL TEIL
Abkürzung mit Aggregationspfeil: GANZES
I
1
Grundkonzepte
TEIL
Beachte die Form der Pfeilspitze sowie das Fehlen des Assoziationsnamens und der Vielfachheit beim Ganzen.
1.7 Teil–Ganzes – Aggregation
info10 – OOP Markus Schlager
I
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 Nachrichten Kapselung Sequenzdiagramme Datentypen
info10 – OOP
1.7 Teil–Ganzes – Aggregation
Markus Schlager
Klassendiagramm – Aggregationspfeile WELT
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
∗
m sa
KÄFER 1
>
kt uc
1
rt
∗
hl
1
o sp n tra
0..1 1
sc
e rti
TROPFEN
∗
1 1 SPEICHER
1.8 Generalisierung und Vererbung
info10 – OOP Markus Schlager
I
Erzeuge mit Etoys Instanzen der benötigten Klassen.
Grundkonzepte Klassen
I
erst einmal nur ein Tropfen
I
Welche Etoys-Klassen benutzt du dazu?
I
Stelle die Klassenhierarchie in einem Diagramm dar.
Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
info10 – OOP
1.8 Generalisierung und Vererbung
Markus Schlager
Klassenhierarchie – Erstfassung
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
TROPFEN
BEHÄLTER ist ein >
ein
ein
ist
st
KÄFER
ZEICHNUNG
SPEICHER
WELT
info10 – OOP
1.8 Generalisierung und Vererbung
Markus Schlager
Klassenhierarchie – Erweiterung OBJEKT
Grundkonzepte Klassen Namen
ist ein >
UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung
DARSTELLER
Verfeinerung
< is
Variablen
n>
t ei n
>
ei
ist
ein
ist
BEHÄLTER ist ein >
> ein
ein
ist
st
TROPFEN
Sequenzdiagramme
SPIELWIESE
SPEICHER
ein
ZEICHNUNG
Grundkonzepte Klassen Namen
I
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
UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
SPEZIALISIERUNG I
GENERALISIERUNG
Abkürzung mit Generalisierungspfeil: UNTERKLASSE KÄFER
I
ist ein >
OBERKLASSE ZEICHNUNG
Beachte die Form der Pfeilspitze sowie das Fehlen des Assoziationsnamens.
info10 – OOP
1.8 Generalisierung und Vererbung
Markus Schlager
Klassenhierarchie – Generalisierungspfeile OBJEKT
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung
DARSTELLER
Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme
SPIELWIESE
ZEICHNUNG
KÄFER
TROPFEN
BEHÄLTER
SPEICHER
WELT
Datentypen
1.8 Generalisierung und Vererbung
info10 – OOP Markus Schlager
HUND
SÄUGETIER
Grundkonzepte Klassen
I
Jeder Hund ist ein Säugetier. I
I
I
I
I
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. ©
Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
1.8 Generalisierung und Vererbung
info10 – OOP Markus Schlager
KÄFER I
I
I
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 Nachrichten Kapselung Sequenzdiagramme Datentypen
1.9 Verfeinerung des Entwurfs
info10 – OOP Markus Schlager
I
Verfeinere den Erstentwurf der Klassenkarten. I
I
I
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 Nachrichten Kapselung Sequenzdiagramme Datentypen
info10 – OOP
1.9 Verfeinerung des Entwurfs
Markus Schlager
Klassenkarten – Verfeinerung
Grundkonzepte Klassen
ZEICHNUNG position richtung kostüm
BEHÄLTER
Namen
elementzahl farbe
Tausammler
UML-Darstellung
Assoziation Multiplizitäten Aggregation
einfügen(objekt)
Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme
SPEICHER KÄFER
TROPFEN
punkte
lebensdauer
laufen() transportieren(objekt) sammeln(tropfen)
verdunsten()
2
Dieses Attribut ist für die Tastatursteuerung z. B. eines Käfers wichtig.
schlucken(objekt)
WELT tropfenzahl letzteEingabe2 starten() reset()
Datentypen
1.10 Attribute und Variablen
info10 – OOP Markus Schlager
I
Versieh die Objekte des Tausammlers in den Etoys mit den notwendigen Attributen. I
I
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 Nachrichten Kapselung Sequenzdiagramme Datentypen
1.10 Attribute und Variablen
info10 – OOP Markus Schlager
I
I
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.
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung
I
Wie in der Mathematik benutzt man für Attribute daher Variablen, sogenannte Instanzvariablen.
Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
Beispiel Augenfarbe I In der Realität ist der Wert der Augenfarbe in der molekularen Struktur der Iris „gespeichert“. I 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.
1.11 Methoden und Nachrichten
info10 – OOP Markus Schlager
I
Programmiere nun in den Etoys die ersten Methoden der Objekte (zunächst nur mit einem Tropfen).
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme
I
Bring dem Käfer das Laufen bei. I
I
Du sollst ihn mit den Pfeiltasten lenken können – links/rechts, evtl. auch schneller/langsamer.
Lass den Tropfen verdunsten. I I
I
I
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.
Datentypen
1.11 Methoden und Nachrichten
info10 – OOP Markus Schlager
Startskripte – Initialisierung I Programmiere die Methoden Welt.starten() zum Starten und Welt.reset() zum Zurücksetzen des ganzen Spiels. I 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 Nachrichten Kapselung Sequenzdiagramme Datentypen
I I
I
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?
1.11 Methoden und Nachrichten
info10 – OOP Markus Schlager Grundkonzepte
reset()
Klassen
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. I 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() I Nach einem Reset sollten Käfer und Tropfen (und alle anderen Beteiligten) ihre Aktivitäten beginnen. I Im Moment muss dann der Käfer laufen und der Tropfen verdunsten. I Vorsicht: Die Aktivitäten (und die Beteiligten) könnten noch mehr werden!
UML-Darstellung
I
Namen
Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
info10 – OOP
1.11 Methoden und Nachrichten
Markus Schlager
Auf die Plätze – fertig – los! — Verstanden?
Grundkonzepte Klassen
Methodenaufruf
Namen UML-Darstellung
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.
Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
Punktnotation objektname . methodenname ( Parameterwert ) UML-Darstellung empfaenger.methode(Wert) sender
empfaenger Ergebnis
1.11 Methoden und Nachrichten
info10 – OOP Markus Schlager
Die schlechte Lösung – Warum?
Grundkonzepte Klassen
WELT.reset()
Namen UML-Darstellung
käfer.geheZu(kaefer.startposition)
Tausammler
käfer.blickeIn(kaefer.startrichtung)
Multiplizitäten
käfer.bleibStehen() käfer.setzePunkteAuf(0)
Assoziation
Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung
tropfen.geheZu(tropfen.zufallsposition) tropfen.setzeLebensdauer(tropfen.zufallszeit) tropfen.setzeKostüm(tropfen.urbild) 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.
Sequenzdiagramme Datentypen
info10 – OOP
1.12 Kapselung und Delegierung
Markus Schlager
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. chauffeur.
fahrgast + frage(frage,person)
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
sageSchuhgröße()
chauffeur chauffeur-PRIVAT
Antwort
- schuhgröße = 42 - steuere(taxi)
chauffeur.fahre(self,A,B)
+ fahre(passagier,start,ziel) + sageSchuhgröße()
info10 – OOP
1.12 Kapselung und Delegierung
Markus Schlager
chauffeur.
fahrgast
sageSchuhgröße()
+ frage(frage,person)
chauffeur Grundkonzepte Klassen chauffeur-PRIVAT Namen UML-Darstellung
Antwort
- schuhgröße = Tausammler 42 Assoziation
Multiplizitäten
- steuere(taxi)Aggregation chauffeur.fahre(self,A,B)
Vererbung Verfeinerung
+ fahre(passagier,start,ziel) Variablen + sageSchuhgröße()Nachrichten Kapselung
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.
Sequenzdiagramme Datentypen
1.12 Kapselung und Delegierung
info10 – OOP Markus Schlager
Kennzeichnung in UML
Grundkonzepte Klassen
CHAUFFEUR
Namen
- schuhgröße - geld
Tausammler
UML-Darstellung
Assoziation Multiplizitäten Aggregation
- steuere(taxi) - verändereGeld(betrag) + sageSchuhgröße() + fahre(passagier,start,ziel) + gibWechselgeld(betrag,bezahlt)
I I I I
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 Nachrichten, die eine Instanz dieser Klasse versteht.
Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
info10 – OOP
1.12 Kapselung und Delegierung
Markus Schlager
chauffeur.
fahrgast
sageSchuhgröße()
+ frage(frage,person)
chauffeur Grundkonzepte Klassen chauffeur-PRIVAT Namen UML-Darstellung
Antwort
- schuhgröße = Tausammler 42 Assoziation
Multiplizitäten
- steuere(taxi)Aggregation chauffeur.fahre(self,A,B)
Vererbung Verfeinerung
+ fahre(passagier,start,ziel) Variablen + sageSchuhgröße()Nachrichten Kapselung
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).
Sequenzdiagramme Datentypen
info10 – OOP
1.12 Kapselung und Delegierung
Markus Schlager
chauffeur.
fahrgast
sageSchuhgröße()
+ frage(frage,person)
chauffeur Grundkonzepte Klassen chauffeur-PRIVAT Namen UML-Darstellung
Antwort
- schuhgröße = Tausammler 42 Assoziation
Multiplizitäten
- steuere(taxi)Aggregation chauffeur.fahre(self,A,B)
Vererbung Verfeinerung
+ fahre(passagier,start,ziel) Variablen + sageSchuhgröße()Nachrichten Kapselung
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.
Sequenzdiagramme Datentypen
info10 – OOP
1.12 Kapselung und Delegierung
Markus Schlager
chauffeur.
fahrgast
sageSchuhgröße()
+ frage(frage,person)
chauffeur Grundkonzepte Klassen chauffeur-PRIVAT Namen UML-Darstellung
Antwort
- schuhgröße = Tausammler 42 Assoziation
Multiplizitäten
- steuere(taxi)Aggregation chauffeur.fahre(self,A,B)
Vererbung Verfeinerung
Wie du das machst, ist deine Sache
+ fahre(passagier,start,ziel) Variablen + sageSchuhgröße()Nachrichten Kapselung Sequenzdiagramme Datentypen
Delegierung Mit dem Aufruf einer Methode delegiert der Sender die entsprechende Aufgabe an den (darauf spezialisierten) Empfänger. empfaenger.methode(Wert) sender
empfaenger Ergebnis
1.12 Kapselung und Delegierung
info10 – OOP Markus Schlager
Auf die Plätze. . . – die gute Lösung
Grundkonzepte Klassen
WELT.reset()
Namen UML-Darstellung Tausammler
wiederhole für jedes element
Assoziation Multiplizitäten Aggregation
element.machDichBereit()
Vererbung Verfeinerung Variablen
WELT.starte()
Nachrichten Kapselung
self.reset()
Sequenzdiagramme Datentypen
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.
1.12 Kapselung und Delegierung
info10 – OOP Markus Schlager
I
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 Nachrichten Kapselung Sequenzdiagramme Datentypen
1.13 Zeitliche Abfolgen – Sequenzdiagramme
info10 – OOP Markus Schlager
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. I Wie läuft der Pausenverkauf üblicherweise ab, wenn du an der Reihe bist? I Wer gibt da wem welche Aufträge? I Was ist jeweils das Ergebnis so eines Auftrags? I 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 Nachrichten Kapselung Sequenzdiagramme Datentypen
1.13 Zeitliche Abfolgen – Sequenzdiagramme
info10 – OOP Markus Schlager
Darstellung in einem Sequenzdiagramm
Grundkonzepte Klassen
k:KUNDE
v:VERKÄUFERIN
Namen
m:METZGER
UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation
nimmBestellungAuf(wunsch)
Vererbung
bereiteZu(wunsch)
Verfeinerung Variablen Nachrichten
bezahle(preis)
Kapselung Sequenzdiagramme Datentypen
geld reinige(besteck) gibWechselgeld() wechselgeld imbiss imbiss
1.13 Zeitliche Abfolgen – Sequenzdiagramme
info10 – OOP Markus Schlager
Sequenzdiagramme objekt1
Grundkonzepte
objekt2
Objekt
Objektkonstruktion
Klassen Namen UML-Darstellung Tausammler
nachricht(parameter)
Assoziation Multiplizitäten
new() nachricht()
Aggregation
objekt3
Vererbung Verfeinerung Variablen
nachricht(par) antwort
Nachrichten Kapselung Sequenzdiagramme
nachricht(par)
Datentypen
Zeit
Überlagerung antwort antwort
Selbstdelegation delete()
Aktivitätsbalken
Lebenslinie
Lebensende
1.13 Zeitliche Abfolgen – Sequenzdiagramme
info10 – OOP Markus Schlager
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 Nachrichten Kapselung Sequenzdiagramme Datentypen
1.13 Zeitliche Abfolgen – Sequenzdiagramme
info10 – OOP Markus Schlager
I
I
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 Nachrichten Kapselung Sequenzdiagramme Datentypen
1.13 Zeitliche Abfolgen – Sequenzdiagramme
info10 – OOP Markus Schlager Grundkonzepte Klassen Namen UML-Darstellung
I
Plane die fehlenden Methoden mit Hilfe von Sequenzdiagrammen:
Tausammler Assoziation Multiplizitäten Aggregation
I
I
I
I
I
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 Nachrichten schicken bzw. welches Ergebnis abwarten?
Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
1.13 Zeitliche Abfolgen – Sequenzdiagramme
info10 – OOP Markus Schlager
Tropfenaufnahme
Grundkonzepte Klassen
tropfen
kaefer
Namen UML-Darstellung Tausammler
überlappt(self)
Assoziation Multiplizitäten Aggregation Vererbung
WAHR
Verfeinerung Variablen
istBeladen()
Nachrichten Kapselung Sequenzdiagramme Datentypen
FALSCH ladeAuf(self)
beende(verdunsten)
1.13 Zeitliche Abfolgen – Sequenzdiagramme
info10 – OOP Markus Schlager
Tropfentransport
Grundkonzepte Klassen
tropfen
kaefer
Namen UML-Darstellung Tausammler Assoziation Multiplizitäten
machSchritt()
Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme
bestimmeNeuePosition()
position geheZu(position)
Datentypen
1.13 Zeitliche Abfolgen – Sequenzdiagramme
info10 – OOP Markus Schlager
Tropfenabgabe
Grundkonzepte Klassen
speicher
kaefer
Welt
Namen UML-Darstellung Tausammler Assoziation
überlappt(self)
Multiplizitäten Aggregation
WAHR
Vererbung Verfeinerung Variablen
schlucke(trTropfen)
Nachrichten Kapselung
lassLos(trTropfen)
Sequenzdiagramme
senkeTropfenzahl(1)
Datentypen
erhöhePunkte(1) pruefeSpielende() hatTropfen() beendeSpiel()
FALSCH
1.13 Zeitliche Abfolgen – Sequenzdiagramme
info10 – OOP Markus Schlager Grundkonzepte Klassen Namen UML-Darstellung
I
Programmiere die fehlenden Methoden. I
I
I
I
I
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!
Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
1.14 Datentypen
info10 – OOP Markus Schlager
I
Speichere das Projekt unter einem neuen Namen ab.
I
Erweitere den Tausammler in den Etoys auf mehrere Tropfen.
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation
I
Welche neuen Schwierigkeiten treten dabei auf?
Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme Datentypen
1.14 Datentypen
info10 – OOP Markus Schlager
Probleme I Wenn der Käfer einen Tropfen trifft, muss er wissen, ob er schon beladen ist, weil er immer nur einen Tropfen tragen kann. I Der Käfer muss wissen, welchen der Tropfen er gerade transportiert, weil er diesem Tropfen immer seine Position übermitteln muss.
Grundkonzepte Klassen Namen UML-Darstellung Tausammler Assoziation Multiplizitäten Aggregation Vererbung Verfeinerung Variablen Nachrichten Kapselung Sequenzdiagramme
Lösung I zwei neue Attribute, also Variablen: istBeladen kann WAHR oder FALSCH sein transporttropfen verweist auf ein anderes Objekt, den gerade transportierten Tropfen I Die Art der in einer Variablen gespeicherten Werte nennt man den (Daten-)Typ der Variable.
Datentypen
1.14 Datentypen
info10 – OOP Markus Schlager
I
I
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 Nachrichten Kapselung Sequenzdiagramme Datentypen
info10 – OOP Markus Schlager Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen
Teil II Ablaufmodellierung
Verzweigungen Wiederholungen
Überblick
info10 – OOP Markus Schlager
Grundkonzepte
Abläufe Algorithmen Struktogramme
Ablaufmodelliierung
Flussdiagramme Sequenzen Verzweigungen Wiederholungen
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
Gliederung
info10 – OOP Markus Schlager Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen
Ablaufmodelliierung Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen und Schleifen
Verzweigungen Wiederholungen
2.1 Algorithmen
info10 – OOP Markus Schlager
Gelernt ist gelernt – Leberkäse satt I Was macht der Metzger eigentlich genau, wenn du deine Leberkäsesemmel bestellst? I Ist es immer das gleiche? I Gibt es manchmal Probleme? I Was hat er zu tun, wenn du für deine fünf Freunde mitbestellst – Leberkäsesemmeln, was sonst?
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. I
Stelle einen Algorithmus für die Arbeit des Metzgers beim Leberkäsesemmelverkauf auf.
Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen
info10 – OOP
2.2 Struktogramme
Markus Schlager
I
Eine Möglichkeit, Algorithmen darzustellen, sind Struktogramme:
Abläufe Algorithmen Struktogramme Flussdiagramme
bereiteLeberkäsesemmeln(Bestellung)
Sequenzen Verzweigungen Wiederholungen
merkeDir(Bestellung) Wiederhole für Bestellung.Semmeln Zutaten vorhanden? WAHR schneideAuf(Semmel) schneide(Leberkäsescheibe) belege(S-Boden, LK-Scheibe) Aufstrich? WAHR FALSCH ∅ bestreiche(LK,Aufstrich) schließe(Semmel) gibAus(fertige Semmeln)
FALSCH gibAus(bisher fertige Semmeln)
brich ab
info10 – OOP
2.3 Flussdiagramme
Markus Schlager
I
Eine weitere Möglichkeit, Algorithmen darzustellen, sind Flussdiagramme:
Abläufe Algorithmen Struktogramme Flussdiagramme
bereiteLeberkäsesemmeln(Bestellung)
Sequenzen Verzweigungen Wiederholungen
Start
ja
Bestellung abgearbeitet?
Bestellung
schließe(Semmel)
fertige Semmeln
Ende
bisher fertige Semmeln
Abbruch
nein
nein
Zutaten vorhanden?
ja schneideAuf(Semmel)
schneide(Leberkäsescheibe)
belege(S-Boden, LK-Scheibe)
nein
ja Aufstrich?
bestreiche(LK, Aufstrich)
info10 – OOP
2.3 Flussdiagramme
Markus Schlager
I
Elemente von Flussdiagrammen:
Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen
Start
Ein-/Ausgabe
Aktivität
Ende
ja
nein Bedingung
info10 – OOP
2.4 Sequenzen
Markus Schlager
I
Eine Folge von Anweisungen heißt Sequenz.
Abläufe Algorithmen Struktogramme
schneideAuf(Semmel) schneide(Leberkäsescheibe) belege(S-Boden, LKScheibe)
Start
Flussdiagramme Sequenzen Verzweigungen Wiederholungen
schneideAuf(Semmel)
schneide(Leberkäsescheibe)
belege(S-Boden, LK-Scheibe)
Ende
info10 – OOP
2.5 Verzweigungen
Markus Schlager
I
Eine bedingte Anweisung heißt einseitige Verzweigung.
ja Aufstrich?
bestreiche(LK, Aufstrich)
Ende
Struktogramme
Sequenzen
FALSCH ∅
Start
nein
Algorithmen
Flussdiagramme
Aufstrich? WAHR bestreiche(LK,Aufstrich)
Abläufe
Verzweigungen Wiederholungen
info10 – OOP
2.5 Verzweigungen
Markus Schlager
I
Eine Alternativentscheidung heißt zweiseitige Verzweigung.
Algorithmen Struktogramme Flussdiagramme
Zutaten vorhanden? WAHR bereiteZu(LK-Semmel)
Abläufe
Sequenzen
FALSCH gibAus(LK-Semmeln)
Verzweigungen Wiederholungen
Start
ja
Zutaten vorhanden?
nein
bisher fertige Semmeln
bereiteZu(LK-Semmel)
Ende
info10 – OOP
2.6 Wiederholungen und Schleifen
Markus Schlager
I
Soll eine Sequenz mehrfach durchlaufen werden, spricht man von einer Wiederholung oder Schleife.
Bestellung abgearbeitet?
nein bereiteZu(aktuelle Semmel)
I
Die zu wiederholende Sequenz wird jeweils vollständig ausgeführt.
Algorithmen Struktogramme Flussdiagramme
Wiederhole für Bestellung.Semmeln bereiteZu(aktuelle Semmel)
Start
Abläufe
Sequenzen Verzweigungen Wiederholungen
ja Ende
2.6 Wiederholungen und Schleifen
info10 – OOP Markus Schlager
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
I
Führe nebenstehenden Algorithmus aus.
I
Wandle das Struktogramm in ein Flussdiagramm um.
I
Programmiere das ganze mit Etoys.
Abläufe Algorithmen Struktogramme Flussdiagramme Sequenzen Verzweigungen Wiederholungen
info10 – OOP Markus Schlager Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs
Teil III
Tastaturkürzel Speichern Speichern – Image Speichern – Projekte Speichern – Monticello Hallo Welt!
Smalltalk I
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
Überblick
info10 – OOP Markus Schlager
Grundkonzepte
Squeak Arbeitsoberfläche Maustasten
Ablaufmodelliierung
Weltmenüs Halomenüs Tastaturkürzel Speichern
Smalltalk I – die Entwicklungsumgebung Squeak
Speichern – Image Speichern – Projekte Speichern – Monticello Hallo Welt!
Smalltalk II – Grundzüge der Programmiersprache
Der Browser Anlegen einer neuen Klasse Planung
Pharo I – Smalltalk-Entwicklung mit Pharo
Kategorie anlegen Klassendefinition Attribute – Instanzvariablen
Pharo II – Grundzüge von Smalltalk
Vererbung und Polymorphismus Initialisierung Protokoll anlegen
Java I – Klassen in BlueJ anlegen
Methodendefinition Datenkapselung Methoden mit Rückgabewert
Java II – JGUIToolbox und weitere Konstrukte Zustandsmodellierung Anhang
Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung
Gliederung
info10 – OOP Markus Schlager Squeak
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
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
3.1 Die Arbeitsoberfläche
info10 – OOP Markus Schlager 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
3.1 Die Arbeitsoberfläche
info10 – OOP Markus Schlager 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
I
Wichtigster Unterschied zum squeakland-Image ist die Klappe Werkzeugkiste am rechten Rand.
Übung
3.1 Die Arbeitsoberfläche
info10 – OOP Markus Schlager 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
I
Bei den Halos gibt es ein Schraubenschlüssel-Halo für den Zugriff auf die Programmierwerkzeuge.
Übung
3.2 Rot, Gelb, Blau – die Maus
info10 – OOP Markus Schlager
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 Hallo Welt!
Gelb – mittlere Maustaste öffnet Kontextmenüs.
Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute – Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition
Blau – rechte Maustaste führt Metaoperationen aus, bringt z. B. die Halos zum Vorschein.
Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung
info10 – OOP
3.3 Wichtige Weltmenüs
Markus Schlager
linke Maustaste (rot)
mittlere Maustaste (gelb)
Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs
Das Projektmenü ist der Navigator -Klappe ähnlich.
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
Speichern bedeutet stets Speichern des gesamten Images im aktuellen Zustand, nicht nur des aktuellen Projektes.
Durch Anklicken in der Objekthierarchie lassen sich auch ‚verschwundene‘ Objekte wieder finden. Alternative: Shift + roter Klick auf den Hintergrund
Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung
3.4 Halomenüs von Morph-Objekten
info10 – OOP Markus Schlager
graues Halo
rotes Halo
Squeak Arbeitsoberfläche
Besonders nützlich ist hier das LayoutUntermenü.
Dieses ProgrammierMenü 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).
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
3.5 Tastaturkürzel
info10 – OOP Markus Schlager
I
In zahlreichen Menüs (im Bild das Kontextmenü eines Workspace) sind in Klammern Tastaturkürzel angegeben.
Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs
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. I
I
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
3.6 Speichern
info10 – OOP Markus Schlager Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel
Vorbemerkung zum Speichern
Speichern Speichern – Image Speichern – Projekte
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.
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
3.7 Speichern des gesamten Images
info10 – OOP Markus Schlager
I
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
3.8 Speichern von Projekten
info10 – OOP Markus Schlager
I
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
3.9 Speichern von Paketen – Monticello
info10 – OOP Markus Schlager
I
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
3.10 Hallo Welt!
info10 – OOP Markus Schlager
I I I
I
I I
I
Ö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-Nachrichten, 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
3.11 Der Browser
info10 – OOP Markus Schlager
I
Öffnet ein neues Projekt und darin einen Workspace.
I
Schreibt die Zeile WatchMorph new openInWorld. in den Workspace und führt sie aus (do it).
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
I
I
Ruft über das Programmiermenü (graues Halo) einen Browser für den Morf auf.
Protokoll anlegen
Ziel wird es sein, diese Uhr zu ‚verbessern‘, so könnte sie z. B. jede Sekunde ihre Farbe4 wechseln.
Methoden mit Parameter
Methodendefinition Datenkapselung Methoden mit Rückgabewert
Methoden mit temporären Variablen Methodensuche Übung
4
Um die Namen der Farbattribute zu eruieren, könnt ihr den Morf auch mit dem Inspector erforschen.
3.11 Der Browser
info10 – OOP Markus Schlager 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
I
Der Browser kennt zwei Darstellungsformen: I
I
I
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.
Attribute – Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung
3.11 Der Browser
info10 – OOP Markus Schlager 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
I
Teilbereiche des Browsers I
die logischen Kategorien von Klassen I I
I
I
I
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
Attribute – Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
I
Ö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 Anlegen einer neuen Klasse
I
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.
Planung Kategorie anlegen Klassendefinition Attribute – Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung
I
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
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
MyWatchMorph ist Unterklasse von WatchMorph.
I
Objekte der Klasse MyWatchMorph benötigen ein zusätzliches Attribut farbwechsel, das speichert, ob das Vertauschen der Farben ein- oder ausgeschaltet ist.5
Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern – Image Speichern – Projekte Speichern – Monticello
I
I
I
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: WatchMorph
Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute – Instanzvariablen Vererbung und Polymorphismus Initialisierung
MyWatchMorph
Protokoll anlegen Methodendefinition Datenkapselung
+initialize() +step()
-farbwechsel: boolesch +invertiereFarben()
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
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
Erzeugt eine neue Kategorie für dieses Projekt. 7 I
I
I
I
I
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!
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
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.
Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
Erzeugt die neue Klasse MyWatchMorph als Unterklasse von WatchMorph. I
I
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!
Der Browser WatchMorph subclass: #MyWatchMorph Anlegen einer neuen Klasse instanceVariableNames: ’’ Planung Kategorie anlegen classVariableNames: ’’ Klassendefinition Attribute – poolDictionaries: ’’ Instanzvariablen category: ’Versuchsklassen’ Vererbung und Polymorphismus
I
I
8
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
Wann immer ihr aufgefordert werdet, eure Initialen einzugeben,
Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
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. I
Ändert den Quelltext dazu folgendermaßen ab:
Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern – Image Speichern – Projekte
WatchMorph subclass: #MyWatchMorph instanceVariableNames: ’farbwechsel’ classVariableNames: ’’ poolDictionaries: ’’ category: ’Versuchsklassen’ I
I
I
(lokale) Variablennamen müssen mit einem Kleinbuchstaben beginnen! Der Variablentyp (hier wäre er boolesch bzw. Boolean) wird in Smalltalk nicht festgelegt. Alt-s.
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
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager Squeak Arbeitsoberfläche
I
Schaltet den Browser auf Hierarchy Browser um, sodass die Klassenhierarchie angezeigt wird.
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
I
MyWatchMorph wurde als Unterklasse von WatchMorph angelegt – was bedeutet das?
Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
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 Methoden mit Parameter
I 9
Noch hat farbwechsel keinen Wert: nil
Öffnet einen Workspace, erzeugt mit dem Befehl MyWatchMorph new openInHand. eine Instanz der Klasse und erforscht den Morph, um das zu sehen.
Methoden mit temporären Variablen Methodensuche Übung
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
I
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)
Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern – Image Speichern – Projekte Speichern – Monticello Hallo Welt! Der Browser
I
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.
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
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel
I
I
Bei der Erzeugung eines neuen Objektes müssen dessen Attributen Werte zugewiesen werden.
Speichern
Das erledigt in der Regel die Methode initialize im Protokoll initialization.
Hallo Welt!
Speichern – Image Speichern – Projekte Speichern – Monticello
Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen
I
I
Seht euch im Hierarchy Browser den Quelltext dieser Methode der Klasse WatchMorph an. Was passiert da?
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
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
1 2 3 4 5 6 7 8 9 10 11
WatchMorph»initialize10 initialize "initialize the state of the receiver" super initialize.
Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern – Image
self handsColor: Color red. self centerColor: Color gray. romanNumerals := false. antialias := false. fontName := ’NewYork’. self extent: 130 @ 130. 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)
I
Squeak
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
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
I
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.
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
I
I
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.
Kategorie anlegen
Wie sollte wohl die initialize-Methode der neuen Klasse MyWatchMorph aussehen? Notiert den vermutlichen Quelltext!
Methoden mit temporären Variablen
Klassendefinition Attribute – Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter
Methodensuche Übung
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
Eröffnet ein neues Protokoll für die Methode MyWatchMorph»initialize. 11
Squeak Arbeitsoberfläche Maustasten Weltmenüs
I
I
I
I
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).
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
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.
Methoden mit temporären Variablen Methodensuche Übung
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
Programmiert die neue Methode initialize. I
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"
Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern – Image Speichern – Projekte Speichern – Monticello Hallo Welt!
| temporary variable names | statements
Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen
I
Ersetzt die Vorlage durch folgenden Quelltext, den ihr per Copy&Paste weitgehend aus WatchMorph»initialize übernehmen könnt: 12
Klassendefinition Attribute – Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen
initialize "initialize the state of the receiver" super initialize.
Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen
farbwechsel := true I 12
Alt-s.
Zuordnungspfeil als Unterstrich
Methodensuche Übung
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
Ein wichtiges Prinzip objektorientierter Programmierung ist die Datenkapselung: I
I
I
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. I
I I
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
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
Zunächst die Get-Methode, eine Methode mit Rückgabewert
Squeak Arbeitsoberfläche Maustasten Weltmenüs
1 2
farbwechsel ↑farbwechsel
Halomenüs Tastaturkürzel Speichern Speichern – Image
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 I
Wird bei einer Methode kein expliziter Rückgabewert definiert, liefert die Methode standardmäßig das aktuelle Objekt als Ergebnis zurück (ˆself).
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.
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
1 2 3 4 5 6
Nun die Set-Methode, eine Methode mit Parameter farbwechsel: boolWert "Setzt bei boolescher Eingabe das farbwechsel-Verhalten"
Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern – Image
(boolWert basicType = #Boolean) ifTrue: [farbwechsel := boolWert]
Speichern – Projekte Speichern – Monticello Hallo Welt! Der Browser
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.
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
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
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):
Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern – Image
testuhr := MyWatchMorph new. testuhr openInWorld.
Speichern – Projekte Speichern – Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse
Transcript clear; show: testuhr farbwechsel; cr.
Planung Kategorie anlegen Klassendefinition
testuhr farbwechsel: 5. Transcript show: testuhr farbwechsel; testuhr farbwechsel: false. Transcript show: testuhr farbwechsel; testuhr farbwechsel: 5. Transcript show: testuhr farbwechsel; testuhr farbwechsel: true. Transcript show: testuhr farbwechsel;
Attribute – Instanzvariablen
cr.
Vererbung und Polymorphismus Initialisierung
cr.
Protokoll anlegen Methodendefinition Datenkapselung
cr.
Methoden mit Rückgabewert Methoden mit Parameter
cr.
Methoden mit temporären Variablen Methodensuche Übung
Statt 5 könntet ihr auch sonst etwas schreiben.
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
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:
Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern – Image Speichern – Projekte Speichern – Monticello Hallo Welt!
1 2 3 4 5 6 7
invertiereFarben "vertauscht Zeiger- und Hintergrundfarbe" | hFarbe | self farbwechsel ifTrue: [hFarbe := self color. self color: handsColor. self handsColor: hFarbe]
Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute – Instanzvariablen Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung
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,
Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
Nun muss nur noch die Methode step15 (Protokoll stepping and presenter) gegenüber WatchMorph»step geeignet angepasst werden:
Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel
1 2 3
step self invertiereFarben. self changed
Speichern Speichern – Image Speichern – Projekte Speichern – Monticello Hallo Welt! Der Browser
I
I
Aber was bedeutet die Nachricht changed in Zeile 3? Es gibt zwei Werkzeuge, das herauszufinden: I
I
die Schaltflächen senders und implementors im (am besten Hierarchy ) Browser den Methoden-Sucher (Selector Browser) in der Klappe Werkzeugkiste
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
15
Diese Methode wird bei Morph-Objekten in regelmäßigen Abständen aufgerufen; lest dazu den Quelltext von Morph»step!
Methodensuche Übung
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
senders und implementors im (Hierarchy ) Browser I
I
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.
Squeak Arbeitsoberfläche Maustasten Weltmenüs Halomenüs Tastaturkürzel Speichern Speichern – Image Speichern – Projekte Speichern – Monticello Hallo Welt! Der Browser
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. I
Sucht in der erhaltenen Liste nach den Oberklassen der aktuellen Klasse, z. B. Morph»changed und Object»changed.
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
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
Methoden-Sucher (oder Selector Browser) in der Klappe Werkzeugkiste 16 text
Squeak Arbeitsoberfläche Maustasten Weltmenüs
I
I
I
I
Im Suchfenster lassen sich beliebige Bruchstücke von Selektoren eingeben16 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.
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
16
oder auch Anderes, etwa Ein-Ausgabe-Muster (vgl. die Anleitung im unteren Textfeld)
3.12 MyWatchMorph – eine neue Klasse
info10 – OOP Markus Schlager
I
Was noch wünschenswert wäre:
Squeak Arbeitsoberfläche Maustasten
I
Falls jemanden das ‚Geblinke‘ der Uhr
Weltmenüs Halomenüs Tastaturkürzel
I
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ü.
Speichern Speichern – Image Speichern – Projekte Speichern – Monticello Hallo Welt! Der Browser Anlegen einer neuen Klasse Planung Kategorie anlegen Klassendefinition Attribute – Instanzvariablen
I
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.
Vererbung und Polymorphismus Initialisierung Protokoll anlegen Methodendefinition Datenkapselung Methoden mit Rückgabewert Methoden mit Parameter Methoden mit temporären Variablen Methodensuche Übung
info10 – OOP Markus Schlager Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten
Teil IV
Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen
Smalltalk II
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
Überblick
info10 – OOP Markus Schlager
Grundkonzepte
Smalltalk Objekt-Modell Instanzen und Variablen
Ablaufmodelliierung
new, new: und initialize Nachrichten Arithmetik Vergleiche
Smalltalk I – die Entwicklungsumgebung Squeak
Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen
Smalltalk II – Grundzüge der Programmiersprache
Private Variablen Nichtprivate Variablen Literale
Pharo I – Smalltalk-Entwicklung mit Pharo
Zahlen Zeichen Zeichenketten Symbole
Pharo II – Grundzüge von Smalltalk
Arrays Verzweigung Bedingungen
Java I – Klassen in BlueJ anlegen
Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung
Java II – JGUIToolbox und weitere Konstrukte
Anfangsbedingung Endbedingung Übungen
Zustandsmodellierung
Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
Anhang
Gliederung
info10 – OOP Markus Schlager
Smalltalk II – Grundzüge der Programmiersprache Das Objekt-Modell von Squeak Instanzen und Variablen – Wertzuweisung new, new: und initialize Nachrichten an Instanzen Priorität/Rangfolge von Nachrichten 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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
4.1 Das Objekt-Modell von Squeak
info10 – OOP Markus Schlager
I I
I
I I
I
I
I
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 Nachrichten (Methodenaufrufe) miteinander.
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
4.2 Instanzen und Variablen – Wertzuweisung
info10 – OOP Markus Schlager
I
Instanzen werden in der Regel durch die Nachricht new an die Klasse erzeugt, z. B.17
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize
MyWatchMorph new.
Nachrichten Arithmetik Vergleiche Logik
I
Um auf die Instanz zugreifen zu können, sollte sie als Wert einer Variablen zugewiesen werden:18
Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen
testUhr := MyWatchMorph new.
Literale Zahlen Zeichen
oder:19
Zeichenketten Symbole Arrays
testUhr ← MyWatchMorph new.
Verzweigung Bedingungen Bedingte Anweisungen
I I
:= bzw. ← ist der Zuweisungsoperator. (lokale) Variablennamen müssen mit einem Kleinbuchstaben beginnen.
Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen
17
Zählschleifen
18
Übungen – Turtle-Grafik
z. B. im Workspace oder innerhalb einer Methodendefinition Probiert das in einem Workspace aus! (Alt-d) 19 ’←’ wird als Unterstrich ’_’ eingegeben.
Intervalldurchlauf
Kollektionen und Iteratoren
4.3 new, new: und initialize
info10 – OOP Markus Schlager
I
new ist eine Klassenmethode, die alle Klassen von der Metaklasse Behavior erben:
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize
Behavior>>new "Answer a new initialized instance of the receiver (which is a class) with no indexable variables. Fail if the class is indexable."
Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen
↑ self basicNew initialize
Nichtprivate Variablen Literale Zahlen
I
Was passiert beim Aufruf der Methode? I
I
I
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. 20
Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf
20
Das habt ihr bei MyWatchMorph gesehen und selbst verändert.
Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.3 new, new: und initialize
info10 – OOP Markus Schlager
I
I
Bei manchen Objekten – etwa Listen oder Zeichenketten – muss man bei der Erzeugung die Anzahl ihrer Elemente angeben. Solche Instanzen werden mit new: erzeugt:
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik
Behavior>>new: sizeRequested "Answer an initialized instance of this class with the number of indexable variables specified by the argument, sizeRequested."
Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole
↑ (self basicNew: sizeRequested) initialize
Arrays Verzweigung
I
Beispielsweise entsteht mit
Bedingungen Bedingte Anweisungen Übungen
testWort := String new: 10.
Existenztest Bedingte Wiederholung Anfangsbedingung
eine zehn Zeichen lange Zeichenkette testWort.21 21
testWort besteht erst einmal nur aus zehn Platzhaltern. testWort at:1 put:$S setzt z. B. das erste Zeichen auf ’S’.
Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
info10 – OOP
4.4 Nachrichten an Instanzen
Markus Schlager
I
Instanzen können Nachrichten empfangen.
I
Es gibt drei Arten von Nachrichten.
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik
Unäre Nachricht (ohne Argument)
Vergleiche Logik Priorität von Nachrichten
empfaenger methodenName.
Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen
22
Literale Zahlen Zeichen
testUhr openInHand. Time now. Date today. 5 squared.
Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf
22
Die Bspe. zu Daten und Zahlen wertet ihr besser mit Alt-p aus (print it)
Übungen – Turtle-Grafik Kollektionen und Iteratoren
info10 – OOP
4.4 Nachrichten an Instanzen
Markus Schlager
Schlüsselwortnachricht (mit Argument)
Smalltalk Objekt-Modell
empfaenger mWort1: wert1 mWort2: wert2.
Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik
23
Vergleiche Logik Priorität von Nachrichten
testUhr farbwechsel: false. testUhr x: 100 y:130. testUhr setColor: Color yellow borderWidth: 10 borderColor: Color blue. 5 raisedTo: 3.
Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen
I I
I 23
Beachtet die Doppelpunkte! Methodennamen können aus beliebig vielen Teilwörtern bestehen. Am Ende jeder Nachricht steht ein Punkt.
Natürlich sind yellow und blue auch nur (unäre) Nachrichten an Instanzen der Klasse Color.
Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
info10 – OOP
4.4 Nachrichten an Instanzen
Markus Schlager Smalltalk
Binäre Nachricht (zwei Objekte)
Objekt-Modell Instanzen und Variablen new, new: und initialize
empfaenger binäreNachricht parameterObjekt.
Nachrichten Arithmetik Vergleiche Logik
I
Binäre Nachrichten haben die Gestalt von arithmetischen Operatoren.
Arithmetik: + 15+4 15-4 15*4 15/4 15//4 15\\4
Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen
-
*
/
//
\\
24
"Addition" "Subtraktion" "Produkt" "Division" "Division (ganzzahlig)" "Divisionsrest"
Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf
24
Die Bspe. zu binären Nachrichten wertet ihr am besten mit Alt-p aus (print it)
Übungen – Turtle-Grafik Kollektionen und Iteratoren
info10 – OOP
4.4 Nachrichten an Instanzen
Markus Schlager Smalltalk
Binäre Nachricht (zwei Objekte)
Objekt-Modell Instanzen und Variablen new, new: und initialize
empfaenger binäreNachricht parameterObjekt.
Nachrichten Arithmetik Vergleiche Logik
I
Binäre Nachrichten haben die Gestalt von arithmetischen Operatoren.
Arithmetik: + 15+4 15-4 15*4 15/4 15//4 15\\4
Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen
-
*
/
//
\\
24
"Addition" "Subtraktion" "Produkt" "Division" "Division (ganzzahlig)" "Divisionsrest"
Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf
24
Die Bspe. zu binären Nachrichten wertet ihr am besten mit Alt-p aus (print it)
Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.4 Nachrichten an Instanzen
info10 – OOP Markus Schlager
Vergleich: < >= = ~= == ~~ I Vergleichsoperatoren liefern als Ergebnisse die booleschen Werte true oder false. I Erzeugt im Workspace erst einmal zwei Variablen mit der gleichen Zeichenkette als Wert (Alt-d):
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen
a := ’Squeak’. b := ’Squeak’.
Nichtprivate Variablen Literale Zahlen Zeichen
Vergleich von Werten
Zeichenketten Symbole Arrays
15 15 15 15 15 a a 15
< 4 "kleiner als" 4 "groesser als" >= 4 "groesser oder gleich" = 4 "gleich" = b = ’Scratch’ ~= 4 "nicht gleich"
Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
info10 – OOP
4.4 Nachrichten an Instanzen
Markus Schlager
Vergleich:
=
=
~=
==
~~
Smalltalk Objekt-Modell
a := ’Squeak’. b := ’Squeak’.
Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche
Vergleich von Identitäten
Logik Priorität von Nachrichten Sequenzen und Blöcke
15 == 4 "identisch gleich " 15 == 15 " gleiches Objekt" ’Squeak’ == ’Squeak’ a == b "!!!" 15 ~~ 4 "nicht das gleiche Objekt" 15 ~~ 15 a ~~ b
Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest
I I
Überrascht? – Auch Variablen sind eigenständige Objekte! Zunächst werdet ihr aber vor allem den Vergleich von Werten benötigen.
Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.4 Nachrichten an Instanzen
info10 – OOP Markus Schlager
Logik: &
|
Smalltalk Objekt-Modell
true true false false true true false false
& & & & | | | |
true false true false true false true false
"logisches Und (AND)"
Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten
"logisches Oder (OR)"
Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen
I
Wie in der Mathematik üblich, ist ein Oder stets ein Oder auch.
Sonstiges: ,
Zeichenketten Symbole Arrays Verzweigung Bedingungen
@
->
25 26
Bedingte Anweisungen Übungen Existenztest
’Haus’,’halt’ 100@200
"Konkatenation (Aneinanderhaengen)" Bedingte Wiederholung Anfangsbedingung "Ein Punkt mit x- und y-Koordinate" Endbedingung Übungen Zählschleifen Intervalldurchlauf
25
Erforscht diese Beispiele: Auswählen und Alt-i 26 -> Assoziation, vielleicht später . . .
Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.5 Priorität/Rangfolge von Nachrichten
info10 – OOP Markus Schlager
Priorität von Nachrichten I
Abarbeitung von links nach rechts, aber
I
Unär vor Binär vor Schlüsselwort
I
Änderung der Reihenfolge durch Klammern ()
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke
Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript
show: ’Haus’ , ’halt’. cr. "Neue Zeile im Transcript" show: 16 sqrt. show: 16 sqrt negated. show: 16 + 3. show: 16 + 3 squared. show: 16 + 3 * 2. "!" show: 16 + (3 * 2). show: 16 + 3 squared * 2. show: 4 raisedTo: 9. "!!!" show: (4 raisedTo: 9). show: (4 raisedTo: 9 - 7). show: (4 sqrt raisedTo: 9). show: (4 raisedTo: 9 sqrt).
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
4.6 Befehlssequenzen und Blöcke
info10 – OOP Markus Schlager
I
I
Eine Abfolge mehrerer Nachrichten wird als Sequenz bezeichnet. Betrachtet z. B. die Initialisierungsmethode der Klasse WatchMorph:
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke
WatchMorph>>initialize
Variablen Private Variablen Nichtprivate Variablen
super initialize. self handsColor: Color red. self centerColor: Color gray. romanNumerals := false. antialias := false. fontName := ’NewYork’. self extent: 130 @ 130. self start
Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung
I
Die Nachrichten innerhalb einer Sequenz werden durch einen Punkt voneinander getrennt.
Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.6 Befehlssequenzen und Blöcke
info10 – OOP Markus Schlager
I
Flussdiagramm Start
I
Struktogramm WatchMorph»initialize
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize
initialisiere wie Oberklasse
setze Zeigerfarbe rot
setze Zentrumsfarbe grau
schalte römische Ziffern aus
schalte Kantenglättung aus
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
Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen
setze Schriftart ’New York’
setze Abmessungen auf 130x130
starte
Ende
Struktogramme ermöglichen eine tabellarische Darstellung von Algorithmen oder Abläufen.
Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.6 Befehlssequenzen und Blöcke
info10 – OOP Markus Schlager
I
I
Einem einzigen Empfänger können auch mehrere Nachrichten zusammen geschickt werden. Trennung der Nachrichten durch einen Strichpunkt: I
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik
statt
Vergleiche Logik
Transcript show: ’Erste Nachricht’. Transcript cr. "Zeilenumbruch" Transcript show: ’Dritte Nachricht’
Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen
I
Literale
nun
Zahlen
Transcript show: ’Erste Nachricht’; cr; show: ’Dritte Nachricht’
Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen
I
oder
Bedingte Anweisungen Übungen Existenztest
Transcript show: ’Erste Nachricht’; cr; show: ’Dritte Nachricht’ Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.6 Befehlssequenzen und Blöcke
info10 – OOP Markus Schlager
I
Durch eckige Klammern [ ] lässt sich eine Befehlssequenz zu einem Block zusammenfassen: einBlock := [Transcript cr; show: ’ein Befehlsblock’. MyWatchMorph new openInWorld].
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten
I
Blöcke sind Instanzen der Klasse BlockClosure und können daher Nachrichten empfangen, z. B. BlockClosure»value, um ihren Inhalt ausführen zu lassen: einBlock value.
I
Blöcke kennen Blockvariablen.
Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen
rechenBlock := [ :b1 :b2 | b1 + (2 * b2)]. I
Diese werden zu Blockbeginn vor einem | mit vorangestelltem Doppelpunkt : deklariert und können von außen angesprochen werden:
Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik
Transcript show: (rechenBlock value:5 value:4).
Kollektionen und Iteratoren
4.7 Variablen
info10 – OOP Markus Schlager
I
Wie im Abschnitt zur Wertzuweisung gezeigt, spielen Variablen eine zentrale Rolle beim Zugriff auf Objekte, um diesen Nachrichten senden zu können.
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche
I
I
I
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.
Logik Priorität von Nachrichten 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
4.7 Variablen
info10 – OOP Markus Schlager
I
Bislang sind euch private Variablen begegnet als Blockvariablen innerhalb eines Anweisungsblocks:
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize
[ :b1 :b2 | b1 + (2 * b2) ] value:5 value:4.
temporäre Variablen innerhalb einer Methode:
Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten
MyWatchMorph>>invertiereFarben | hFarbe | hFarbe := self color. self handsColor: hFarbe.
Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten
Instanzvariablen einer Klasse:
Symbole Arrays Verzweigung
WatchMorph subclass: #MyWatchMorph instanceVariableNames: ’farbwechsel’ classVariableNames: ’’
Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung
Parameter einer Methode:
Anfangsbedingung Endbedingung Übungen
MyWatchMorph>>farbwechsel: boolWert farbwechsel := boolWert
Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
info10 – OOP
4.7 Variablen
Markus Schlager
I
I I
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.
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
| hFarbe | hFarbe := self color. self handsColor: hFarbe.
Übungen Zählschleifen
"ohne Set" "ohne Get"
Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.7 Variablen
info10 – OOP Markus Schlager
Dem gegenüber stehen nichtprivate Variablen: Smalltalk
I I I
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.
Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
WatchMorph subclass: #MyWatchMorph instanceVariableNames: ’farbwechsel,zeitzone’ classVariableNames: ’Zeitzonen’
Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.7 Variablen
info10 – OOP Markus Schlager
I
I
I
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:
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
WatchMorph subclass: #MyWatchMorph instanceVariableNames: ’farbwechsel,zeitzone’ classVariableNames: ’Zeitzonen’
Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.8 Literale
info10 – OOP Markus Schlager Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten
I
I
Literale sind Objekte, auf die (auch ohne Referenzierung durch Variablen) durch einfaches „Hinschreiben“ Bezug genommen werden kann. Smalltalk kennt fünf Arten von Literalen: I I I I I
Zahl (Number) Zeichen (Character) Zeichenkette (String) Symbol Feld (Array)
Arithmetik Vergleiche Logik Priorität von Nachrichten 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
info10 – OOP
4.8 Literale
Markus Schlager
I
In Smalltalk gibt es verschiedene Zahlenklassen: Integer Ganze Zahlen, z. B. 5 420 -1000 I
I
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.
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole
Übung
Arrays Verzweigung Bedingungen
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: ?
Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.8 Literale
info10 – OOP Markus Schlager
I I I
I
27
Einzelzeichen gehören der Klasse Character an. Druckbare Einzelzeichen werden mit vorangestelltem Dollarzeichen dargestellt, z. B. $a, $R, $’, $3, $$. Für nichtdruckbare Zeichen stehen Nachrichten an die Klasse27 Character zur Verfügung, z. B. Leerzeichen Character space Tabulator Character tab Zeilenumbruch Character cr Rückwärtslöschen Character backspace Eurozeichen Character euro28 Besonders wichtig ist das Protokoll testing. Erkundet die Wirkung der zugehörigen Nachrichten in einem Workspace (Alt-p).
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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
info10 – OOP
4.8 Literale
Markus Schlager
I
Zeichenketten (Strings) werden in Smalltalk durch einfache Hochkommata begrenzt, z. B. I I I I
I
Soll der String ein Hochkomma (’) als Zeichen enthalten, muss dieses verdoppelt werden: I
I
Wie geht’s?
wird zu
’Wie geht’’s?’
Vorsicht, doppelte Hochkommata (") kennzeichnen in Smalltalk Kommentare: I
I
’Das ist ein String.’ ’Smalltalk rocks :-)’ ’1234567’ (Das ist keine Zahl!) ’u’ (Das ist etwas Anderes als $u!)
"Das ist ein Kommentar im Quelltext."
Strings beherrschen zahlreiche nützliche Methoden, die sie teilweise auch von der Oberklasse SequenceableCollection erben. I
I I
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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
4.8 Literale
info10 – OOP Markus Schlager
I
I
Symbole sind besondere Zeichenketten, also eine Unterklasse von String. Symbole werden durch ein vorangestelltes Doppelkreuz (#) gekennzeichnet, z. B. I I I
#Symbol #Feb13 #’Ich bin ein Symbol!’
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen
I
I
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.
Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest
I
Symbole werden z. B. als Namen von Klassen oder Methoden verwendet.
Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.8 Literale
info10 – OOP Markus Schlager
I I
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. I I I
I I
I
#(123 124 125 126) #(’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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I
Unter einer Verzweigung oder bedingten Anweisung versteht man ein Konstrukt der Form
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize
einseitige Verzweigung
Nachrichten Arithmetik Vergleiche Logik
wenn Bedingung, dann Aktion
Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen
oder
Nichtprivate Variablen Literale Zahlen
zweiseitige Verzweigung
Zeichen Zeichenketten Symbole
wenn Bedingung, dann Aktion, sonst Alternative
Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen
I
Flussdiagramm WAHR Bedingung
I FALSCH
Struktogramm
Existenztest Bedingte Wiederholung
Bedingung WAHR FALSCH
Anfangsbedingung Endbedingung Übungen Zählschleifen
Aktion
Alternative
Aktion
Alternative
Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I I
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: I
Die Zahl x liegt zwischen 5 und 13. (5>initialize "initialize the state of the receiver" ... romanNumerals := false. ...
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize
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. ...
Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen
WatchMorph>>toggleRoman romanNumerals := romanNumerals not. self createLabels
Private Variablen Nichtprivate Variablen Literale Zahlen
WatchMorph>>romanNumeralString "Answer a string governing the roman-numerals checkbox" ↑ (romanNumerals ifTrue: [’’] ifFalse: [’’]) , ’roman numerals’ translated
Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen
WatchMorph>>createLabels | numeral font h r | self removeAllMorphs. font := StrikeFont familyName: fontName size: (h := self height min: self width)//8. r := 1.0 - (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]
Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I 1 2 3 4 5
WatchMorph»initialize
Smalltalk Objekt-Modell
WatchMorph>>initialize "initialize the state of the receiver" ... romanNumerals := false. ...
Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche
Zeile 4: romanNumerals ist eine Variable mit einem booleschen Wert (false), die sich als Bedingung eignet: Sie kann wahr (true) oder falsch (false) sein.
Logik Priorität von Nachrichten 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
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I 1 2 3 4 5 6
WatchMorph»addCustomMenuItems:hand:
Smalltalk Objekt-Modell
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. ...
Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik
Zeile 1: aHandMorph ist ein Mauszeiger. Zeile 5: Hier wird der entsprechende Eintrag im Menü beschrieben: I
I
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!
Priorität von Nachrichten 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
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I 1 2 3
WatchMorph»toggleRoman
Smalltalk Objekt-Modell
WatchMorph>>toggleRoman romanNumerals := romanNumerals not. self createLabels
Instanzen und Variablen new, new: und initialize Nachrichten
Zeile 2: Hier passieren zwei Dinge: I
I
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.
Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung
Zeile 3: Abschließend wird die Nachricht createLabels an die Uhr selbst (self) geschickt, damit diese ihre Beschriftung (die ‚Labels‘) neu zeichnet.
Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I 1 2 3 4 5 6
WatchMorph»romanNumeralString
Smalltalk Objekt-Modell
WatchMorph>>romanNumeralString "Answer a string governing the roman-numerals checkbox" ↑ (romanNumerals ifTrue: [’’] ifFalse: [’’]) , ’roman numerals’ translated
Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik
Zeile 3-5: eine zweiseitige Verzweigung: I I
I
romanNumerals ist die Bedingung. Ist sie wahr (ifTrue:), wird der nachfolgende Anweisungsblock [...] ausgeführt, ist sie falsch (ifFalse:), der Alternativblock [...].
Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen
I
Einer der beiden Zweige kann auch fehlen.
I
Die Reihenfolge der beiden Zweige ist gleichgültig.
Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
Bedingte Anweisungen in Smalltalk
Smalltalk Objekt-Modell Instanzen und Variablen
I
Bedingung ifTrue:
[Anweisungsblock]
I
Bedingung ifFalse: [Anweisungsblock]
I
Bedingung ifTrue: [Anweisungsblock] ifFalse: [Alternativblock]
new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen
I
Bedingung ifFalse: [Anweisungsblock] ifTrue: [Alternativblock]
Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole
I
Ein Beispiel
Arrays
31
x := 100 atRandom. (x > 50) ifTrue: [Transcript show: x asString ifFalse: [Transcript show: x asString
Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung
cr; , ’: gewonnen!’] cr; , ’: leider verloren’]
Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
31
Probiert es in einem Workspace aus!
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I 1 2 3 4 5 6
WatchMorph»romanNumeralString
Smalltalk Objekt-Modell
WatchMorph>>romanNumeralString "Answer a string governing the roman-numerals checkbox" ↑ (romanNumerals ifTrue: [’’] ifFalse: [’’]) , ’roman numerals’ translated
Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik
I
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 (’’ bzw. ’’) als Wert.32
Priorität von Nachrichten 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
32
Diese Zeichenketten werden (wegen der spitzen Klammern) im Menü als (un)ausgefüllte Checkbox dargestellt.
Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I 1 2 3 4 5 6
WatchMorph»romanNumeralString
Smalltalk Objekt-Modell
WatchMorph>>romanNumeralString "Answer a string governing the roman-numerals checkbox" ↑ (romanNumerals ifTrue: [’’] ifFalse: [’’]) , ’roman numerals’ translated
Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik
Zeile 6: Drei Dinge: I
I
I I
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 ’’ (bzw. ’’) und die Übersetzung von ’roman numerals’ zu einer einzigen Kette aneinandergehängt.
Priorität von Nachrichten 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
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I 1 2 3 4 5 6 7 8 9 10 11 12
I
WatchMorph»createLabels WatchMorph>>createLabels | numeral font h r | self removeAllMorphs. font := StrikeFont familyName: fontName size: (h := self height min: self width)//8. r := 1.0 - (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]
Was passiert hier im wesentlichen? Zeile 3: Als erstes werden alle Submorphe der Uhr entfernt. I
I
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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I 1 2 3 4 5 6 7 8 9 10 11 12
I
WatchMorph»createLabels WatchMorph>>createLabels | numeral font h r | self removeAllMorphs. font := StrikeFont familyName: fontName size: (h := self height min: self width)//8. r := 1.0 - (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]
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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
Übung 1
Smalltalk Objekt-Modell Instanzen und Variablen
I
Bringt euren Uhren der Klasse MyWatchMorph bei, alle z. B. 5 Minuten neue Farben für Zeiger und Hintergrund zu benutzen. I
I
I
Vielleicht ist es hilfreich, die Methode WatchMorph»drawOn: zu lesen. relevante Klassen: Time und Color
Anregungen zur Farbverwaltung: I I
I
I
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.
new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
Übung 2
Smalltalk Objekt-Modell Instanzen und Variablen
I
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.
new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen
I I I
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.
Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I
UML-Modell:
Smalltalk Object
FillInTheBlankMorph
Objekt-Modell Instanzen und Variablen
+class request(frage)
new, new: und initialize Nachrichten Arithmetik
MiniQuiz
Vergleiche +fragenkatalog +punktezaehler +initialize() +stelleFragen(fragenkatalog) +bewerte(antwort,loesung,maxPunkte): punkte +gibEndstandAus()
Logik
Array +at(index) +do(anweisungsblock)
Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen
Punktezaehler
Literale
+punktestand +aktualisiereDich(punkte)
Dialogfenster
Zahlen Zeichen Zeichenketten
Fragenkatalog TextMorph
Rectangle
+text +newContents(string)
+color +width +color(farbe) +width(breite)
Symbole Arrays *
Eintrag
Verzweigung Bedingungen
+frage +loesung +maxPunkte
Bedingte Anweisungen Übungen Existenztest
I
I
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.
Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
MiniQuiz: Struktogramme einiger Methoden 34 MiniQuiz»initialize
Smalltalk
MiniQuiz»stelleFragenAus:katalog
Objekt-Modell Instanzen und Variablen
initialisiere wie Oberklasse lege den fragenkatalog fest erzeuge einen neuen punktezaehler setze den Punktestand auf seinen Startwert stelle die Fragen aus dem fragenkatalog
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
new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole
MiniQuiz»gibEndstandAus
Arrays Verzweigung
lass dir von deinem punktezaehler den punktestand geben gib je nach Punktestand den punktestand und einen passenden Kommentar in einem Dialogfenster aus
MiniQuiz»bewerte:antwort zu:loesung mit:maxPunkte
Bedingungen Bedingte Anweisungen Übungen Existenztest
antwort=loesung WAHR FALSCH
Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen
punkte
0
Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
34
Untermethode
Rückgabewert
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
FillInTheBlankMorph: ein Dialogfenster I Ü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.
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung
| ergebnis | ergebnis := FillInTheBlankMorph request: ’Was denkst du?’. Transcript cr; show: ergebnis.
I I
Probiert beides in einem Workspace aus! Lest die Quelltexte und die Varianten dieser Methoden, um z. B. das Aussehen des Fensters zu beeinflussen.
Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
Dialogfenster: z. B. ein FillInTheBlankMorph I Leider wird bei Verwendung von FillInTheBlankMorph für jeden Dialog ein neues Fenster erzeugt. I Um das zu vermeiden, könntet ihr eine Unterklasse von FillInTheBlankMorph (oder auch direkt von RectangleMorph) anlegen, I
I
I
35
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. 36
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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
4.9 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I 1 2 3 4 5 6 7 8 9 10 11 12 13 14
I I I
In WatchMorph»drawOn: tritt noch eine weitere gebräuchliche Form der Verzweigung auf: WatchMorph>>drawOn: aCanvas "Draw the watch on the given canvas"
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik
| pHour pMin pSec time centerColor | time := Time now. "..." centerColor := cColor ifNil: [Color transparent] ifNotNil: [time hours < 12 ifTrue: [cColor muchLighter] ifFalse: [cColor]]. "..."
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.
Vergleiche Logik Priorität von Nachrichten 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
4.10 Bedingte Wiederholung
info10 – OOP Markus Schlager
I
I
Ein wesentliches Konstrukt in Algorithmen sind bedingte Wiederholungen, in Programmiersprachen oft als while-Schleifen bezeichnet. Man unterscheidet zwei Arten:
Smalltalk Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten
Anfangsbedingung: solange (als)
Sequenzen und Blöcke Variablen Private Variablen
solange (als) Bedingung (noch nicht) erfüllt ist, agiere
Nichtprivate Variablen Literale Zahlen Zeichen
Solange du die dritte Kreuzung noch nicht erreicht hast, gehe geradeaus.
Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen
Endbedingung: solange bis
Übungen Existenztest Bedingte Wiederholung
agiere so lange, bis Bedingung (nicht mehr) erfüllt ist
Anfangsbedingung Endbedingung Übungen
Gehe so lange geradeaus, bis du an die dritte Kreuzung kommst.
Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
info10 – OOP
4.10 Bedingte Wiederholung
Markus Schlager
Anfangsbedingung: erst sehen, dann gehen
Smalltalk Objekt-Modell
I
Flussdiagramm
I
Struktogramm
Instanzen und Variablen new, new: und initialize Nachrichten
dreh dich nach Norden
WAHR
dritte Kreuzung erreicht
dreh dich nach Norden dritte Kreuzung nicht erreicht gehe geradeaus biege links ab
Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen
FALSCH
Literale Zahlen
biege links ab
gehe geradeaus
Zeichen Zeichenketten Symbole
Schleifen mit Anfangsbedingung in Smalltalk
Arrays Verzweigung Bedingungen Bedingte Anweisungen
I
I
[Bedingungsblock] whileTrue: [Anweisungsblock] [Bedingungsblock] whileFalse: [Anweisungsblock]
Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
info10 – OOP
4.10 Bedingte Wiederholung
Markus Schlager
Endbedingung: erst gehen, dann sehen
Smalltalk Objekt-Modell
I
Flussdiagramm
I
Struktogramm
Instanzen und Variablen new, new: und initialize Nachrichten
dreh dich nach Norden gehe geradeaus
dreh dich nach Norden
gehe geradeaus
dritte Kreuzung nicht erreicht biege links ab
WAHR
dritte Kreuzung erreicht
FALSCH
Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen
biege links ab
Zeichen Zeichenketten Symbole
Schleifen mit Endbedingung in Smalltalk
Arrays Verzweigung Bedingungen Bedingte Anweisungen
I
[Anweisungsblock] doWhileTrue: [Bedingungsblock]
Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung
I
[Anweisungsblock] doWhileFalse: [Bedingungsblock]
Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.10 Bedingte Wiederholung
info10 – OOP Markus Schlager
Übung
Smalltalk Objekt-Modell Instanzen und Variablen
I Legt in einer geeigneten Kategorie (z. B. euren Versuchsklassen) eine Unterklasse (z. B. Massenpunkt) von EllipseMorph (oder sonst einem Morph) an. I 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. I Grundsätzlich wäre es vernünftig, wenn sie als Klassenvariable (warum?) auch die Gravitationskonstante zur Verfügung hätten. I Bringt den Instanzen dieser Klasse bei, sich mit Hilfe der Methode kleiner Schritte physikalisch richtig über den Bildschirm zu bewegen.
new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen
I Mögliche Ideen:
Übungen Existenztest
I Freier Fall, senkrechter Wurf, schiefer Wurf, harmonische Schwingung,
Bedingte Wiederholung Anfangsbedingung
Planetenbewegung, elastischer Stoß, . . .
I Wie könnte man die Bewegungen starten bzw. stoppen? I Mit Hilfe von stepTime lässt sich das Tempo der Bewegung steuern.
Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
4.11 Zählschleifen – immer das gleiche
info10 – OOP Markus Schlager
Zeichne ein Quadrat I
I
Wie zeichnet man ein gleichseitiges Dreieck, ein Quadrat, ein reguläres Vieleck? Immer wieder das gleiche – so oft wie die Zahl der Seiten: I I
I
Zeichne eine Seite. Drehe den Stift um den richtigen Winkel.
z. B. für ein Quadrat:
Smalltalk
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
Objekt-Modell Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen Private Variablen Nichtprivate Variablen Literale Zahlen
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 90◦
drehe den Stift um hebe den Stift wieder auf
Zeichen Zeichenketten Symbole Arrays Verzweigung Bedingungen Bedingte Anweisungen Übungen Existenztest Bedingte Wiederholung Anfangsbedingung Endbedingung Übungen Zählschleifen Intervalldurchlauf Übungen – Turtle-Grafik Kollektionen und Iteratoren
info10 – OOP
4.11 Zählschleifen – immer das gleiche
Markus Schlager
I 1 2 3 4 5 6 7 8 9 10 11 12
Umsetzung in Smalltalk (z. B. in einem workspace): | stift seite | Display restoreAfter: [ Display fillWhite. stift := Pen new. stift defaultNib: 5. stift color: 7. stift place: 250@300. stift north. stift down. seite := 100. 4 timesRepeat: [ stift go: seite. stift turn: 90.]. stift up.]
Zeichne ein Quadrat
Smalltalk Objekt-Modell
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
Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik Vergleiche Logik
drehe den Stift in die richtige Richtung
Priorität von Nachrichten
setze den Stift auf die Zeichenfläche wähle eine Seitenlänge
Variablen
wiederhole 4-mal gehe die Seitenlänge vor 90◦
drehe den Stift um 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
Sequenzen und Blöcke
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
4.11 Zählschleifen – immer das gleiche
info10 – OOP Markus Schlager
Zählschleifen in Smalltalk – timesRepeat:
Smalltalk Objekt-Modell
Integer
timesRepeat:
[Anweisungsblock]
Instanzen und Variablen new, new: und initialize Nachrichten Arithmetik
I
Integer»timesRepeat: aBlock ist eigentlich eine while-Schleife:
Vergleiche Logik Priorität von Nachrichten Sequenzen und Blöcke Variablen
Integer>>timesRepeat: aBlock "Evaluate the argument, aBlock, the number of times represented by the receiver." | count | count := 1. [count
steuert >
Taxi transportiert > 1 < bestellt
Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung
fährt_zu > 1
wartet_bei >
Projekt speichern
1 1
1
Ort
Inspektoren Nachrichten Datentypen
1
Konstruktor Überschreiben Protokolle
Taxileuchte Taxameter
1 benutzt > ∗
Tarif
Taxameter
5.1 Taxifahren Taxifahrer - schuhgröße - geld - taxi - steuere(taxi,ziel) - verändereGeld(betrag) + sageSchuhgröße() + fahre(passagier,start,ziel) + gibWechselgeld(betrag,bezahlt) Fahrgast
info10 – OOP
- tarif - tarifliste - betrag - istAn
Taxi Markus Schlager
+ gibTarif() + setzeTarif(tarif) + schalteTarifWeiter() + schalteEin() + schalteAus() + ermittleBetrag() - erhöheBetrag(betrag) + gibBetrag()
- nummer - km Pharo I Taxifahren - leuchte Pharo - taxameter Entwicklungsumgebung Weltmenü Benutzeridentifizierung + gibNummer() Werkzeuge + gibLeuchte() System-Browser + gibTaxameter() Projekt anlegen + gibKm() Projekt speichern Klasse anlegen - erhöheKm(betrag) Klassenkommentar + fahre() Accessoren Wertrückgabe Wertzuweisung
- startort - zielort - geld - istZufrieden + bestelle(taxifahrer) - verändereGeld(betrag) + gibStartort() + gibZielort() + bezahle(betrag) - wechsleZufriedenheit() - zahleTrinkgeld(betrag)
Methodenaufbau
Tarif
Taxileuchte
- tarifname - grundgebühr - km_Preis - min_Preis
- istAn
Inspektoren
+ gibIstAn() + schalteUm()
Datentypen
+ gibTarifname() + gibGrundgebühr() + gibKmPreis() + gibMinPreis()
Ort - name - position + gibName() + gibPosition()
Person
Instanzerzeugung
- name - ort
Nachrichten
Konstruktor Überschreiben + gibName() Protokolle + gibOrt()
5.2 Pharo
info10 – OOP Markus Schlager
. . . eine interaktive Entwicklungsumgebung zum Programmieren in Smalltalk
Pharo I Taxifahren Pharo Entwicklungsumgebung
Pharo http://www.pharo-project.org
Pharo-Buch als pdf in verschiedenen Sprachen
Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen
http://pharobyexample.org/
Pharo – the collaborActive book Online-Dokumentation
Klassenkommentar Accessoren Wertrückgabe Wertzuweisung
http://book.pharo-project.org/
Methodenaufbau Instanzerzeugung
Weitere Bücher (online) http://stephane.ducasse.free.fr/FreeBooks.html
Inspektoren Nachrichten Datentypen Konstruktor
Pharo-Videos http://www.pharo-project.org/documentation/ screencasts
Pharo-Mailingliste http://lists.gforge.inria.fr/cgi-bin/mailman/ listinfo/pharo-users
Überschreiben Protokolle
5.2.1 Pharo – Entwicklungsumgebung
info10 – OOP Markus Schlager Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben
I
I
I
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ü.
Protokolle
5.2.2 Pharo – Weltmenü
info10 – OOP Markus Schlager Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten
I I I
die wichtigsten Programmierwerkzeuge Hilfe und Systeminformationen Save speichert den aktuellen Zustand der gesamten Entwicklungsumgebung, das Pharo-Image I
I
alle geöffneten Fenster samt Inhalt, sei er gerade gespeichert oder auch nicht alle gerade existierenden Objekte in ihrem augenblicklichen Zustand
Datentypen Konstruktor Überschreiben Protokolle
5.2.3 Pharo – Benutzeridentifizierung
info10 – OOP Markus Schlager
I
Wann immer eine „Author identification“ verlangt wird, den eigenen Namen in der gewünschten Form eingeben:
Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau
I
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.
Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.2.4 Pharo – Werkzeuge
info10 – OOP Markus Schlager Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten
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
Datentypen Konstruktor Überschreiben Protokolle
5.2.5 Pharo – System-Browser
info10 – OOP Markus Schlager Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren
I I I
I
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.
Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.3 Projekt anlegen – Kategorien
info10 – OOP Markus Schlager
I
I
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
Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren
Namenskonvention für Kategorien
Nachrichten Datentypen Konstruktor
Initialen-Projektname-Teilkategorie z. B. MS-Taxi-Modell I
Initialen und Anfangsbuchstaben der Namensbestandteile groß
I
Bindestriche, keine Leerzeichen
Überschreiben Protokolle
5.3 Projekt anlegen – Kategorien
info10 – OOP Markus Schlager
I I
Ö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 Nachrichten Datentypen Konstruktor Überschreiben Protokolle
I
Die eigenen Kategorien erscheinen künftig am Anfang oder Ende der Liste.
5.4 Projekt speichern – Monticello-Pakete
info10 – OOP Markus Schlager
Damit die Änderungen gespeichert werden und erhalten bleiben, gibt es im wesentlichen zwei Möglichkeiten:
Pharo I Taxifahren Pharo
Weltmenü
I
I
Monticello
I
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.
Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.4 Projekt speichern – Monticello-Pakete
info10 – OOP Markus Schlager
I
Öffne einen Monticello-Browser.
Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser
I
Füge mit +Package ein neues Paket hinzu.
Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren
Name von Monticello-Paketen
Nachrichten Datentypen Konstruktor
I
I
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
Überschreiben Protokolle
5.4 Projekt speichern – Monticello-Pakete
info10 – OOP Markus Schlager
I
Wähle in der linken Spalte dein Projekt aus.
Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen
In der rechten Spalte erscheint als Standardspeicherort ein Unterverzeichnis deines Pharoverzeichnisses.
Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau
I
Füge mit +Repository einen neuen Speicherort hinzu – in der Regel ein Verzeichnis (directory).
Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.4 Projekt speichern – Monticello-Pakete
info10 – OOP Markus Schlager
I
Wähle in der linken Spalte dein Projekt und in der rechten Spalte den gewünschten Speicherort aus.
Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar
I
Wähle Save.
Accessoren Wertrückgabe
I
I
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.
Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.4 Projekt speichern – Monticello-Pakete
info10 – OOP Markus Schlager
I
Mit Browse kannst du nachsehen, was in dem Paket gespeichert wurde – im Moment noch nichts.
Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar
I
Spätestens jetzt solltest du aber auch das gesamte Image im Weltmenü speichern, um deinen momentanen Arbeitsstand festzuhalten.
Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.5 Anlegen einer Klasse
info10 – OOP Markus Schlager
Als einfachste Klasse im Taxi-Beispiel wird im folgenden die Klasse Taxileuchte implementiert.
Pharo I Taxifahren Pharo
I
Wähle im Systembrowser die Kategorie aus, zu der die neue Klasse gehören soll – hier deine Taxi-Modell-Kategorie:
Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben
I
Um Namenskonflikte mit bestehenden Klassen zu vermeiden, empfiehlt es sich, dem Klassennamen die eigenen Initialen voranzustellen (ohne Bindestrich), also z. B. MSTaxileuchte.
Protokolle
5.5 Anlegen einer Klasse
info10 – OOP Markus Schlager
Im Editor-Feld des Browsers siehst du eine Vorlage zum Anlegen einer neuen Klasse:
Pharo I Taxifahren Pharo
1 2 3 4 5
Object subclass: #NameOfSubclass instanceVariableNames: ’’ classVariableNames: ’’ poolDictionaries: ’’ category: ’MS-Taxi-Modell’
Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar
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
Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
info10 – OOP
5.5 Anlegen einer Klasse
Markus Schlager
Verändere die Vorlage wie folgt: Pharo I
1 2 3 4 5
Taxifahren
Object subclass: #MSTaxileuchte instanceVariableNames: ’istAn’ classVariableNames: ’’ poolDictionaries: ’’ category: ’MS-Taxi-Modell’
Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern
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.
Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
Rechtsklick und ‚Accept‘!
5.5 Anlegen einer Klasse
info10 – OOP Markus Schlager
Namenskonvention
Pharo I Taxifahren Pharo
I
Klassennamen beginnen mit Großbuchstaben.
I
Variablen- und Methodennamen beginnen klein.
I
Nur englisches Alphabet und Ziffern, keine Leerzeichen!
Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar
I
CamelCase bei Namen, die aus mehreren Teilwörtern bestehen, z.B. MannMitHut geheSpazieren.
Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.6 Klassenkommentar
info10 – OOP Markus Schlager
I
Zu gutem Programmierstil gehören Kommentare. In Smalltalk sind das I I
I
Im Klassenkommentar werden I I I
I
Kommentarzeilen im Quelltext von Methoden Klassenkommentare 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 Nachrichten Datentypen Konstruktor Überschreiben Protokolle
I
‚Accept‘ und zurück mit Klick auf ‚Instance‘.
5.7 Accessoren – Get- und Set-Methoden
info10 – OOP Markus Schlager
I I
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 Nachrichten Datentypen Konstruktor Überschreiben Protokolle
I
Rechtsklick auf der Klasse → ‚Refactor class‘ (oder ‚Refactor instance variable‘) → ‚Accessors‘
5.7 Accessoren – Get- und Set-Methoden
info10 – OOP Markus Schlager
‚Accept‘ im nachfolgenden Fenster (es zeigt die beiden Methoden) liefert dieses Ergebnis:
Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten
I
I
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
Datentypen Konstruktor Überschreiben Protokolle
5.7 Accessoren – Get- und Set-Methoden
info10 – OOP Markus Schlager
Vorsicht!
Pharo I Taxifahren
Achte darauf, ob die beiden Methoden auch wirklich den gleichen Namen wie die Instanzvariable haben! I
Heißt eine Variable z. B. name, so erzeugt Pharo eine Get-Methode namens name1.
Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen
I
Das liegt daran, dass es in der Oberklasse Object bereits eine Methode name gibt, die wegen der Vererbung auch eine Methode deiner Klasse ist.
Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung
Lösche in so einem Fall die beiden Zugriffsmethoden, benenne deine Instanzvariable um und erzeuge die Accessoren erneut.
Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.8 Wertrückgabe – Get-Methode
info10 – OOP Markus Schlager
Die Get-Methode gibt den Wert einer Instanzvariablen als Ergebnis zurück.
Pharo I Taxifahren Pharo
1 2
istAn ^ istAn
Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser
Zeile 1 – Methodenkopf der Name der Methode Zeile 2 – Wertrückgabe ˆ ist der Rückgabeoperator (oder Return-Operator) I Als Ergebnis der Methode wird der Wert des Ausdruckes hinter dem Rückgabeoperator zurückgegeben, hier also der Wert der Instanzvariablen istAn.
Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.9 Wertzuweisung – Set-Methode
info10 – OOP Markus Schlager
Die Set-Methode verändert den Wert einer Instanzvariablen.
Pharo I Taxifahren Pharo
1 2
istAn: anObject istAn := anObject
Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge
Zeile 1 – Methodenkopf der Name der Methode mit Angabe des Parameters anObject I 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 I Der Instanzvariablen istAn wird der Wert des Ausdruckes hinter dem Wertzuweisungsoperator zugewiesen, hier der Wert des Parameters anObject.
System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.10 Grundgerüst einer Methode
info10 – OOP Markus Schlager
Wenn du im Systembrowser in die Protokollspalte klickst, wird unten im Editorfeld das Grundgerüst einer Methode in Smalltalk angezeigt:
Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü
1 2 3 4 5
messageSelectorAndArgumentNames "comment stating purpose of message"
Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern
| temporary variable names | statements
Klasse anlegen Klassenkommentar Accessoren Wertrückgabe
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.
Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.11 Instanzerzeugung im Workspace
info10 – OOP Markus Schlager
Zeit, die neue Klasse erstmals auszuprobieren. I Speichere zunächst dein Monticello-Paket und auch das Pharo-Image. I Öffne einen Workspace.
Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge
Instanzerzeugung
System-Browser Projekt anlegen Projekt speichern Klasse anlegen
objektname := Klassenname new.
Klassenkommentar Accessoren Wertrückgabe
Der Objektname ist frei wählbar (ein Variablenname) und notwendig, um dem Objekt in der Folge Nachrichten schicken zu können.
Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor
I
Gib folgende Zeile mit deinem Klassennamen ein: testleuchte := MSTaxileuchte new.
I I I
Beachte den Punkt am Ende jeder Befehlszeile! Markiere die ganze Zeile → Rechtsklick → ‚Do it‘ In Klammern stehen Tastenkürzel – mit Alt/Cmd/Strg
Überschreiben Protokolle
5.12 Inspektoren – Objektüberwachung
info10 – OOP Markus Schlager
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. I Markiere im Workspace nur den Namen testleuchte. I Rechtsklick → ‚Inspect 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 Nachrichten Datentypen
Es öffnet sich ein Inspektor für das Objekt. I Links lassen sich Einträge zum Objekt selbst (self) oder seinen Instanzvariablen auswählen. I Rechts werden stets die entsprechenden aktuellen Werte angezeigt. I Im Feld unten kann man aus der Sicht dieses Objektes selbst Nachrichten senden.
Konstruktor Überschreiben Protokolle
5.12 Inspektoren – Objektüberwachung
info10 – OOP Markus Schlager Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe
I I
Wähle im Inspector links all inst vars aus. Trage unten folgende vier Zeilen ein.
Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten
1 2 3 4 I
I
istAn := false. self istAn: true. Transcript open. Transcript cr; show: self istAn.
Markiere nacheinander jeweils eine Zeile → Rechtsklick → ‚Do it‘ Beobachte das rechte Feld.
Datentypen Konstruktor Überschreiben Protokolle
5.12 Inspektoren – Objektüberwachung
info10 – OOP Markus Schlager
1 2 3 4
istAn := false. self istAn: true. Transcript open. Transcript cr; show: self istAn.
Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge
Zeile 1 Wertzuweisung an die private Instanzvariable Zeile 2 Aufruf der eigenen Set-Methode
System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar
self Schlüsselwort, wenn ein Objekt sich selbst referenziert.
Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren
Zeile 3 Nachricht an das global bekannte (großes T) Ausgabefenster Transcript, sich zu öffnen. Zeile 4 Zwei Nachrichten an das Transcript, getrennt durch einen Strichpunkt (Kaskadierung): Zeilenumbruch (cr) und Anzeige (show:) des Ergebnisses der eigenen Get-Methode der testleuchte
Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.13 Nachrichten – Methodenaufrufe
info10 – OOP Markus Schlager
Trage in einem Workspace folgende Zeilen ein und führe sie nacheinander aus (‚Do it‘):
Pharo I Taxifahren Pharo
1 2 3 4 5 6
testleuchte := MSTaxileuchte new. testleuchte inspect. testleuchte istAn. testleuchte istAn: true. testleuchte istAn: false; istAn. Transcript open; cr; show: testleuchte istAn.
Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe
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 Nachrichten (gehen vor) Zeile 4 Schlüsselwortnachricht mit dem Parameterwert true Zeile 5–6 Nachrichtenkaskadierungen (Strichpunkte) Zeile 3, 5 Willst du das Ergebnis der Get-Methoden sehen, wähle statt ‚Do it‘ ‚Print it‘.
Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.14 Wichtige Datentypen
info10 – OOP Markus Schlager
In Smalltalk kann eine Variable beliebige Werte annehmen. Probiere in einem Workspace folgendes aus:
Pharo I Taxifahren Pharo
1 2 3 4 5 6 7
testleuchte testleuchte testleuchte testleuchte testleuchte testleuchte testleuchte
istAn: istAn: istAn: istAn: istAn: istAn: istAn:
true. 5. 6.7. 2.5 @ 5.7. ’hallo’. $A. nil.
Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau
1 – Wahrheitswert (Boolean) 2 – ganze Zahl (Integer) 3 – Dezimalzahl (Float) 4 – Punktkoordinaten (Point) 5 – Zeichenkette (String)
true oder false 5 6.7 mit Dezimalpunkt x @ y ’Text’ in einfachen Anführungszeichen 6 – Schriftzeichen (Character) $A mit Dollarzeichen 7 – Nichts nil ist der Nullwert: Wert nicht vorhanden
Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.15 Konstruktor – initialize
info10 – OOP Markus Schlager
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?
Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen
I
I
Ö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:
Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen
new
Konstruktor
"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 I
Ein Objekt erhält als erstes die Nachricht initialize.
Überschreiben Protokolle
5.15 Konstruktor – initialize
info10 – OOP Markus Schlager
Konstruktor
Pharo I Taxifahren
initialize ist die Methode zur Initialisierung eines Objektes: I
Belegung der Instanzvariablen mit Startwerten
Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen
I
ggf. Aufruf von Methoden, die das Objekt von Anfang an ausführen soll
Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung
I
Wähle im Browser deine Klasse und klicke in der Protokollspalte auf -- all --.
Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.15 Konstruktor – initialize
info10 – OOP Markus Schlager
I
1 2 3 4 5
Ersetze die Methodenvorlage durch folgenden Quelltext und speichere mit ‚Accept‘:
Pharo I Taxifahren Pharo Entwicklungsumgebung
initialize "initialisiere den Zustand des Objektes"
Weltmenü Benutzeridentifizierung Werkzeuge System-Browser
super initialize. self istAn: false.
"Konstruktor der Oberklasse" "Leuchte aus"
Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe
super initialize
Wertzuweisung Methodenaufbau Instanzerzeugung
I
I
I
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.
Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.15 Konstruktor – initialize
info10 – OOP Markus Schlager Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar
I
I
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! I
I
I
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. . . ‘.
Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.16 Überschreiben vererbter Methoden
info10 – OOP Markus Schlager
Vererbung
Pharo I Taxifahren
Jede Unterklasse erbt sämtliche Methoden und Attribute ihrer Oberklassen.
Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge
I
I
I
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.
System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.16 Überschreiben vererbter Methoden
info10 – OOP Markus Schlager
Überschreiben einer Methode
Pharo I Taxifahren
Wenn in einer Unterklasse z. B. besagte Methode tuEtwas eigens neu definiert und implementiert wird, so wird die Methode der Oberklasse überschrieben.
Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern
I
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.
Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.16 Überschreiben vererbter Methoden
info10 – OOP Markus Schlager
Vorsicht
Pharo I Taxifahren
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. I
Solltest du die Methode nicht absichtlich überschrieben haben, benenne deine Methode um!
Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung
I
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.
Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
5.17 Protokolle – Methoden gruppieren
info10 – OOP Markus Schlager
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‘.
Pharo I Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen
automatisch
I
Rechtsklick auf Protokollspalte I I
I
‚Categorize automatically‘ klappt für Standardmethoden
Vor dem Erstellen einer neuen Methode das gewünschte Protokoll markieren
Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen
manuell
I
Rechtsklick auf Protokollspalte I I
I
‚Add category. . . ‘ Auswahl aus einer Liste oder Eingabe eines neuen Protokollnamens (klein!)
Methoden mit der Maus in das gewünschte Protokoll ziehen
Konstruktor Überschreiben Protokolle
5.17 Protokolle – Methoden gruppieren
info10 – OOP Markus Schlager
Die Taxileuchte benötigt noch eine Methode schalteUm. Pharo I
I
Zeichne ein Struktogramm der Methode
I
Lege bei der Taxileuchte ein Protokoll steuerung an.
I
Wähle das Protokoll aus, schreibe Kopf und Kommentar der Methode und speichere.
Taxifahren Pharo Entwicklungsumgebung Weltmenü Benutzeridentifizierung Werkzeuge System-Browser Projekt anlegen Projekt speichern Klasse anlegen Klassenkommentar Accessoren Wertrückgabe Wertzuweisung Methodenaufbau Instanzerzeugung Inspektoren Nachrichten Datentypen Konstruktor Überschreiben Protokolle
info10 – OOP Markus Schlager Pharo II Boolesche Werte Konstruktor II Listen Nachrichten
Teil VI
Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen
Smalltalk mit Pharo II
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
Überblick
info10 – OOP Markus Schlager
Grundkonzepte
Pharo II Boolesche Werte Konstruktor II
Ablaufmodelliierung
Listen Nachrichten Arithmetik Vergleiche
Smalltalk I – die Entwicklungsumgebung Squeak
Logik Priorität von Nachrichten Literale Zahlen
Smalltalk II – Grundzüge der Programmiersprache
Zeichen Zeichenketten Symbole
Pharo I – Smalltalk-Entwicklung mit Pharo
Arrays Typumwandlung isNil und ifNotNil: Morphic
Pharo II – Grundzüge von Smalltalk
Ein- und Ausgabefenster Schaltknöpfe Beschriftungen
Java I – Klassen in BlueJ anlegen
Behälter und Spielfelder Generalisierung Verzweigung Bedingungen
Java II – JGUIToolbox und weitere Konstrukte
Bedingte Anweisungen Stepping Schleifen
Zustandsmodellierung
Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen
Anhang
Bedingte Wiederholung
Gliederung
info10 – OOP Markus Schlager
Pharo II – Grundzüge von Smalltalk Boolesche Werte und Umschalten Konstruktoren mit Parametern Listen – OrderedCollection Nachrichten an Instanzen Priorität/Rangfolge von Nachrichten 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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
6.1 Boolesche Werte und Umschalten
info10 – OOP Markus Schlager
Boolesche Werte (Wahrheitswerte) eignen sich als Antworten auf Ja-Nein-Fragen: I Stimmt eine Aussage oder stimmt sie nicht? I Ja oder Nein? Wahr oder falsch?
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche
Boolesche Werte in Smalltalk
Logik Priorität von Nachrichten Literale
I
true oder false
Zahlen Zeichen Zeichenketten Symbole
Boolesche Werte lassen sich mit der Nachricht not negieren (verneinen, in ihr Gegenteil umkehren).
Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster
Negation in Smalltalk
Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung
I
true not ergibt false.
I
false not ergibt true.
Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf
Die Verneinungsnachricht not (nicht) lässt sich auch an Variablen wie istAn mit booleschem Wert senden.
Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.1 Boolesche Werte und Umschalten
info10 – OOP Markus Schlager
Umschalten mit Verzweigung
Pharo II Boolesche Werte
Leuchte istAn? WAHR schalte Leuchte aus
FALSCH schalte Leuchte an
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten
Umschalten als Negation die elegante Lösung
Literale Zahlen Zeichen
schalte Leuchte um Umsetzung durch Wertzuweisung an die Instanzvariable oder durch Verwendung der Accessoren
Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe
Negation in Smalltalk
Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen
I
istAn := istAn not.
Bedingte Anweisungen Stepping
I
self istAn: self istAn not.
Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.1 Boolesche Werte und Umschalten
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte
I
Schreibe Taxileuchte.schalteUm() bzw. Taxileuchte>>schalteUm in Pharo. I
I
Liefert diese Methode einen Rückgabewert?
Teste die Methode z. B. vom Workspace aus mit geöffnetem Inspektor: testleuchte schalteUm. I
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.
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
6.1 Boolesche Werte und Umschalten
info10 – OOP Markus Schlager
schalteUm "schaltet zwischen an und aus um"
Pharo II Boolesche Werte Konstruktor II Listen
self istAn: self istAn not.
Nachrichten Arithmetik Vergleiche Logik
Auftrag
Priorität von Nachrichten Literale Zahlen
I
Lege in deiner Taxi-Modell-Kategorie die Klasse MSTaxameter (mit deinen Initialen) an. I I
I
I
I
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!
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
6.1 Boolesche Werte und Umschalten
info10 – OOP Markus Schlager
Zur Kontrolle: Object subclass: #MSTaxameter instanceVariableNames: ’istAn betrag tarif tarifliste’ classVariableNames: ’’ poolDictionaries: ’’ category: ’MS-Taxi-Modell’
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik
initialize "initialisiere den Zustand des Objektes" super initialize. "Konstruktor der Oberklasse" self istAn: false. "Taxameter aus" self betrag: 0.00. "Startbetrag 0 Euro" self tarif: nil. "Noch gibt es keine Tarife"
Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil:
schalteEin "schaltet das Taxameter ein" self istAn: true
Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder
schalteAus "schaltet das Taxameter aus" self istAn: false
Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.2 Konstruktoren mit Parametern
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
Lege in deiner Taxi-Modell-Kategorie die Klasse MSTarif (mit deinen Initialen) an.
Listen Nachrichten Arithmetik Vergleiche
I I
Accessoren für die Instanzvariablen Konstruktor für einen Standardtarif mit sinnvollem Tarifnamen, Grundgebühr, Kilometer- und Minutenpreis
Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung
Object subclass: #MSTarif instanceVariableNames: ’grundgeb tarifname kmPreis minPreis’ classVariableNames: ’’ poolDictionaries: ’’ category: ’MS-Taxi-Modell’
isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung
initialize "Initialisierung eines Standardtarifs" super initialize. tarifname := ’Standardtarif’. grundgeb := 3.50. kmPreis := 1.40. minPreis := 0.35
Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.2 Konstruktoren mit Parametern
info10 – OOP Markus Schlager
I I
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?
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten
I
I I
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:
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 "Standardtarif" Intervalldurchlauf starif := MSTarif new. Blockvariablen "Wunschtarif" Iteration über Kollektionen wtarif := MSTarif new mitName: ’Nachttarif’ grundgeb: 4.20 kmPreis: 1.60 minPreis: 0.70. Bedingte Wiederholung
6.2 Konstruktoren mit Parametern
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
Programmiere im Protokoll initialize-release die fehlende Methode mitName: grundgeb: kmPreis: minPreis:. I
Wähle für die vier Parameter sinnvolle Namen!
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen
I
Erzeuge im Workspace verschiedene Standard- und Wunschtarife und untersuche sie im Inspektor!
Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil:
Morphic mitName: einName grundgeb: eineGrundgeb kmPreis: einKmPreis minPreis: einMinPreis Ein- und Ausgabefenster "Initialisierung eines Wunschtarifs" Schaltknöpfe "Benutzung: MSTarif new mitName: grundgeb: kmPreis: minPreis: " Beschriftungen Behälter und Spielfelder tarifname := einName . Generalisierung grundgeb := eineGrundgeb . Verzweigung kmPreis := einKmPreis . Bedingungen minPreis := einMinPreis . Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.3 Listen – OrderedCollection
info10 – OOP Markus Schlager
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:
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche
I
I
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.
Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster
Auftrag
Schaltknöpfe Beschriftungen Behälter und Spielfelder
I
Entwirf Struktogramme für diese beiden Methoden des Taxameters.
Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping
I
Welche Methoden muss die Tarifliste beherrschen, damit beides funktioniert?
Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.3 Listen – OrderedCollection
info10 – OOP Markus Schlager
Collections – Sammlungen
Pharo II Boolesche Werte
Zum Speichern einer Ansammlung von Objekten bietet Smalltalk die Klasse Collection mit einer großen Zahl von Unterklassen. Besonders wichtig:
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten
OrderedCollection durchnummerierte Liste Set Menge – keine Reihenfolge, keine Duplikate Bag keine Reihenfolge, aber Duplikate erlaubt – wie eine Urne in der Mathematik
Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic
Dictionary Schlüssel-Wert-Paare wie im Wörterbuch
Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung
Auftrag
Verzweigung Bedingungen Bedingte Anweisungen Stepping
I
I
Lies im Systembrowser die Klassenkommentare dieser Klassen. Durchstöbere ihre Methoden.
Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.3 Listen – OrderedCollection
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
Die Tarifliste soll eine neue Instanz der Klasse OrderedCollection werden. I
I
Passe den Konstuktor des Taxameters an.
Suche im Systembrowser in der Klasse OrderedCollection und ihren Oberklassen nach Methoden, um I I I
I
Objekte hinzuzufügen, die Länge (Größe) der Liste auszugeben, ein Listenelement mit einem bestimmten Index auszuwählen, den Index eines Listenelementes auszugeben.
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung
I
Ergänze den Konstruktor des Taxameters so, dass in der Tarifliste ein Standard- und drei Wunschtarife eingetragen werden.
Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.3 Listen – OrderedCollection
info10 – OOP Markus Schlager
OrderedCollection – wichtige Methoden
Pharo II Boolesche Werte
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
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays
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
Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung
removeAt: einIndex entfernt den Eintrag an der Stelle einIndex aus der Liste; das entsprechende Objekt selbst wird aber nicht vernichtet
Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf
removeAll entfernt alle Einträge aus der Liste
Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.3 Listen – OrderedCollection
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
I
Erzeuge eine neues Taxameter und untersuche es im Inspektor. Untersuche auch die Tarifliste und die darin enthaltenen Tarife. I
Rechtsklick auf die Namen der Instanzvariablen in der linken Inspektorspalte erlaubt z. B. Inspect.
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
6.3 Listen – OrderedCollection
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
Programmiere die beiden Methoden zur Tarifwahl und teste sie. I I
Beobachte die Veränderungen im Inspektor. Evtl. sind die beiden folgenden Abschnitte zu Nachrichten und deren Priorität hilfreich.
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
info10 – OOP
6.4 Nachrichten an Instanzen
Markus Schlager
I I
Instanzen können Nachrichten empfangen. Es gibt drei Arten von Nachrichten.
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik
Unäre Nachricht (ohne Argument)
Vergleiche Logik Priorität von Nachrichten
empfaenger methodenName.
Literale Zahlen Zeichen Zeichenketten
testLeuchte schalteUm. testBall := EllipseMorph new. testFeld := PasteUpMorph new. testBall openInHand. testBall delete. testFeld openInWorld. Time now. Date today. 5 squared.
41
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
41
Probiere die Anweisungen in einem Workspace aus! Die Bspe. zu Daten und Zahlen wertest du besser mit Alt-p aus (print it).
Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
info10 – OOP
6.4 Nachrichten an Instanzen
Markus Schlager
Schlüsselwortnachricht (mit Argument)
Pharo II Boolesche Werte
empfaenger mWort1: wert1 mWort2: wert2.
Konstruktor II Listen Nachrichten
42
testLeuchte istAn: false. testFeld extent: 300@200. testFeld openInWindowLabeled: ’Mein Feld’. testFeld color: Color blue. testBall openInWorld: testFeld. testBall position: 100@130. testFeld removeMorph: testBall. testFeld addMorph: testBall centeredNear: 50@30. 5 raisedTo: 3.
Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder
I I I 42
Beachte die Doppelpunkte! Methodennamen können aus beliebig vielen Teilwörtern bestehen. Am Ende jeder Nachricht steht ein Punkt.
Natürlich ist blue auch nur eine (unäre) Nachricht an eine Instanz der Klasse Color.
Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
info10 – OOP
6.4 Nachrichten an Instanzen
Markus Schlager Pharo II
Binäre Nachricht (zwei Objekte)
Boolesche Werte Konstruktor II Listen
empfaenger binäreNachricht parameterObjekt.
Nachrichten Arithmetik Vergleiche Logik
I
Binäre Nachrichten haben die Gestalt von arithmetischen Operatoren.
Arithmetik: + 15+4 15-4 15*4 15/4 15//4 15\\4
Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten
-
*
/
//
\\
43
"Addition" "Subtraktion" "Produkt" "Division" "Division (ganzzahlig)" "Divisionsrest"
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
43
Die Bspe. zu binären Nachrichten wertest du am besten mit Alt-p aus (print it)
Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.4 Nachrichten an Instanzen
info10 – OOP Markus Schlager
Vergleich: < >= = ~= == ~~ I Vergleichsoperatoren liefern als Ergebnisse die booleschen Werte true oder false. I Erzeugt im Workspace erst einmal zwei Variablen mit der gleichen Zeichenkette als Wert (Alt-d):
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen
a := ’Squeak’. b := ’Squeak’.
Zeichenketten Symbole Arrays Typumwandlung
Vergleich von Werten
isNil und ifNotNil: Morphic Ein- und Ausgabefenster
15 15 15 15 15 a a 15
< 4 "kleiner als" 4 "groesser als" >= 4 "groesser oder gleich" = 4 "gleich" = b = ’Scratch’ ~= 4 "nicht gleich"
Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
info10 – OOP
6.4 Nachrichten an Instanzen
Markus Schlager
Vergleich:
=
=
~=
==
~~
Pharo II Boolesche Werte
a := ’Squeak’. b := ’Squeak’.
Konstruktor II Listen Nachrichten Arithmetik Vergleiche
Vergleich von Identitäten
Logik Priorität von Nachrichten Literale
15 == 4 "identisch gleich " 15 == 15 " gleiches Objekt" ’Squeak’ == ’Squeak’ a == b "!!!" 15 ~~ 4 "nicht das gleiche Objekt" 15 ~~ 15 a ~~ b
Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung
I I
Überrascht? – Auch Variablen sind eigenständige Objekte! Zunächst wirst du aber vor allem den Vergleich von Werten benötigen.
Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.4 Nachrichten an Instanzen
info10 – OOP Markus Schlager
Logik: &
|
Pharo II Boolesche Werte
true true false false true true false false
& & & & | | | |
true false true false true false true false
"logisches Und (AND)"
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten
"logisches Oder (OR)"
Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung
I
Wie in der Mathematik üblich, ist ein Oder stets ein Oder auch.
Sonstiges: ,
isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen
@
->
44 45
Behälter und Spielfelder Generalisierung Verzweigung
’Haus’,’halt’ 100@200
"Konkatenation (Aneinanderhaengen)" Bedingungen Bedingte Anweisungen "Ein Punkt mit x- und y-Koordinate" Stepping Schleifen Zählschleifen Intervalldurchlauf
44
Erforscht diese Beispiele: Auswählen und Alt-i 45 -> Assoziation, vielleicht später . . .
Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.5 Priorität/Rangfolge von Nachrichten
info10 – OOP Markus Schlager
Priorität von Nachrichten I
Abarbeitung von links nach rechts, aber
I
Unär vor Binär vor Schlüsselwort
I
Änderung der Reihenfolge durch Klammern ()
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale
Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript Transcript
show: ’Haus’ , ’halt’. cr. "Neue Zeile im Transcript" show: 16 sqrt. show: 16 sqrt negated. show: 16 + 3. show: 16 + 3 squared. show: 16 + 3 * 2. "!" show: 16 + (3 * 2). show: 16 + 3 squared * 2. show: 4 raisedTo: 9. "!!!" show: (4 raisedTo: 9). show: (4 raisedTo: 9 - 7). show: (4 sqrt raisedTo: 9). show: (4 raisedTo: 9 sqrt).
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
6.6 Literale
info10 – OOP Markus Schlager Pharo II Boolesche Werte Konstruktor II Listen Nachrichten
I
I
Literale sind Objekte, auf die (auch ohne Referenzierung durch Variablen) durch einfaches „Hinschreiben“ Bezug genommen werden kann. Smalltalk kennt fünf Arten von Literalen: I I I I I
Zahl (Number) Zeichen (Character) Zeichenkette (String) Symbol Feld (Array)
Arithmetik Vergleiche Logik Priorität von Nachrichten 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
6.6.1 Literale – Zahlen
info10 – OOP Markus Schlager
I
In Smalltalk gibt es verschiedene Zahlenklassen: Integer Ganze Zahlen, z. B. 5 420 -1000 I
I
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.
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung
Übung
isNil und ifNotNil: Morphic Ein- und Ausgabefenster
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: ?
Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen
Fraction Rationale Zahlen, z. B. (1/3) (-8/5)
Bedingte Wiederholung
6.6.2 Literale – Zeichen
info10 – OOP Markus Schlager
I I I
I
46
Einzelzeichen gehören der Klasse Character an. Druckbare Einzelzeichen werden mit vorangestelltem Dollarzeichen dargestellt, z. B. $a, $R, $’, $3, $$. Für nichtdruckbare Zeichen stehen Nachrichten an die Klasse46 Character zur Verfügung, z. B. Leerzeichen Character space Tabulator Character tab Zeilenumbruch Character cr Rückwärtslöschen Character backspace Eurozeichen Character euro47 Besonders wichtig ist das Protokoll testing. Erkundet die Wirkung der zugehörigen Nachrichten in einem Workspace (Alt-p).
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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
info10 – OOP
6.6.3 Literale – Zeichenketten
Markus Schlager
I
Zeichenketten (Strings) werden in Smalltalk durch einfache Hochkommata begrenzt, z. B. I I I I
I
Soll der String ein Hochkomma (’) als Zeichen enthalten, muss dieses verdoppelt werden: I
I
Wie geht’s?
wird zu
’Wie geht’’s?’
Vorsicht, doppelte Hochkommata (") kennzeichnen in Smalltalk Kommentare: I
I
’Das ist ein String.’ ’Smalltalk rocks :-)’ ’1234567’ (Das ist keine Zahl!) ’u’ (Das ist etwas Anderes als $u!)
"Das ist ein Kommentar im Quelltext."
Strings beherrschen zahlreiche nützliche Methoden, die sie teilweise auch von der Oberklasse SequenceableCollection erben. I
I I
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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
6.6.4 Literale – Symbole
info10 – OOP Markus Schlager
I
I
Symbole sind besondere Zeichenketten, also eine Unterklasse von String. Symbole werden durch ein vorangestelltes Doppelkreuz (#) gekennzeichnet, z. B. I I I
#Symbol #Feb13 #’Ich bin ein Symbol!’
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten
I
I
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 Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung
I
Symbole werden z. B. als Namen von Klassen oder Methoden verwendet.
Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.6.5 Literale – Arrays
info10 – OOP Markus Schlager
I I
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. I I I
I I
I
#(123 124 125 126) #(’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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
6.7 Typumwandlung
info10 – OOP Markus Schlager
I
Öffne ein Transcript und probiere folgendes im Workspace:
Pharo II Boolesche Werte Konstruktor II Listen
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.
Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten
I
Der letzte Befehl liefert einen Fehler von wegen „indexable object“.
Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic
I I
Das Problem ist die Konkatenation mit dem Komma. Eine Zahl (die Grundgebühr) kann man nicht an eine Zeichenkette hängen.
Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung
I
Lösung: Wandle die Zahl in eine Zeichenkette um:
Bedingungen Bedingte Anweisungen Stepping
"Anzeige der Grundgebuehr mit Text davor" Schleifen Transcript cr; show: ’Grundgebuehr: ’, testtax tarif grundgeb asString. Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.7 Typumwandlung
info10 – OOP Markus Schlager
Typumwandlung
Pharo II Boolesche Werte
einObjekt asNeuerTyp
Konstruktor II Listen Nachrichten
I
Gibt es für viele Klassen und Typen. I I I
Öffne im Weltmenü unter Tools einen Finder. Gib im Suchfeld as ein. Wie viele Methodennamen beginnen mit as?
Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten
Umwandlung in eine Zeichenkette 42 asString
Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic
Umwandlung in eine Zahl ’2.50 Euro’ asNumber
Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung
Umwandlung in eine Dezimalzahl (5/4) asFloat
Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen
Umwandlung in eine geordnete Liste einzelner Zeichen ’Smalltalk’ asOrderedCollection
Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.8 isNil und ifNotNil: – Existiert ein Objekt?
info10 – OOP Markus Schlager
Die beiden Methoden zur Tarifwahl sehen etwa so aus: Pharo II
waehleTarif: eineNummer "waehlt einen Tarif aus der Tarifliste" self tarif: (self tarifliste at: eineNummer). "alternativ mit Wertzuweisung" "tarif := self tarifliste at: eineNummer."
Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten
I
tNummer und tRest sind temporäre Hilfvariablen, die nur innerhalb dieser Methode gültig sind.
Literale Zahlen Zeichen Zeichenketten Symbole
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.
Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen
I I
Was passiert, wenn gar kein Tarif eingestellt ist? Probiere es mit Workspace und Inspektor aus!
Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.8 isNil und ifNotNil: – Existiert ein Objekt?
info10 – OOP Markus Schlager
I
I
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.
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen
I
I I
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:.
Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung
I
I
I
Gib den Namen dieser Methode im Suchfeld eines Systembrowsers ein. Studiere die Implementierung in der Klasse SequenceableCollection.
Klar, warum der erste Tarif eingestellt wurde?
Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.8 isNil und ifNotNil: – Existiert ein Objekt?
info10 – OOP Markus Schlager
I
Vielleicht ist das genau das Verhalten, das du haben möchtest: I
I
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: I
Wenn kein Tarif eingestellt ist, soll auch keiner eingestellt bleiben.
I
Wie lässt sich das realisieren?
I
Zeichne ein Struktogramm!
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen
schalteTarifWeiter
Behälter und Spielfelder Generalisierung
kein Tarif eingestellt?
Verzweigung Bedingungen
WAHR
FALSCH
Bedingte Anweisungen Stepping
suche eingestellte Tarifnummer
Schleifen Zählschleifen
∅
berechne neue Tarifnummer stelle neuen Tarif ein
Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.8 isNil und ifNotNil: – Existiert ein Objekt?
info10 – OOP Markus Schlager
I I
In Smalltalk versteht jedes Objekt die beiden Nachrichten isNil und ifNotNil:. Gib die beiden Methodennamen im Suchfeld eines Systembrowsers ein und lies die beiden Implementierungen jeder dieser Methoden.
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale
isNil
Zahlen Zeichen Zeichenketten
einObjekt isNil.
Symbole Arrays Typumwandlung
gibt false zurück, falls das Objekt existiert, sonst true.
isNil und ifNotNil: Morphic Ein- und Ausgabefenster
I
Probiere die folgenden Zeilen (mit deinen Bezeichnungen) mit do it bzw. print it in einem Workspace aus:
Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen
testtax testtax testtax testtax
:= MSTaxameter new. isNil. tarif isNil. tarifliste isNil.
Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.8 isNil und ifNotNil: – Existiert ein Objekt?
info10 – OOP Markus Schlager
ifNotNil:
Pharo II Boolesche Werte Konstruktor II
einObjekt ifNotNil: [ Anweisungsblock ].
Listen Nachrichten Arithmetik Vergleiche
bewirkt, dass die Anweisungen innerhalb der eckigen Klammern nur dann ausgeführt werden, wenn einObjekt tatsächlich existiert.
Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole
I
Probiere die folgenden Zeilen (mit deinen Bezeichnungen) in einem Workspace aus:
Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster
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. ].
Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.8 isNil und ifNotNil: – Existiert ein Objekt?
info10 – OOP Markus Schlager
Die angepasste Methode schalteTarifWeiter sieht dann etwa so aus:
Pharo II Boolesche Werte Konstruktor II
Listen schalteTarifWeiter Nachrichten "wechselt zum naechsten Tarif aus der Liste, Arithmetik Vergleiche nach dem letzten Tarif wieder zum ersten" Logik Priorität von Nachrichten | tNummer tRest | Literale self tarif ifNotNil: [ Zahlen Zeichen "suche Nummer des eingestellten Tarifs" Zeichenketten tNummer := self tarifliste indexOf: self tarif. Symbole Arrays "Rest modulo der Listenlaenge ausrechnen" Typumwandlung isNil und ifNotNil: tRest := tNummer \\ self tarifliste size. Morphic "waehle Tarif mit der naechsten Nummer" Ein- und Ausgabefenster Schaltknöpfe self waehleTarif: tRest + 1. Beschriftungen ]. Behälter und Spielfelder Generalisierung Verzweigung
I
Beachte den Punkt nach der schließenden eckigen Klammer!
Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
info10 – OOP
6.9 Morphic
Markus Schlager
I
Oberklasse aller grafischen Objekte ist in Smalltalk die Klasse Morph. I
I
Suche diese Klasse im Systembrowser und lass dir mit der Hierarchie-Ansicht all ihre Unterklassen anzeigen.
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik
Nützliche Klassen:
Priorität von Nachrichten Literale
I I I I
LabelMorph SimpleButtonMorph PasteUpMorph StandardWindow
I I I I
EllipseMorph RectangleMorph PolygonMorph ImageMorph
Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic
I
Nützliche Methoden: I I I
I I I
openInWorld openInWorld: openInWindowLabeled:
Ein- und Ausgabefenster Schaltknöpfe
I I I
openInHand open delete
Lies die Klassenkommentare. Experimentiere im Workspace mit diesen Klassen. Halo durch Anklicken mit der mittleren Maustaste bei gedrückter Umschalttaste
Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.9.1 Morphic – Ein- und Ausgabefenster
info10 – OOP Markus Schlager
I
Probiere folgende drei Befehlszeilen im Workspace:
Pharo II Boolesche Werte
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’.].
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe
I
I
I
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.
Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.9.2 Morphic – Schaltknöpfe
info10 – OOP Markus Schlager
I
Probiere folgende zwei Befehlszeilen im Workspace:
Pharo II Boolesche Werte
testleuchte := MSTaxileuchte new. knopf := SimpleButtonMorph new target: testleuchte; actionSelector: #schalteUm; label: ’Leuchte umschalten’; useRoundedCorners; openInWorld.
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung
I
Öffne einen Inspektor für die Leuchte, lass dir die Werte der Instanzvariablen anzeigen und klicke auf den Knopf!
isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder
target Name des Objektes, das auf den Knopfdruck reagieren soll actionSelector Name der aufzurufenden Methode – beachte das Doppelkreuz! label Knopfbeschriftung
Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.9.3 Morphic – Beschriftungen
info10 – OOP Markus Schlager
I
Probiere folgende Zeilen im Workspace:
Pharo II Boolesche Werte
label := LabelMorph new. label openInWorld. "Zugriff auf die installierten Schriftarten:" label changeFont. "Waehle in dem Fenster update und speichere das Image."
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale
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’.
Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen
label disable. label enable.
Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.9.4 Morphic – Behälter und Spielfelder
info10 – OOP Markus Schlager
I
. . . 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: 300@200. "Objekte einfuegen" feld addMorph: ball. feld addMorphCentered: tor. feld addMorph: text centeredNear: 200@50. "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 Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
6.9 Morphic
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte
Mit den gezeigten Morph-Klassen lassen sich eine Taxileuchte oder ein Taxameter visualisieren.
Konstruktor II Listen Nachrichten Arithmetik Vergleiche
I
I
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. I
I
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.
Logik Priorität von Nachrichten 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
6.9 Morphic
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
Lege im Systembrowser eine neue Kategorie MS-Taxi-Ansicht an (mit deinen Initialen) und darin die beiden Klassen I I
MSTaxileuchtenAnzeige und MSTaxameterAnzeige.
I
Verfasse jeweils einen Klassenkommentar.
I
Übernimm die beiden Befehlsfolgen aus dem Workspace als (vorläufigen) Konstruktor (initialize-Methode) der jeweiligen Klasse.
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays
I
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.
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
6.9 Morphic
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
Prüfe dein Ergebnis im Workspace mit
Listen Nachrichten Arithmetik
lanzeige := MSTaxileuchtenAnzeige new. tanzeige := MSTaxameterAnzeige new.
Vergleiche Logik Priorität von Nachrichten 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
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
Was ist eine Anzeige? Pharo II
I
Was hat sie mit einem Gerät zu tun?
I
Was muss sie wissen/kennen, d. h. welche Attribute benötigt sie?
I
Welche Methoden muss sie beherrschen?
I
Aus welchen Bestandteilen setzt sie sich zusammen?
Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays
Auftrag
Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster
I
Zeichne ein UML-Diagramm und eine Klassenkarte.
Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
∗
Anzeige
1
beobachtet >
Gerät
geraet elemente
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche
aktualisiereDich()
Logik Priorität von Nachrichten Literale Zahlen
∗
∗
Anzeigefeld
Schaltknopf
Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil:
I
I
Gibt es hierfür bereits vorhandene Morph-Klassen? Anzeigefeld: LabelMorph Schaltknopf: SimpleButtonMorph Anzeige: PasteUpMorph passt als Rahmen, kennt auch seine Elemente (submorphs), kann aber weder ein Was tun? Gerät beobachten, noch sich entsprechend aktualisieren
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
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
I
Nutze die Morph-Klassen und mache die Anzeige zu einer Unterklasse von PasteUpMorph:
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten
PasteUpMorph
Arithmetik Vergleiche Logik
submorphs
Priorität von Nachrichten Literale Zahlen
openInWorld(eineWelt)
Zeichen Zeichenketten Symbole
TaxiAnzeige
∗
1
beobachtet >
Arrays
Gerät
geraet
Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe
TaxileuchtenAnzeige
aktualisiereDich()
Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung
TaxameterAnzeige
Bedingungen Bedingte Anweisungen Stepping
∗
∗
LabelMorph
SimpleButtonMorph
Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
I
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.
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole
I
Erzeuge die Accessoren.
I
Lege ein Protokoll anzeige und darin eine vorerst leere Methode aktualisiereDich an.
I
Arrays Typumwandlung
allgemeine48
MSTaxiAnzeige soll eine Oberklasse für alle möglichen Anzeigen in einem Taxi sein. Was kann/soll man da sinnvollerweise in den Konstruktor schreiben?
isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf
48
Man nennt so etwas auch eine abstrakte Klasse, weil es nur von Unterklassen wirklich Instanzen gibt.
Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
I
Klassendefinition von MSTaxiAnzeige:
Pharo II Boolesche Werte
PasteUpMorph subclass: #MSTaxiAnzeige instanceVariableNames: ’geraet’ classVariableNames: ’’ poolDictionaries: ’’ category: ’MS-Taxi-Ansicht’
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen
I
Minimaler Konstruktor – Initialisierung der Instanzvariablen:
Zeichen Zeichenketten Symbole Arrays Typumwandlung
isNil und ifNotNil: initialize Morphic "Initialisierung einer neuen Instanz" Ein- und Ausgabefenster Schaltknöpfe super initialize. Beschriftungen "zu beobachtendes MSTaxiGeraet, zunaechst leer" Behälter und Spielfelder Generalisierung geraet := nil. Verzweigung Bedingungen
I
Der Konstruktor könnte auch noch Standardwerte etwa für Abmessungen und Hintergrundfarbe einer typischen Anzeige vorgeben.
Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
Setzen von Standardwerten
Pharo II Boolesche Werte Konstruktor II
I
Wie wird das z. B. in Morph»initialize gemacht?
I
Studiere auch den Quelltext der darin aufgerufenen Methoden!
I
Welche Standardfarbe hat ein Morph und welche Standardabmessungen?
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung
I
I
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:
isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen
testfeld := PasteUpMorph new openInWorld. "testfeld wieder loeschen" testfeld delete.
Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen
I
Warum ist das so?
Iteration über Kollektionen Bedingte Wiederholung
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
Überschreiben von Methoden
Pharo II Boolesche Werte
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.
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole
I
Beim Erzeugen eines PasteUpMorph wird in PasteUpMorph»initialize mit
Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster
super initialize.
Schaltknöpfe Beschriftungen
I
letztlich der Konstruktor Morph»initialize der Oberklasse Morph aufgerufen. In Morph»initialize steht
Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen
color := self defaultColor.
Zählschleifen Intervalldurchlauf Blockvariablen
I
self ist das Objekt, das gerade erzeugt wird.
Iteration über Kollektionen Bedingte Wiederholung
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
I
In der Klasse Morph:
Pharo II Boolesche Werte
defaultColor "answer the default color/fill style for the receiver" ^ Color blue
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale
I
In der Klasse PasteUpMorph: defaultColor "answer the default color/fill style for the receiver" ^ Color r: 0.8 g: 1.0 b: 0.6
Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe
I
Da ein PasteUpMorph erzeugt wird, erhält es letztere Farbe statt Blau.
Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
I
Ü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
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung
testanzeige := MSTaxiAnzeige new openInWorld.
isNil und ifNotNil: Morphic Ein- und Ausgabefenster
I
Definiere eine Methode sfarbe, die eine Standard-Schriftfarbe deiner Wahl für Anzeigen bereitstellt.
Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen
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.
Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
I
I
Alle Unterklassen von MSTaxiAnzeige haben nun erst einmal diese defaultBounds als Abmessungen und defaultColor als Hintergrundfarbe. Außerdem können sie mit Befehlen wie
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale
schriftzug color: self sfarbe.
Zahlen Zeichen Zeichenketten
auf die von dir gewählte Schriftfarbe zugreifen. I
Bei Bedarf aber kannst du die Methoden für die Standardfarben und -maße in Unterklassen auch erneut überschreiben.
Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder
I
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.
Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
I
Mache die Klassen MSTaxileuchtenAnzeige und MSTaxameterAnzeige zu Unterklassen von MSTaxiAnzeige. Überschreibe die Methoden defaultBounds, defaultColor und sfarbe jeweils geeignet.
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole
I
Passe die Konstruktoren der beiden Klassen an die neue Situation an. Beachte insbesondere, dass die Anzeigen nun selbst auch Unterklassen von PasteUpMorph sind!
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
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
I
MSTaxileuchtenAnzeige
Pharo II Boolesche Werte
MSTaxiAnzeige subclass: #MSTaxileuchtenAnzeige instanceVariableNames: ’label’ classVariableNames: ’’ poolDictionaries: ’’ category: ’MS-Taxi-Ansicht’
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen
I
Standardwerte
Zeichen Zeichenketten Symbole
defaultBounds ^ 0 @ 0 corner: 170 @ 80
Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster
defaultColor "Hintergrundfarbe" ^ Color black.
Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen
sfarbe "Farbe des Schriftzugs" ^ Color yellow.
Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
I
Konstruktor 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.
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen
Auftrag
Bedingte Anweisungen Stepping Schleifen
Wie muss der Quelltext der Methode MSTaxileuchtenAnzeige»schriftzug lauten?
Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
I
Erzeuge im Workspace eine Taxileuchtenanzeige und teste sie:
Pharo II Boolesche Werte Konstruktor II Listen
testanzeige := MSTaxileuchtenAnzeige new. testanzeige openInWorld. testanzeige aktualisiereDich.
Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale
I I
Was passiert? Vermutlich gar nichts – weder eine Veränderung der Anzeige, noch eine Fehlermeldung. I
I
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.
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
I
Stellt das ein Problem dar?
Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
Problem
Pharo II Boolesche Werte
I
Was bei aktualisiereDich passieren soll, hängt vom jeweiligen Gerät ab. I
I
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. I
I
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.
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
6.10 Generalisierung und Spezialisierung
info10 – OOP Markus Schlager
Lösung: abstrakte Methoden
Pharo II Boolesche Werte Konstruktor II
I
MSTaxiAnzeige»aktualisiereDich muss so aussehen: aktualisiereDich "Aktualisierung der Anzeige - abstrakt" self subclassResponsibility.
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung
I
I
Teste die Aktualisierung nochmals mit testanzeige. Du solltest nun diese Meldung erhalten:
isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen
I
I
Es wurde die von MSTaxiAnzeige geerbte Methode aktualisiereDich ausgeführt. Diese muss überschrieben werden.
Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.11 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I
Unter einer Verzweigung oder bedingten Anweisung versteht man ein Konstrukt der Form
Pharo II Boolesche Werte Konstruktor II Listen
einseitige Verzweigung
Nachrichten Arithmetik Vergleiche Logik
wenn Bedingung, dann Aktion
Priorität von Nachrichten Literale Zahlen Zeichen
oder
Zeichenketten Symbole Arrays
zweiseitige Verzweigung
Typumwandlung isNil und ifNotNil: Morphic
wenn Bedingung, dann Aktion, sonst Alternative
Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung
I
Flussdiagramm WAHR Bedingung
I FALSCH
Struktogramm
Verzweigung Bedingungen
Bedingung WAHR FALSCH
Bedingte Anweisungen Stepping Schleifen Zählschleifen
Aktion
Alternative
Aktion
Alternative
Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.11 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
I I
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: I
Die Zahl x liegt zwischen 5 und 13. (5 50) ifTrue: [Transcript show: x asString ifFalse: [Transcript show: x asString
Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen
cr; , ’: gewonnen!’.] cr; , ’: leider verloren’.].
Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen
52
Öffne ein Transcript und probiere es in einem Workspace aus!
Bedingte Wiederholung
6.11 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
Implementiere MSTaxileuchtenAnzeige»aktualisiereDich gemäß folgendem Struktogramm:
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale
aktualisiereDich
Zahlen Zeichen
geraet existiert? WAHR geraet ist an? WAHR FALSCH aktiviere label deaktiviere label
Zeichenketten Symbole
FALSCH
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
6.11 Verzweigung – bedingte Anweisungen
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
I
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.
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung
I
Lass dann vom Workspace aus im Wechsel die Leuchte umschalten und die Anzeige sich aktualisieren. Passt alles, wie gewünscht?
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
6.12 Stepping – periodische Aktivitäten
info10 – OOP Markus Schlager
I
MSTaxileuchtenAnzeige»aktualisiereDich kann z. B. so aussehen:
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten
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.]. ].
Arithmetik Vergleiche Logik Priorität von Nachrichten 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
6.12 Stepping – periodische Aktivitäten
info10 – OOP Markus Schlager
I
I
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:
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen
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
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
6.12 Stepping – periodische Aktivitäten
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
I
I
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.
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
6.12 Stepping – periodische Aktivitäten
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
Schicke deiner Taxileuchte vom Workspace aus oder auch mit einem SimpleButtonMorph die Nachricht schalteUm.
I
Beobachte die TaxileuchtenAnzeige.
I
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.
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
6.12 Stepping – periodische Aktivitäten
info10 – OOP Markus Schlager
Die beiden Methoden der Klasse MSTaxiAnzeige sollten folgendermaßen aussehen:
Pharo II Boolesche Werte Konstruktor II
step Protokoll stepping
Listen Nachrichten Arithmetik Vergleiche
1 2 3 4
step "periodische zu wiederholende Aktivitaeten" "automatische Aktualisierung" self aktualisiereDich.
Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays
stepTime Protokoll testing
Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster
1 2 3 4
stepTime "Zeitdauer in Millisekunden fuer automatische Wiederholung" ^ 100.
Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
I
Bei der TaxameterAnzeige gibt es im Unterschied zur TaxileuchtenAnzeige mehrere Labels, die aktuell zu halten sind.
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays
I
Elegant lässt sich so etwas mit einer Wiederholung (Schleife) lösen:
Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe
geraet ist an? WAHR für alle label aktiviere label
FALSCH für alle label deaktiviere label
Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf
I
Welche Schleifenkonstrukte gibt es in Smalltalk?
Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
I
Probiere die folgenden Beispiele im Workspace aus!
I
Beachte beim Ausführen (Do it), dass du stets alle Zeilen auf einmal markierst, die zu einer Schleife gehören.
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik
I
1 2 3 4
Fünfmal dasselbe: Transcript open. 5 timesRepeat: [ Transcript show: ’Smalltalk rules!’ ;cr. ].
Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic
I
1 2 3 4
Für fünf Zahlen das Gleiche: Transcript clear. 1 to: 5 do: [ :zahl | Transcript show: ’Zahl ’, zahl asString ;cr. ].
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
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
I
1 2 3 4 5
Für hundert Zahlen etwas mehr:
Pharo II Boolesche Werte
Transcript clear. 1 to: 100 do: [ :zahl | Transcript show: zahl squared. Transcript show: Character tab. ].
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen
I
1 2 3 4 5 6 7
Um welche Zahlen geht es hier? Transcript clear. 90 to: 100 by: 3 do: [ :zahl | Transcript show: zahl asString , ’ zum Quadrat ist ’, zahl squared asString. Transcript cr. ].
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
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
I
1 2 3 4 5 6 7 8 9
Eine lokale Hilfsvariable (Zeile 4) im Schleifenblock: liste := OrderedCollection new.
Pharo II Boolesche Werte Konstruktor II Listen
1 to: 100 do: [ :zahl | |ellipse| ellipse := EllipseMorph new. ellipse position: zahl@(0.05 * zahl squared). ellipse openInWorld. liste add: ellipse. ].
Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung
I
Die Hilfsvariable ist nur innerhalb des Blocks gültig:
isNil und ifNotNil: Morphic Ein- und Ausgabefenster
1 2 3 4 5 6 7 8
var := ’nix’. Transcript show: var; cr. 5 to: 7 do: [ :zahl | |var| var := zahl. Transcript show: var; cr. ]. Transcript show: var; cr.
Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
I
1 2 3 4
Iteration über eine Liste:
Pharo II Boolesche Werte
Transcript clear. liste do: [ :figur | Transcript show: figur position; cr. ].
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten
I
Klar, was hier passieren wird?
Literale Zahlen Zeichen
1 2 3
liste do: [ :figur | figur position: figur position * (5@1). ].
Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic
I
1 2 3 4 5 6
Objekte wieder verstecken oder vergessen: "Entfernen der Ellipsen vom Bildschirm" liste do: [ :element | element delete.]. "Leeren der Liste -- die Objekte selbst werden nicht geloescht, koennen danach aber nicht mehr ueber die Liste angesprochen werden!" liste removeAll.
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
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
I
1 2 3 4 5 6 7
Falls du deine Ellipsen nicht mehr ansprechen kannst:
Pharo II Boolesche Werte Konstruktor II
"Liste aller Objekte in der Welt" World submorphs do: [ :ding | "gehoert ding zur Klasse EllipseMorph?" (ding isKindOf: EllipseMorph) ifTrue: [ ding delete. ]. ].
Listen
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
Typumwandlung
Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays
I
I
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
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
I
1 2 3 4 5 6 7 8 9 I
Wiederholung, solange: ball := EllipseMorph new. ball openInWorld. "[]fork. sorgt dafuer, dass du auch etwas siehst" [ [ball position x < (World right - ball width).] whileTrue: [ ball position: ball position + (2@1). (Delay forSeconds: 0.01) wait.]. ] fork.
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung
Wiederholung, bis:
isNil und ifNotNil: Morphic Ein- und Ausgabefenster
1 2 3 4 5 6 7 8
[ [ball position x < 1.] whileFalse: [ ball position: ball position / 1.5. (Delay forSeconds: 0.2) wait.]. ] fork.
Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen
ball position: 0@0. ball delete.
Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
Zählschleife
Pharo II Boolesche Werte Konstruktor II Listen
zahl timesRepeat: [ Anweisungsblock ].
Nachrichten Arithmetik Vergleiche Logik
I
I
Der Anweisungsblock wird zahl-mal identisch wiederholt. Beachte den Punkt nach dem Anweisungsblock.
Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic
I
1 2 3 4
Fünfmal dasselbe: Transcript open. 5 timesRepeat: [ Transcript show: ’Smalltalk rules!’ ;cr. ].
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
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
Intervalldurchlauf
Pharo II Boolesche Werte
startzahl to: endzahl do: [ :zahl | Anweisungen mit zahl ].
Konstruktor II Listen Nachrichten Arithmetik
startzahl to: endzahl by: schritt do: [ :zahl | Anweisungen mit zahl ].
Vergleiche Logik Priorität von Nachrichten Literale Zahlen
2 to: 10 ist die Folge aller ganzen Zahlen von 2 bis 10, also 2, 3, 4, 5, 6, 7, 8, 9, 10.
Zeichen Zeichenketten Symbole Arrays Typumwandlung
2 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.
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
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
I
1 2 3 4 5 6 7
Für jede dritte Zahl von 90 bis 100 das Gleiche: Transcript clear. 90 to: 100 by: 3 do: [ :zahl | Transcript show: zahl asString , ’ zum Quadrat ist ’, zahl squared asString. Transcript cr. ].
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole
Blockvariablen
Arrays Typumwandlung isNil und ifNotNil:
[ :bVar1 :bVar2 | Anweisungen mit bVar1 und bVar2 ].
Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen
I
Blockvariablen werden im Anweisungsblock mit vorangestelltem Doppelpunkt vor einem senkrechten Trennstrich deklariert.
Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen
I
Sie sind nur innerhalb dieses Anweisungsblocks gültig.
Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
I
1 2 3 4 5 6 7 8 9
Neben Blockvariablen kann ein Anweisungsblock auch temporäre Hilfsvariablen beinhalten, um vorübergehend Objekte ansprechen oder Zwischenergebnisse speichern zu können: liste := OrderedCollection new.
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen
1 to: 100 do: [ :zahl | |ellipse| ellipse := EllipseMorph new. ellipse position: zahl@(0.05 * zahl squared). ellipse openInWorld. liste add: ellipse. ].
Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung
Blockvariablen erhalten ihre Werte von außerhalb des Blocks, etwa durch einen Iterator wie do:. Hilfsvariablen erhalten ihre Werte aus einer Wertzuweisung.
Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
Iteratoren zu Kollektionen
Pharo II Boolesche Werte
eineKollektion do: [ :element | Anweisungen mit element ].
Konstruktor II Listen Nachrichten Arithmetik Vergleiche
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.
Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe
Weitere nützliche Iteratoren sind collect:, select:, reject: und detect:. Lies ggf. den Kommentar in der jeweiligen Methode der Klasse Collection.
Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager Pharo II
1 2 3
liste do: [ :figur | figur position: figur position * (5@1). ].
Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche
I I
Kollektionen sind ein äußerst mächtiges programmiersprachliches Konzept. Smalltalk kennt eine ganze Reihe von Kollektionen, die alle Unterklassen der abstrakten Klasse Collection sind:
Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic
Collection
Ein- und Ausgabefenster Schaltknöpfe Beschriftungen
SequenceableCollection
Bag
Set
Behälter und Spielfelder Generalisierung Verzweigung
ArrayedCollection
Interval
LinkedList
OrderedCollection
Dictionary
Bedingungen Bedingte Anweisungen Stepping Schleifen
Array
Bitmap
String
Text
SortedCollection
Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen
Symbol
Bedingte Wiederholung
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte
Schreibe für die Klasse MSTaxameterAnzeige den Konstruktor initialize neu.
Konstruktor II Listen Nachrichten Arithmetik Vergleiche
I
I
I
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.
Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder
I
I
Füge alle Labels in die Labelliste und alle Schaltknöpfe in die Knopfliste ein.
Generalisierung
Nutze die Labelliste und einen Iterator, um z. B. für alle Labels eine einheitliche Schriftart und -farbe zu setzen.
Stepping
Verzweigung Bedingungen Bedingte Anweisungen
Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
MSTaxileuchtenAnzeige»initialize kann so aussehen: Überschreibe für Größe und Farbe defaultBounds und defaultColor geeignet! initialize "Initialisierung einer TaxameterAnzeige ohne Taxameter" | label anKnopf ausKnopf tarifKnopf | super initialize. "vorerst kein Taxameter" geraet := nil. "Anzeigefelder mit Startbeschriftungen" labelliste := OrderedCollection new. #( ’Preis: 0.00’ ’Tarif: kein Tarif’ ’GdGeb: kein Tarif’ ’kmPr : kein Tarif’ ’minPr: kein Tarif’ ) do: [ :text | label := LabelMorph new contents: text. labelliste add: label. ]. "Einen Ueberblick ueber die Schriften bietet StringMorph new changeFont. Dort update." labelliste do: [ :element | element font: (LogicalFont familyName: ’Courier New’ pointSize: 24); color: self sfarbe. "labels einfuegen und sperren" self addMorph: element . element lock. ]. "labels untereinander anordnen" 1 to: labelliste size do: [ :i | label := labelliste at: i. label position: 10 @ (-20 + (i*30)). ]. "Schaltknoepfe" anKnopf := SimpleButtonMorph new target: self geraet; actionSelector: #schalteEin; label: ’an’; useRoundedCorners; position: 10@180. ausKnopf := SimpleButtonMorph new target: self geraet; actionSelector: #schalteAus; label: ’aus’; useRoundedCorners; position: 50@180. tarifKnopf := SimpleButtonMorph new target: self geraet; actionSelector: #schalteTarifWeiter; label: ’Tarifwahl’; useRoundedCorners; position: 100@180. knopfliste := OrderedCollection new. knopfliste add: anKnopf; add: ausKnopf; add: tarifKnopf. knopfliste do: [ :knopf | self addMorph: knopf.].
Zeile 9–12 Iteration über ein Array verschiedener Zeichenketten
Zeile 14–20 Iteration über die labelliste
Zeile 22–25 Intervalldurchlauf über die Indizes der labelliste Zeile 49 Iteration über die
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte
I
Schreibe für die Klasse MSTaxameterAnzeige eine Methode aktualisiereDich. Lege dazu auch ein Protokoll anzeige an. I
I
I
I
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.
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
I
Nichts passiert oder Fehlermeldungen? Hat deine Anzeige ein Gerät? Falls ja, lies weiter!
Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
I I
I
I 1 2 3 4 5 6 7 8 9
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: geraet: anObject geraet := anObject. "ergaenzt, falls MSTaxameter>>waehleTarif bei leerem Tarif nichts tut" (geraet isKindOf: MSTaxameter) ifTrue: [ geraet waehleTarif: 1.]. "ergaenzt, damit die Schaltknoepfe das neue Taxameter steuern" knopfliste do: [ :knopf | knopf target: geraet.].
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
info10 – OOP
6.13 Schleifen, Wiederholungen, Iteratoren
Markus Schlager
Bedingte Wiederholung – While-Schleife
Pharo II Boolesche Werte Konstruktor II
Wiederholung, solange etwas zutrifft [Bedingung] whileTrue: [Anweisungsblock].
Listen Nachrichten Arithmetik Vergleiche Logik
Wiederholung, bis etwas zutrifft [Bedingung] whileFalse: [Anweisungsblock].
Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole
I
I
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.
Arrays Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen
I
Hoch- und Herunterzählen, Startwert 1:
Stepping Schleifen Zählschleifen
1 2 3
zahl := 1. [zahl < 10 ] whileTrue: [ zahl := zahl + 1. ]. [zahl < 1 ] whileFalse: [ zahl := zahl - 1. ].
Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
Tricks für Animationen
Pharo II Boolesche Werte
Einen Moment warten – Delay (Delay forSeconds: eineDezimalzahl) wait.
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik
I I
eineDezimalzahl ist die Wartezeit in Sekunden kann an jeder Stelle in einer Methode stehen
Mehreres gleichzeitig – fork
Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays
[ Anweisungsblock ] fork. I
I
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.
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
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte Konstruktor II
I
I
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.
Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole
I
I
Außerdem braucht es eine boolesche Instanzvariable unterwegs. Lege ein Protokoll steuerung und darin eine Methoden fahreZu: neuePosition an.
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
6.13 Schleifen, Wiederholungen, Iteratoren
info10 – OOP Markus Schlager
Auftrag
Pharo II Boolesche Werte
I
In der Methode fahreZu: neuePosition soll folgendes passieren: I I I
Prüfe, ob du unterwegs bist. Falls nein, setze unterwegs auf true und fahre los: Setze v auf (neuePosition - position) normalized
Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale Zahlen Zeichen Zeichenketten Symbole Arrays
I
(Lies den Quelltext von Point»normalized!). Ändere die Position des Taxis so lange um v, bis der Abstand
Typumwandlung isNil und ifNotNil: Morphic Ein- und Ausgabefenster Schaltknöpfe Beschriftungen
position dist: neuePosition I I
I
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.
Behälter und Spielfelder Generalisierung Verzweigung Bedingungen Bedingte Anweisungen Stepping Schleifen Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.14 Plan I
info10 – OOP Markus Schlager
I
I
in Konstruktor des Taxameters einfach tarif := Tarif new. und sehen, was beim Speichern passiert. OrderedCollection für die Tarifliste -> add: at: indexOf: size
Pharo II Boolesche Werte Konstruktor II Listen Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten Literale
I
I
Klammern zur Gliederung der Reihenfolge beim add:-Befehlen im Taxameter-Konstruktor Klassenhierarchie für Anzeigen I
I I
MSTaxameterAnzeige mit mehreren Labels und SimplebuttonMorphs für Tarifweiterschalten sowie An/Aus Konstruktor mit temporärer Hilfsvariable? MSTaxameterAnzeige führt zu
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 self submorphs do: [:subm | (subm isKindOf: #LabelMorph) Schleifen
I I
Iteratoren und Schleifen Schleifenunterbrechung
Zählschleifen Intervalldurchlauf Blockvariablen Iteration über Kollektionen Bedingte Wiederholung
6.14 Plan II I
Animationen I I
[]fork. -> threads (Delay forSeconds: aNum) wait.
info10 – OOP Markus Schlager Pharo II Boolesche Werte Konstruktor II Listen
I
TransformationMorph, addFlexShell, removeFlexShell
Nachrichten Arithmetik Vergleiche Logik Priorität von Nachrichten 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
info10 – OOP Markus Schlager Java I Taxifahren BlueJ Klassen anlegen Projektkommentar
Teil VII
Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte
Java I
Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand
Überblick
info10 – OOP Markus Schlager
Grundkonzepte
Java I Taxifahren BlueJ
Ablaufmodelliierung
Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen
Smalltalk I – die Entwicklungsumgebung Squeak
Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte
Smalltalk II – Grundzüge der Programmiersprache
Konstruktor I Variablen Datentypen
Pharo I – Smalltalk-Entwicklung mit Pharo
Sichtbarkeit Accessoren Parameterwerte Boolesche Werte
Pharo II – Grundzüge von Smalltalk
Konstruktor II Überladen this
Java I – Klassen in BlueJ anlegen Java II – JGUIToolbox und weitere Konstrukte Zustandsmodellierung Anhang
Zwischenstand
Gliederung
info10 – OOP Markus Schlager
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
7.1 Taxifahren
info10 – OOP Markus Schlager
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.
Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern
I
Entwirf ein UML-Klassendiagramm zum Taxifahren. I I
I
I
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. I I
Beachte die Datenkapselung (Abschnitt 12). Vergiss die Schuhgröße nicht.
Zum Vergleich findest du auf den beiden folgenden Seiten eine mögliche Lösung. I
Ergänze dein Modell ggf. entsprechend.
Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand
info10 – OOP
7.1 Taxifahren
Markus Schlager
Person Java I Taxifahren BlueJ Klassen anlegen Projektkommentar
1
Klassenbeziehungen
Fahrgast
Taxifahrer
Instanzen erzeugen Instanzen untersuchen Quelltext verändern
will_zu >
steuert >
Taxi transportiert > 1 < bestellt
Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte
fährt_zu > 1
wartet_bei >
Klassengrundgerüst
1 1
1
Ort
Taxileuchte Taxameter
1 benutzt > ∗
Tarif
Boolesche Werte Konstruktor II Überladen
1
this Zwischenstand
7.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) Taxileuchte
Taxi - nummer - km - leuchte - taxameter + gibNummer() + gibLeuchte() + gibTaxameter() + gibKm() - erhöheKm(betrag) + fahre()
- istAn + gibIstAn() + wechsleZustand() Tarif - grundgebühr - km_Preis - min_Preis + gibGrundgebühr() + gibKmPreis() + gibMinPreis()
info10 – OOP
Person Markus Schlager - name - ort Java I Taxifahren BlueJ + gibName() Klassen anlegen + gibOrt()Projektkommentar Klassenbeziehungen
Ort
Instanzen erzeugen Instanzen untersuchen Quelltext verändern
- nameKlassengrundgerüst Taxileuchte - position Konstruktor I Variablen + gibName() Datentypen + gibPosition() Sichtbarkeit Accessoren Parameterwerte
Taxameter Boolesche Werte Konstruktor II
- tarif Überladen this - betrag - istAnZwischenstand + gibTarif() + setzeTarif(tarif) + wechsleZustand() + ermittleBetrag() - erhöheBetrag(betrag) + gibBetrag()
7.2 BlueJ
info10 – OOP Markus Schlager
. . . eine interaktive Entwicklungsumgebung zum Erlernen von Java
Java I Taxifahren BlueJ Klassen anlegen Projektkommentar
BlueJ http://www.bluej.org
BlueJ-Anleitung in verschiedenen Sprachen http://www.bluej.org/doc/tutorial.html
Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen
Java-Kurs http://docs.oracle.com/javase/tutorial/java
Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand
info10 – OOP
7.2.1 BlueJ – Klassen anlegen
Markus Schlager
Klassennamen
Java I Taxifahren BlueJ
I
I
Beginn mit einem Großbuchstaben A–Z, a–z, 0–9, _
Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen
I
CamelCase
Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II
Abstrakte Klasse Eine abstrakte Klasse hat keine Instanzen. I
Person ist eine abstrakte Oberklasse zu Taxifahrer und Fahrgast: Im ganzen Projekt wird keine allgemeine Person vorkommen, nur Spezialisten wie Taxifahrer oder Fahrgäste.
Überladen this Zwischenstand
7.2.2 BlueJ – Projektkommentar
info10 – OOP Markus Schlager Java I Taxifahren BlueJ
Kommentare
Klassen anlegen Projektkommentar Klassenbeziehungen
sind beim Programmieren unerlässlich!
Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen
I I I I
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!
this Zwischenstand
7.2.3 BlueJ – Klassenbeziehungen
info10 – OOP Markus Schlager
I
I
I
Pfeile beim Planen ziehen (Quelltext wird teilweise angepasst) oder Pfeile entstehen automatisch beim Ändern des Quelltextes Entfernen mit Rechtsklick
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
BlueJ kann zwei Arten von Beziehungen darstellen: Abhängigkeit Eine Klasse benutzt die Zielklasse. I Im Quelltext treten Instanzen der Zielklasse auf. Generalisierung Unterklasse einer anderen Klasse
this Zwischenstand
7.2.4 BlueJ – Instanzen erzeugen Rechtsklick auf der Klassenkarte
Konstruktoraufruf
info10 – OOP Markus Schlager Java I Taxifahren BlueJ Klassen anlegen
I
new Klassenname()
Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen
Objektnamen
Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I
I
Beginn mit einem Kleinbuchstaben
Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte
I
a–z, A–Z, 0–9, _
Boolesche Werte
I
camelCase
Überladen
Konstruktor II
this Zwischenstand
Objektkarte I
unten in der Objektbank.
7.2.5 BlueJ – Instanzen untersuchen Rechtsklick auf der Objektkarte I von Oberklassen geerbte Methoden
info10 – OOP Markus Schlager Java I Taxifahren BlueJ Klassen anlegen
I
hier nur Object
Projektkommentar Klassenbeziehungen
I
die Signatur vorhandener eigener Methoden
Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst
I I
int sampleMethod(int y) zum Aufruf einfach anklicken
Taxileuchte Konstruktor I Variablen Datentypen
I
inspect bzw. Untersuchen
Sichtbarkeit Accessoren Parameterwerte
Objektinspektor
Boolesche Werte Konstruktor II Überladen
Der Inspektor bietet Zugriff von außen auf die Werte aller Instanzvariablen eines Objektes. I
hier nur eine einzige Variable x Datentyp: int – ganze Zahl (integer) Sichtbarkeit: private
this Zwischenstand
7.2.6 BlueJ – Quelltext verändern Doppelklick oder Rechtsklick auf der Klassenkarte I
öffnet den Editor
I
Für Java genügt auch ein gewöhnlicher Texteditor.
info10 – OOP Markus Schlager 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
info10 – OOP
7.3 Klassengrundgerüst in Java
Markus Schlager 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
Klassenkommentar
/** * Write a description of class Testklasse here. * * @author (your name) * @version (a version number or a date) */ public class Testklasse { // instance variables - replace the example below with your own private int x;
Klassendefinition
Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst
/** * Constructor for objects of class Testklasse */ public Testklasse() { // initialise instance variables x = 0; }
Deklaration der Instanzvariablen
Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte
Konstruktor
Boolesche Werte Konstruktor II Überladen
/** * An example of a method - replace this comment with your own * a sample parameter for a method * @param y the sum of x and y * @return */ public int sampleMethod(int y) { // put your code here return x + y; }
Methodenkommentar Methodendefinition
}
this Zwischenstand
7.4 Taxileuchte
info10 – OOP Markus Schlager
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/** * Eine Taxileuchte, die anzeigt, ob das Taxi besetzt ist (aus) oder frei (an). * Nach der Erzeugung ist die Leuchte erst einmal aus. * * @author (Markus Schlager) * @version (13.1.2012) */ public class Taxileuchte { // instance variables - replace the example below with your own private boolean istAn; /** * Constructor for objects of class Taxileuchte */ public Taxileuchte() { // initialise instance variables // Die Leuchte ist aus. istAn = false; } }
1–7 8–22 10–11 16–21 20
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
Klassenkommentar minimale Klassendefinition Deklaration der Instanzvariablen mit Variablentyp Konstruktor – Name = Klassenname! Initialisierung der Instanzvariablen mit Startwerten
7.5 Konstruktor in Java
info10 – OOP Markus Schlager
I
Methode zur Erzeugung von Instanzen einer Klasse
Java I Taxifahren
/** * Constructor for objects of class Taxileuchte */ public Taxileuchte() { // initialise instance variables // Die Leuchte ist aus. istAn = false; }
BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen
I I I I I
Name = Klassenname kein Rückgabetyp angegeben ggf. mit Parameterliste Initialisierung der Instanzvariablen mit Startwerten ggf. Aufruf von Startmethoden – „auf die Plätze!“
Konstruktoraufruf objekt = new Klassenname(); objekt = new Klassenname(Parameterliste);
Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand
7.6 Variablen in Java
info10 – OOP Markus Schlager
private boolean istAn; public Taxileuchte() { istAn = false; }
Java I Taxifahren BlueJ Klassen anlegen Projektkommentar
I I I
In Java wird jede Variable zunächst deklariert. Dann wird sie durch eine Wertzuweisung initialisiert. Variablennamen beginnen klein.
Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen
Variablendeklaration
Datentypen Sichtbarkeit Accessoren
I
Sichtbarkeit Datentyp Variablenname;
I
private boolean istAn;
Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand
Wertzuweisung I
Variablenname = Wert;
I
istAn = false;
info10 – OOP
7.7 Einfache Datentypen in Java Name int double boolean char String
Beschreibung ganze Zahl (32 Bit) Gleitkommazahl (64 Bit) boolescher Wahrheitswert einzelnes Schriftzeichen Zeichenkette
Beispielwerte 235 -3508 23.78 2.57e13 true false ’c’ ’5’ "Info 10"
Markus Schlager Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte
Objekttypen Jede Klasse ist als Datentyp geeignet.
Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte
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
Boolesche Werte Konstruktor II Überladen this Zwischenstand
7.8 Datenkapselung – Sichtbarkeit in Java
info10 – OOP Markus Schlager
private
I I
public
I I I
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
Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit
Auftrag
Accessoren Parameterwerte Boolesche Werte Konstruktor II
I
Schreibe in BlueJ Variablendeklarationen und minimale Konstruktoren für alle Klassen deines Taxi-Projektes.
I
Speichern und Überprüfen mit Compile
I
Erzeuge Instanzen deiner Klassen und untersuche sie mit Inspektoren.
Überladen this Zwischenstand
7.9 Accessoren – Zugriff auf Variablen
info10 – OOP Markus Schlager
Get-Methode: Ausgabe des Variablenwertes
Java I Taxifahren BlueJ
1 2 3 4 5 6 7 8 9 10 11
/** * Ausgabe des aktuellen Tarifs * * @param tarif * @return */ public Tarif gibTarifAus() { // Wertausgabe return tarif; }
Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte
Zeile 7 Methodensignatur: I Rückgabewert vom Datentyp Tarif I keine Parameter Zeile 10 Rückgabeanweisung (return) für den Wert der Instanzvariable tarif
Boolesche Werte Konstruktor II Überladen this Zwischenstand
7.9 Accessoren – Zugriff auf Variablen
info10 – OOP Markus Schlager
Set-Methode: Verändern des Variablenwertes
Java I Taxifahren BlueJ
1 2 3 4 5 6 7 8 9 10 11
/** * Setzen des aktuellen Tarifs * Tarif neuerTarif * @param * @return */ public void setzeTarif(Tarif neuerTarif) { // Wertzuweisung tarif = neuerTarif; }
Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte
Zeile 7 Methodensignatur: I kein Rückgabewert (Datentyp void) I Parameter neuerTarif vom Datentyp Tarif Zeile 10 Wertzuweisung (=) des Parameterwertes neuerTarif an die Instanzvariable tarif
Konstruktor II Überladen this Zwischenstand
7.9 Accessoren – Zugriff auf Variablen
info10 – OOP Markus Schlager
Auftrag
Java I Taxifahren BlueJ
I
I
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!
Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen
I
I
Erzeuge Instanzen deiner Klassen und probiere deren neue Methoden aus (Rechtsklick auf der Objektkarte).
Sichtbarkeit
Gibt es speziell beim Aufruf der Set-Methoden Probleme?
this
Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen
Zwischenstand
7.10 Angabe von Parameterwerten
info10 – OOP Markus Schlager
Eine Methode mit Parametern methodenname(Parametertyp parametername) verlangt beim Aufruf die Angabe eines Wertes: I
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 I Name einer Instanz, die bereits erzeugt wurde und z.B. in BlueJ als Objektkarte vorliegt I 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
7.11 Boolesche Werte und Umschalten
info10 – OOP Markus Schlager
Boolesche Werte (Wahrheitswerte) eignen sich als Antworten auf Ja-Nein-Fragen: I Stimmt eine Aussage oder stimmt sie nicht? I Ja oder Nein? Wahr oder falsch?
Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen
Boolesche Werte in Java
Instanzen untersuchen Quelltext verändern Klassengrundgerüst
I
true oder false
Taxileuchte Konstruktor I Variablen Datentypen
Boolesche Werte lassen sich negieren I verneinen, in ihr Gegenteil umkehren
Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II
Negation in Java
Überladen this Zwischenstand
I
!true ergibt false.
I
!false ergibt true.
Der Verneinungsoperator ! (nicht) kann auch vor Variablen wie istAn mit booleschem Wert stehen.
7.11 Boolesche Werte und Umschalten
info10 – OOP Markus Schlager
Umschalten mit Verzweigung Java I
Leuchte istAn? WAHR schalte Leuchte aus
FALSCH schalte Leuchte an
Umschalten als Negation die elegante Lösung
Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst
schalte Leuchte um Umsetzung durch Wertzuweisung an die Instanzvariable
Negation in Java
Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II
I
istAn = !istAn;
Überladen this Zwischenstand
Auftrag I
Schreibe Taxileuchte.schalteUm() in BlueJ. I
I
Liefert diese Methode einen Rückgabewert?
Teste die Methode mit geöffnetem Inspektor.
7.11 Boolesche Werte und Umschalten
info10 – OOP Markus Schlager
/** * Umschalten der Leuchte * keine Parameter * @param kein Rueckgabewert * @return */ public void schalteUm() { // neuer Zustand ist das Gegenteil des alten Zustandes // Negation mit ! istAn = !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
Auftrag
Parameterwerte Boolesche Werte Konstruktor II
I
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. I
Achte jeweils auf die Sichtbarkeit der Methode!
Überladen this Zwischenstand
7.12 Konstruktoren mit Parametern
info10 – OOP Markus Schlager
I
Vermutlich sieht der Konstruktor der Klasse Tarif momentan etwa so aus:
Java I Taxifahren BlueJ Klassen anlegen
// instance variables private double grundgeb; private double km_preis; private double min_preis;
Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst
/** * Constructor for objects of class Tarif * Standardtarif */ public Tarif() { // initialise instance variables grundgeb = 3.50; km_preis = 1.40; min_preis = 0.35; }
I I
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?
Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand
7.12 Konstruktoren mit Parametern
info10 – OOP Markus Schlager
I I
Java erlaubt auch Konstruktoren mit Parameterlisten. Auch kann eine Klasse mehrere Konstruktoren mit unterschiedlicher Signatur besitzen, z. B.
Java I Taxifahren BlueJ Klassen anlegen Projektkommentar
/** Klassenbeziehungen Instanzen erzeugen * Constructor for objects of class Tarif Instanzen untersuchen * Standardtarif Quelltext verändern */ Klassengrundgerüst public Tarif() Taxileuchte { Konstruktor I // initialise instance variables Variablen Datentypen grundgeb = 3.50; Sichtbarkeit km_preis = 1.40; Accessoren min_preis = 0.35; Parameterwerte } Boolesche Werte /** Konstruktor II Überladen * Constructor for objects of class Tarif this * Wunschtarif Zwischenstand */ public Tarif(double grundgeb, double km_preis, double min_preis) { // initialise instance variables grundgeb = grundgeb; km_preis = km_preis; min_preis = min_preis; }
I
Übernimm die Konstruktoren für deine Tarif-Klasse.
info10 – OOP
7.12 Konstruktoren mit Parametern
Markus Schlager
I
BlueJ bietet nun zum Erzeugen von Instanzen beide Konstruktoren an:
Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen
I
Erzeuge mit beiden Konstruktoren Instanzen und untersuche sie mit Inspektoren. Passt alles?
Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte
I
Beim Wunschtarif werden die eingegebenen Parameterwerte nicht übernommen. Warum?
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; }
7.13 Überladen von Variablennamen
info10 – OOP Markus Schlager
public Tarif(double grundgeb, double km_preis, double min_preis) { // initialise instance variables grundgeb = grundgeb; km_preis = km_preis; min_preis = min_preis; }
Java I Taxifahren BlueJ Klassen anlegen Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen Quelltext verändern Klassengrundgerüst
Überladen Wenn lokale Variablen (Parameter) und Instanzvariablen den gleichen Namen tragen, werden die Instanzvariablen verschattet:
Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II
I
Alle Variablenzugriffe innerhalb des Blocks beziehen sich nur auf die lokalen Variablen.
I
Die Instanzvariablen werden nicht gelesen und bleiben unverändert, solange die lokalen Variablen gültig sind.
I
Auswege?
Überladen this Zwischenstand
7.13 Überladen von Variablennamen
info10 – OOP Markus Schlager
Ausweg 1: andere Namen für die Parameter
Java I Taxifahren
BlueJ // instance variables Klassen anlegen private double grundgeb; Projektkommentar private double km_preis; Klassenbeziehungen private double min_preis; Instanzen erzeugen Instanzen untersuchen /** Quelltext verändern Constructor for objects of class Tarif * Klassengrundgerüst * Wunschtarif mit anderen Parameternamen Taxileuchte */ Konstruktor I public Tarif(double grundgeb_neu, double km_preis_neu, double min_preis_neu) Variablen Datentypen { Sichtbarkeit // initialise instance variables Accessoren grundgeb = grundgeb_neu; Parameterwerte km_preis = km_preis_neu; Boolesche Werte min_preis = min_preis_neu; Konstruktor II Überladen } this
Nachteil: zusätzliche, umständliche Variablennamen
Zwischenstand
7.14 this – das aktuelle Objekt
info10 – OOP Markus Schlager
Ausweg 2: das Schlüsselwort this
Java I Taxifahren
// 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; }
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
I
this meint stets das aktuelle Objekt.
I
Damit ist klar, dass die angegebene Instanzvariable gemeint ist und nicht die lokale Variable aus dem aktuellen Kontext.
7.14 this – das aktuelle Objekt
info10 – OOP Markus Schlager
Auftrag
Java I Taxifahren BlueJ
I
I
Übernimm die Veränderungen der Konstruktoren der Klasse Tarif. Ergänze die Klasse Taxameter um Instanzvariablen für I I
den aktuell eingestellten Tarif (Startwert null), einen Tagtarif und einen Nachttarif (Startwert zwei passende Tarife mit Grundgebühr, Kilometer- und Minutenpreis).
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
I
Passe ggf. die Accessoren (get/set) an.
I
Erzeuge eine Taxameter-Instanz und untersuche sie mit dem Inspektor.
I
Kannst du auch die Tarife des Taxameters im Inspektor untersuchen?
Überladen this Zwischenstand
7.15 Taxi – Zwischenstand
info10 – OOP Markus Schlager
I
Vorschläge für die bisher behandelten Klassen
I
Kommentare wurden weggelassen
Java I Taxifahren BlueJ Klassen anlegen
Taxileuchte
Projektkommentar Klassenbeziehungen Instanzen erzeugen Instanzen untersuchen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public class Taxileuchte { private boolean istAn; public Taxileuchte() { istAn = false; } public boolean gibIstAn() { return istAn; } public void schalteUm() { istAn = !istAn; } }
Quelltext verändern Klassengrundgerüst Taxileuchte Konstruktor I Variablen Datentypen Sichtbarkeit Accessoren Parameterwerte Boolesche Werte Konstruktor II Überladen this Zwischenstand
7.15 Taxi – Zwischenstand Tarif
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
info10 – OOP Markus Schlager
public class Tarif { Java I private double grundgeb; Taxifahren private double km_preis; BlueJ private double min_preis; Klassen anlegen public Tarif() Projektkommentar Klassenbeziehungen { Instanzen erzeugen grundgeb = 3.50; Instanzen untersuchen km_preis = 1.40; Quelltext verändern min_preis = 0.35; Klassengrundgerüst } Taxileuchte Konstruktor I public Tarif(double grundgeb, double km_preis, double min_preis) Variablen { Datentypen this.grundgeb = grundgeb; Sichtbarkeit this.km_preis = km_preis; Accessoren this.min_preis = min_preis; Parameterwerte Boolesche Werte } Konstruktor II public double gibGrundgebAus() Überladen { this return grundgeb; Zwischenstand } public double gibKmPreisAus() { return km_preis; } public double gibMinPreisAus() { return min_preis; } }
7.15 Taxi – Zwischenstand Taxameter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
public class Taxameter { private boolean istAn; private double betrag; private Tarif tarif; private Tarif tagtarif; private Tarif nachttarif; public Taxameter() { istAn = false; betrag = 0.00; tarif = null; tagtarif = new Tarif(3.00,1.70,0.50); nachttarif = new Tarif(3.20,1.90,0.70); } public boolean gibIstAn() { return istAn; } public void schalteUm() { istAn = !istAn; } public double gibBetragAus() { return betrag; } public Tarif gibTarifAus() { return tarif; } public void setzeTarif(Tarif neuerTarif) { tarif = neuerTarif; } }
info10 – OOP Markus Schlager 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
info10 – OOP Markus Schlager Java II Referenzen Sammlungen Import JGUIToolbox
Teil VIII
Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand
Java II
Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
Überblick
info10 – OOP Markus Schlager
Grundkonzepte
Java II Referenzen Sammlungen
Ablaufmodelliierung
Import JGUIToolbox Vererbung Verzweigung
Smalltalk I – die Entwicklungsumgebung Squeak
Taxameteranzeige Konkatenation Verschachtelung Zwischenstand
Smalltalk II – Grundzüge der Programmiersprache
Testklasse Lokale Variablen JGUIToolbox – Fenster
Pharo I – Smalltalk-Entwicklung mit Pharo
Warten for-Schleife Wiederholung mit fester Anzahl
Pharo II – Grundzüge von Smalltalk
Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
Java I – Klassen in BlueJ anlegen Java II – JGUIToolbox und weitere Konstrukte Zustandsmodellierung Anhang
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
info10 – OOP Markus Schlager 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
8.1 BlueJ – Referenzen im Inspektor
info10 – OOP Markus Schlager 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
8.2 Objektsammlungen variabler Größe
info10 – OOP Markus Schlager
I
I
Das Taxameter kennt zwei (oder mehr) Tarife, zwischen denen der Taxifahrer umschalten kann. Wie stellt man an einem echten Taxameter den Tarif ein/um? I
I
mit einem (beschrifteten) Drehknopf, der bei jedem Tarif einrastet mit einem Druckknopf der zum nächsten Tarif weiterschaltet
Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten
I
Wie implementiert man das in einer Programmiersprache?
I
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?
I
mit einer Objektsammlung, z. B. einer Liste
for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.2 Objektsammlungen variabler Größe
info10 – OOP Markus Schlager
I
In Java gibt es für Listen z. B. die Klasse
Java II Referenzen
ArrayList
Sammlungen Import JGUIToolbox Vererbung
variable Länge: Elemente können hinzugefügt oder entfernt werden. Indizierung: Die Elemente sind der Reihe nach durchnummeriert. Deklaration: private ArrayList liste; Initialisierung: liste = new ArrayList(); I
Zwischen spitzen Klammern muss der Datentyp der Listenelemente angegeben werden, z. B.: private ArrayList tarifliste; tarifliste = new ArrayList();
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
8.3 Import – Bibliotheken benutzen
info10 – OOP Markus Schlager
I
I
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.
Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung
I
Dies geschieht mit einer
Zwischenstand Testklasse Lokale Variablen
import-Anweisung
JGUIToolbox – Fenster Warten for-Schleife
I I
import java.paket.Klasse; import java.util.ArrayList;
Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
I I
I
allererste Zeile in der Java-Datei vor den Klassendefinitionen
In BlueJ finden sich Informationen zu Bibliotheken unter I
Hilfe → Java Klassenbibliothek
8.3 Import – Bibliotheken benutzen
info10 – OOP Markus Schlager
Auftrag
Java II Referenzen Sammlungen
I
Öffne in der BlueJ-Hilfe die Java-Klassenbibliothek.
Import
I
Wähle oben links das Paket java.util und dann unten links die Klasse ArrayList aus.
Vererbung
JGUIToolbox
Verzweigung Taxameteranzeige Konkatenation Verschachtelung
I
Blättere rechts bis zum Method Summary und verschaffe dir einen Überblick über die Methoden der Klasse ArrayList.
Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife
I
I
Erweitere den Konstruktor deiner Klasse Taxameter um eine Instanzvariable tarifliste. Sorge dafür, dass die vorhandenen Tarife (Tag/Nacht/...) zur Tarifliste hinzugefügt werden. I
I
Ü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?
Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.3 Import – Bibliotheken benutzen
info10 – OOP Markus Schlager
Auftrag
Java II Referenzen Sammlungen
I
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. I
I
I
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.
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
8.3 Import – Bibliotheken benutzen 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
// Einbinden der Klasse ArrayList aus dem Paket java.util import java.util.ArrayList; public class Taxameter { private Tarif tarif; private Tarif tagtarif; private Tarif nachttarif; private ArrayList tarifliste; public Taxameter() { tarif = null; tagtarif = new Tarif(3.00,1.70,0.50); nachttarif = new Tarif(3.20,1.90,0.70); tarifliste = new ArrayList(); tarifliste.add(tagtarif); tarifliste.add(nachttarif); } public void setzeTarif(Tarif neuerTarif) { tarif = neuerTarif; } public void waehleTarif(int nummer) { setzeTarif(tarifliste.get(nummer)); } public void schalteTarifWeiter() { waehleTarif(tarifliste.indexOf(this.tarif)+1); } }
info10 – OOP Markus Schlager 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
8.4 Die JGUIToolbox – Grafikkomponenten
info10 – OOP Markus Schlager
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 I 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. I
info10 – OOP
8.5 Vererbung – Unterklassen anlegen
Markus Schlager
Probleme:
I
AusgabePanel kennt keine get-Methode für seine Beschriftung, nur eine (private) Instanzvariable anzeigeText. I
I I
Lösung:
I
AusgabePanel weiß nichts von einer Taxileuchte (und umgekehrt). Welche Klassen sollten verändert werden? Keine bestehende Klasse verändern! I
I
I
Taxileuchte
evtl. nötig, falls z. B. ein Fahrgast die optische Anzeige auswerten soll
Die Taxileuchte (das Modell) tut, was sie soll. AusgabePanel wird von Hans Witt gepflegt, nicht von dir.
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
Lege eine angepasste Unterklasse von AusgabePanel an: < beobachtet
1
Java II
∗
TaxileuchtenPanel
AusgabePanel
8.5 Vererbung – Unterklassen anlegen
info10 – OOP Markus Schlager Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife
I
TaxileuchtenPanel braucht Instanzvariablen für I I
die zu beobachtende Leuchte, evtl. für die verwendeten Farben.
I
Beim Konstruktoraufruf soll die Beschriftung angegeben werden können.
I
Im Konstruktor muss ein AnzeigenPanel (Oberklasse) erzeugt und dann angepasst werden.
Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.5 Vererbung – Unterklassen anlegen
info10 – OOP Markus Schlager
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
public class TaxileuchtenPanel extends AusgabePanel { // instance variables - replace the example below with your own private Taxileuchte leuchte; private String hfarbe; // Helle Farbe private String dfarbe; // Dunkle Farbe
Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation
/** * Constructor for objects of class TaxileuchtenPanel */ public TaxileuchtenPanel(Taxileuchte leuchte, String aufschrift) { // Konstruktor der Oberklasse super(aufschrift,100,50); // initialise instance variables this.leuchte = leuchte; this.hfarbe = "gelb"; this.dfarbe = "schwarz"; setzeSchriftgroesse(32); aktualisiereDich(); //Aussehen passend zum Zustand der Leuchte } }
extends: Angabe der Oberklasse super: als erstes Konstruktoraufruf der Oberklasse
Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.6 Verzweigung in Java – if–else
info10 – OOP Markus Schlager Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung
Was soll bei aktualisiereDich() passieren?
Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse
I
Wenn Taxileuchte an, dann:
Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife
I
Sonst, also wenn Taxileuchte aus, dann:
Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.6 Verzweigung in Java – if–else
info10 – OOP Markus Schlager
Anweisungen vorher Bedingung erfüllt? WAHR FALSCH Anweisungen, falls Anweisungen, falls Bedingung erfüllt Bedingung nicht erfüllt Anweisung nachher
Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster
Bedingte Anweisung
Warten for-Schleife Wiederholung mit fester Anzahl
I
I
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.
Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.6 Verzweigung in Java – if–else
info10 – OOP Markus Schlager
I
Beim TaxileuchtenPanel:
Java II Referenzen Sammlungen Import
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/** * Aktualisierung des Aussehens * @return */ public void aktualisiereDich() { if (leuchte.gibIstAn()) { setzeHintergrundfarbe(hfarbe); setzeSchriftfarbe(dfarbe); } else { setzeHintergrundfarbe(dfarbe); setzeSchriftfarbe(hfarbe); } }
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
8.7 Taxameteranzeige
info10 – OOP Markus Schlager
Auftrag
Java II Referenzen Sammlungen
I I
Programmiere analog eine TaxameterAnzeige. Angezeigt werden sollen I I I I
der Name des eingestellten Tarifs die Grundgebühr der km-Preis der Minutenpreis
Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten
I
Möglicherweise musst du dazu erst noch die Klassen Tarif und Taxameter anpassen!
for-Schleife
I
Benutze die Klasse Behaelter aus der JGUIToolbox für die Darstellung des gesamten Taxameters als Oberklasse der TaxameterAnzeige.
while-Schleife
I
Behaelter werden z. B. sichtbar, wenn man den Beschreibungstext setzt.
Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf
Schleifenunterbrechung
8.8 Zeichenketten – Konkatenation
info10 – OOP Markus Schlager
Problem: Die Klasse AusgabePanel erwartet als Ausgabetext Zeichenketten, also Werte vom Typ String.
Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung
Stringkonkatenation
Taxameteranzeige Konkatenation Verschachtelung Zwischenstand
I
I
Mehrere Zeichenketten lassen sich mit einem + zu einer einzigen zusammenfügen (konkatenieren) "Java" + "-" + "Programm" ergibt "Java-Programm"
I
Wird ein Wert von einem anderen Datentyp (etwa eine Zahl) an einen String konkateniert, wird der Wert Bestandteil der neuen Zeichenkette.
I
"Die Antwort lautet " + 42 + "." ergibt "Die Antwort lautet 42."
Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.8 Zeichenketten – Konkatenation
info10 – OOP Markus Schlager
Umwandlung in eine Zeichenkette
Java II Referenzen Sammlungen
I
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.
I
" " + 3.14 ergibt "3.14"
I
" " + meinTaxameter.gibFahrpreisAus() ergibt "0.0" (falls der Fahrpreis gerade diesen Zahlenwert hat)
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
info10 – OOP
8.9 Geschachtelte Methodenaufrufe
Markus Schlager
I
Wie kommt die Taxameteranzeige an den Namen des eingestellten Tarifs?
Java II Referenzen Sammlungen Import
taxameterAnzeige
gibTarifAus()
JGUIToolbox
taxameter
Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand
gibTarifnameAus()
tarif
Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife
Der eingestellte Tarif ist für die Taxameteranzeige das Rückgabeobjekt taxameter.gibTarifAus() I Diesem Objekt schickt die Anzeige die Nachricht taxameter.gibTarifAus().gibTarifnameAus() I Rückgabewert ist der Name (als Zeichenkette). I Empfänger dieses Wertes ist der Sender der gesamten Nachricht, also die Taxameteranzeige. I
Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.9 Geschachtelte Methodenaufrufe
info10 – OOP Markus Schlager
I
Ein echtes Taxameter kennt mehr als nur zwei Tarife. Die bisherige Implementierung sieht so aus:
Java II Referenzen Sammlungen Import
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
I
public class Taxameter { private boolean istAn; private double betrag; private Tarif tarif; private Tarif tagtarif; private Tarif nachttarif; private ArrayList tarifliste; public Taxameter() { istAn = false; betrag = 0.00; tarif = null; tagtarif = new Tarif(); nachttarif = new Tarif("Nachttarif",3.20,1.90,0.70); tarifliste = new ArrayList(); tarifliste.add(tagtarif); tarifliste.add(nachttarif); } }
Was ist ungünstig, wenn diese Taxameter-Klasse auf mehrere Tarife erweitert werden soll?
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
8.9 Geschachtelte Methodenaufrufe
info10 – OOP Markus Schlager
I
I
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:
Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Testklasse
public class Taxameter Lokale Variablen { JGUIToolbox – Fenster Warten private boolean istAn; for-Schleife private double betrag; Wiederholung mit fester private Tarif tarif; //aktuell eingestellter Tarif Anzahl private ArrayList tarifliste; Listendurchlauf mit Indizes for each – Listendurchlauf public Taxameter() while-Schleife { Schleifenunterbrechung istAn = false; betrag = 0.00; tarif = null; tarifliste = new ArrayList(); tarifliste.add(new Tarif()); //Standardtarif tarifliste.add(new Tarif("Nachttarif",3.20,1.90,0.70)); tarifliste.add(new Tarif("Gruppentarif",5.20,2.50,0.70)); tarifliste.add(new Tarif("Gruppentarif-Nacht",6.30,2.80,0.90)); } }
8.10 Taxianzeige – Zwischenstand
info10 – OOP Markus Schlager
I
Vorschläge für die neu hinzugekommenen Anzeigeklassen und Veränderungen in anderen Klassen
I
Kommentare wurden weggelassen.
I
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
8.10 Taxianzeige – Zwischenstand
info10 – OOP Markus Schlager
Tarif
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
public class Tarif { private String tarifname; private double grundgeb; private double km_preis; private double min_preis; public Tarif() { tarifname = "Standardtarif"; grundgeb = 3.50; km_preis = 1.40; min_preis = 0.35; } public Tarif(String tarifname, double grundgeb, double km_preis, double min_preis) { this.tarifname = tarifname; this.grundgeb = grundgeb; this.km_preis = km_preis; this.min_preis = min_preis; } public String gibTarifnameAus() { return tarifname; } }
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
8.10 Taxianzeige – Zwischenstand
info10 – OOP Markus Schlager
Taxameter
Java II Referenzen Sammlungen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Import // Einbinden der Klasse ArrayList aus dem Paket java.util JGUIToolbox import java.util.ArrayList; Vererbung public class Taxameter Verzweigung { Taxameteranzeige Konkatenation private boolean istAn; Verschachtelung private double betrag; Zwischenstand private Tarif tarif; //aktuell eingestellter Tarif Testklasse private ArrayList tarifliste; Lokale Variablen public Taxameter() JGUIToolbox – Fenster Warten { for-Schleife istAn = false; Wiederholung mit fester betrag = 0.00; Anzahl tarif = null; Listendurchlauf mit Indizes for each – Listendurchlauf tarifliste = new ArrayList(); while-Schleife tarifliste.add(new Tarif()); //Standardtarif Schleifenunterbrechung tarifliste.add(new Tarif("Nachttarif",3.20,1.90,0.70)); tarifliste.add(new Tarif("Gruppentarif",5.20,2.50,0.70)); tarifliste.add(new Tarif("Gruppentarif-Nacht",6.30,2.80,0.90)); } }
8.10 Taxianzeige – Zwischenstand
info10 – OOP Markus Schlager
TaxameterAnzeige
Java II Referenzen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Sammlungen
public class TaxameterAnzeige extends Behaelter Import { JGUIToolbox private Taxameter taxmet; Vererbung private AusgabePanel tariffeld; Verzweigung private AusgabePanel grundgebfeld; Taxameteranzeige private AusgabePanel kmPreisfeld; Konkatenation private AusgabePanel minPreisfeld; Verschachtelung private AusgabePanel fahrpreisfeld; Zwischenstand public TaxameterAnzeige(Taxameter taxameter) Testklasse { Lokale Variablen this.taxmet = taxameter; JGUIToolbox – Fenster setzeGroesse(220,330); Warten setzePosition(50,60); for-Schleife this.fahrpreisfeld = new AusgabePanel(this,"kein Preis", 10, 20, 200, 50); Wiederholung mit fester this.tariffeld = new AusgabePanel(this, "kein Tarif", 10, 80, 200, 50); Anzahl Listendurchlauf mit Indizes this.grundgebfeld = new AusgabePanel(this, "kein Tarif", 10, 140, 200, 50); for each – Listendurchlauf this.kmPreisfeld = new AusgabePanel(this, "kein Tarif", 10, 200, 200, 50); this.minPreisfeld = new AusgabePanel(this, "kein Tarif", 10, 260, 200, while-Schleife 50); Schleifenunterbrechung setzeBeschreibungstext("Taxameter"); setzeHintergrundfarbe("rot"); } public void aktualisiereDich() { fahrpreisfeld.setzeAusgabetext(""+taxmet.gibBetragAus()); tariffeld.setzeAusgabetext(taxmet.gibTarifAus().gibTarifnameAus()); grundgebfeld.setzeAusgabetext(""+taxmet.gibTarifAus().gibGrundgebAus()); kmPreisfeld.setzeAusgabetext(""+taxmet.gibTarifAus().gibKmPreisAus()); minPreisfeld.setzeAusgabetext(""+taxmet.gibTarifAus().gibMinPreisAus()); } }
8.11 Taxitester – eine Testklasse
info10 – OOP Markus Schlager
I
I
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.
Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung
Probleme:
I I
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 Nachrichten zu schicken und ggf. die Ergebnisse zu überprüfen. I keine Instanzvariablen I für jeden Test eine eigene Methode
Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.11 Taxitester – eine Testklasse
info10 – OOP Markus Schlager
Grundgerüst:
Java II Referenzen Sammlungen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
public class Taxitest { public Taxitest() { }
Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung
/** * Test der Taxileuchte */ public void testeTaxileuchte() { }
Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes
/** * Test der Taxameteranzeige */ public void testeTaxameter() { } }
for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.11 Taxitester – eine Testklasse
info10 – OOP Markus Schlager
Test der Taxileuchte: testeTaxileuchte()
Java II Referenzen Sammlungen Import
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
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.
8.12 Lokale Variablen
info10 – OOP Markus Schlager
Problem: Die Testklasse besitzt keinerlei Instanzvariablen, benötigt zum Testen aber Namen für die Objekte, um ihnen Nachrichten zu schicken. Lösung: Innerhalb einer Methode lassen sich lokale Variablen deklarieren. I keine Angabe der Sichtbarkeit (public/private) I Namen nur innerhalb dieser Methode gültig Leuchtentest: Benötigt werden I eine Zeichnung fenster I eine Taxileuchte tl I 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
8.12 Lokale Variablen
info10 – OOP Markus Schlager
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
8.13 JGUIToolbox – Fenster
info10 – OOP Markus Schlager
Benötigt wird die Klasse Zeichnung aus dem Verzeichnis Basis der JGUIToolbox.
Java II Referenzen Sammlungen
Zeichnung deklarieren: I I
private Zeichnung fenster; // Instanzvariable Zeichnung fenster; // lokale Variable
Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse
Zeichnung erzeugen:
Lokale Variablen JGUIToolbox – Fenster Warten
I I I
fenster = new Zeichnung(); fenster = new Zeichnung("Titel"); Nachfolgend erzeugte JGUI-Objekte erscheinen automatisch in diesem Fenster.
Fenstergröße anpassen: I fenster.setSize(200,300); // Pixel Fenster schließen: I fenster.dispose();
for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.14 Thread.sleep – Programm anhalten
info10 – OOP Markus Schlager
I
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 Konkatenation
try { Thread.sleep(5000); } catch (InterruptedException ex) { ex.printStackTrace(); }
Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes
I
I
Zeitangaben erfolgen stets als ganze Zahl in Millisekunden, hier 5000. Einfacher geht es mit der JGUIToolbox: StaticTools.warte(5000);
for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.15 for
info10 – OOP Markus Schlager
Ist bekannt, wie oft eine Anweisungssequenz wiederholt werden soll, bietet sich für die Wiederholung eine Zählschleife (auch for-Schleife) an:
Java II Referenzen Sammlungen Import JGUIToolbox
I
Wiederhole etwas zehnmal.
I
Mache etwas für alle ungeraden Zahlen zwischen 100 und 200.
I
Mache etwas für alle Elemente aus einer Liste.
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
8.15.1 for – Wiederholung mit fester Anzahl
info10 – OOP Markus Schlager
Wiederhole bis zum Endwert der Schleifenvariablen zu wiederholende Anweisungen
Java II Referenzen Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige
for-Schleife for (Initialisierung; Abbruch; Schritt) { zu wiederholende Anweisungen; }
Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife Wiederholung mit fester Anzahl
I
Initialisierung der Schleifenvariablen mit Datentyp und Startwert
I
Abbruchbedingung an die Schleifenvariable
I
Schritt zur Veränderung der Schleifenvariablen (meist Erhöhung um 1)
Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.15.1 for – Wiederholung mit fester Anzahl
info10 – OOP Markus Schlager
Lampe zweimal umschalten:
Java II Referenzen
for (int versuch = 0; versuch < 2; versuch++) { tl.schalteUm(); tlp.aktualisiereDich(); }
Die Schleifenvariable versuch ist eine ganze Zahl. I ++ erhöht den Wert von versuch um 1. Benutzung der Schleifenvariablen im Schleifenkörper: I
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 (int versuch = 0; versuch < 2; versuch++) { for each – Listendurchlauf // Terminalausgabe der Versuchsnummer while-Schleife Schleifenunterbrechung System.out.println("Versuch: " + versuch); tl.schalteUm(); tlp.aktualisiereDich(); System.out.println("Lampe ist an: " + tl.gibIstAn()); }
I
Einfache Textausgabe mit System.out.println(Wert)
8.15.2 for – Listendurchlauf mit Indizes
info10 – OOP Markus Schlager
Durchschalten aller Tarife:
Java II Referenzen
tm.waehleTarif(0); tma.aktualisiereDich(); for (int tnum = 0; tnum < tm.gibTariflisteAus().size(); tnum++) { tm.schalteTarifWeiter(); tma.aktualisiereDich(); }
Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten
for (int tnum = 0; tnum < tm.gibTariflisteAus().size(); tnum++) { tm.waehleTarif(tnum); tma.aktualisiereDich(); } I I
Listenindizes beginnen in der Regel mit 0. size() liefert die Anzahl der Elemente einer ArrayList.
for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.15.3 for – for each – Listendurchlauf
info10 – OOP Markus Schlager
Eleganter ohne Indizes direkt mit den Listenelementen:
Java II Referenzen
for (Tarif tarif : tm.gibTariflisteAus()) { tm.setzeTarif(tarif); tma.aktualisiereDich(); }
Sammlungen Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation
I
I
Die Methode gibTariflisteAus() der Klasse Taxameter liefert als Rückgabewert die ganze Tarifliste vom Typ ArrayList. Die Schleifenvariable tarif nimmt der Reihe nach jeden Tarif aus der Liste als Wert an.
Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife
for-each-Schleife for (Datentyp variable : liste) { zu wiederholende Anweisungen; }
Schleifenunterbrechung
8.16 while – Bedingte Wiederholung
info10 – OOP Markus Schlager
Soll ein Anweisungsblock wiederholt werden, solange eine Bedingung erfüllt ist, verwendet man eine bedingte Wiederholung (auch while-Schleife):
Java II Referenzen Sammlungen Import JGUIToolbox
I
Fahre, solange du noch nicht am Ziel bist.
I
Warte, solange die Ampel rot ist.
I
Belade den Kofferraum, solange noch Taschen draußen stehen.
Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten
Wiederhole, solange eine Bedingung erfüllt ist zu wiederholende Anweisungen
for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.16 while – Bedingte Wiederholung
info10 – OOP Markus Schlager
Häufig wird in der Bedingung der Wert einer Schleifenvariablen überprüft, der bei jedem Durchlauf im Anweisungsblock verändert wird.
Java II Referenzen Sammlungen Import JGUIToolbox
I
Diese Variable muss vor der Schleife mit einem Startwert initialisiert werden:
Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung
Initialisierung der Schleifenvariablen Wiederhole, solange eine Bedingung erfüllt ist zu wiederholende Anweisungen mit Veränderung der Schleifenvariablen
Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.16 while – Bedingte Wiederholung
info10 – OOP Markus Schlager
while-Schleife
Java II Referenzen Sammlungen
I
ohne eigene Schleifenvariable: while (Bedingung) { zu wiederholende Anweisungen; }
Import JGUIToolbox Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand
I
mit eigener Schleifenvariable sVar: sVar = Startwert; while (Bedingung) { zu wiederholende Anweisungen; sVar = neuer_Wert; }
Testklasse Lokale Variablen JGUIToolbox – Fenster Warten for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.16 while – Bedingte Wiederholung
info10 – OOP Markus Schlager
Taxifahren
Java II Referenzen
I
Programmiere eine Klasse Ort.
Sammlungen Import JGUIToolbox
I
I I
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.
Vererbung Verzweigung Taxameteranzeige Konkatenation Verschachtelung Zwischenstand Testklasse Lokale Variablen JGUIToolbox – Fenster
I
Programmiere die Klasse Taxi. I I I
I
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?)
Warten for-Schleife Wiederholung mit fester Anzahl Listendurchlauf mit Indizes for each – Listendurchlauf while-Schleife Schleifenunterbrechung
8.16 while – Bedingte Wiederholung
info10 – OOP Markus Schlager
Taxifahren
Java II Referenzen
I
Programmiere eine Methode Taxi.fahreZu(Ort ziel). I
I
I
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.
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
8.16 while – Bedingte Wiederholung
info10 – OOP Markus Schlager
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
public class Taxi extends Kreis { public void fahreZu(Ort ziel) { // Leuchte ausschalten // Taxameter einschalten und Grundgeb. als Fahrpreis // km zuruecksetzen while (xPos < ziel.gibX()) { horizontalBewegen(1); aktualisiereAnzeigen(); StaticTools.warte(10); } // Leuchte einschalten // Taxameter ausschalten }
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
/* * Aktualisierung aller Anzeigen */ private void aktualisiereAnzeigen() { // km-Stand // Taxameterbetrag } }
Schleifenunterbrechung
8.17 continue / break – Schleifenunterbrechung
info10 – OOP Markus Schlager 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
info10 – OOP Markus Schlager Zustandsmodelle Zustandsübergänge Zustände Automaten
Teil IX
Einfachstes Beispiel – der Lichtschalter Zustandsdiagramme Modellierung eines CD-Spielers Modellierung eines Münztelephons endliche Automaten
Zustandsmodellierung
Zustandstabellen Noch einmal der CD-Spieler Kara Zustandsmodellierung Unit-Tests
Überblick
info10 – OOP Markus Schlager
Grundkonzepte
Zustandsmodelle Zustandsübergänge Zustände
Ablaufmodelliierung
Automaten Einfachstes Beispiel – der Lichtschalter Zustandsdiagramme
Smalltalk I – die Entwicklungsumgebung Squeak
Modellierung eines CD-Spielers Modellierung eines Münztelephons
Smalltalk II – Grundzüge der Programmiersprache
endliche Automaten Zustandstabellen Noch einmal der CD-Spieler Kara
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
Zustandsmodellierung Unit-Tests
Gliederung
info10 – OOP Markus Schlager
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
9.1 Zustandsübergänge
info10 – OOP Markus Schlager
Beim Spiel Tausammler ändern die beteiligten Objekte im Lauf der Zeit ihren jeweiligen Zustand: I 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 endliche Automaten
I
Der Käfer ist mal beladen, mal unbeladen.
Zustandstabellen Noch einmal der CD-Spieler Kara Zustandsmodellierung Unit-Tests
I
Der anfangs leere Speicher wird nach und nach voll.
Wodurch werden diese Zustandsübergänge ausgelöst, welche Veränderungen haben sie zur Folge?
9.1 Zustandsübergänge
info10 – OOP Markus Schlager
Tropfen I Zustandsübergang, wenn sein Alter einen bestimmten Wert überschreitet, wenn also eine Bedingung erfüllt ist. I Es ändert sich sein Aussehen, ein Attributwert. I Zustandsübergang, wenn der Startknopf gedrückt wird, also ein auslösendes Ereignis eintritt. I Es ändert sich das Verhalten des Tropfens: Er beginnt zu verdunsten. Speicher I Zustandsübergang, wenn der Käfer einen Tropfen abliefert und dem Speicher die Nachricht schickt, diesen zu „schlucken“, ein auslösendes Ereignis. I Es ändern sich einige Attributwerte, etwa die Farbe oder der Inhalt.
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
9.1 Zustandsübergänge
info10 – OOP Markus Schlager Zustandsmodelle
Käfer I
I
I
Zustandsübergänge Zustände
Zustandsübergang, wenn er einen Tropfen oder den Speicher berührt, also eine Bedingung erfüllt ist. Allerdings wechselt der Zustand des Käfers nur, wenn er gerade im passenden Zustand ist. Es ändert sich der Attributwert von Käfer.beladen und sein Verhalten: Ein beladener Käfer nimmt keine weiteren Tropfen mit, ein unbeladener gibt keine im Speicher ab. Außerdem führt der Käfer bei einem Zustandsübergang ausgelöste Aktionen aus: I
I
Wenn er unbeladen einen Tropfen trifft, lädt er ihn auf und beginnt ihn zu transportieren. Wenn er beladen zum Speicher kommt, gibt er den Tropfen ab und erhöht seinen Punktestand.
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
9.1 Zustandsübergänge
info10 – OOP Markus Schlager
Zustandsübergänge
Zustandsmodelle Zustandsübergänge Zustände
I
I
I
Ein Zustandsübergang findet statt, wenn ein auslösendes Ereignis eintritt oder eine bestimmte Bedingung erfüllt ist. Bei einem Zustandsübergang verändern sich Attributwerte oder auch das Verhalten des Objektes. Das Objekt kann bei einem Zustandsübergang auch ausgelöste Aktionen ausführen.
Beispiel I Wenn wir dem Taxifahrer nach der Fahrt Geld geben (Ereignis) und der Betrag zu hoch ist (Bedingung), wechselt er (ausgelöste Aktion). I Dabei ändert sich sowohl der Grad seiner Zufriedenheit (ein Attributwert) als auch sein Verhalten: Er lässt uns nun aussteigen.
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
9.2 Zustände
info10 – OOP Markus Schlager
Zustände
Zustandsmodelle Zustandsübergänge Zustände
I
I
Ein Zustand eines Objektes ist durch die Werte all seiner Attribute festgelegt und durch ein spezifisches Verhalten des Objektes charakterisiert. Ein Zustand ist eine Situation im Leben eines Objektes, während der eine bestimmte Bedingung erfüllt ist, ausgelöste Aktionen ausgeführt werden oder auf ein auslösendes Ereignis gewartet wird.
Beispiele I Ein Taxi ist frei oder besetzt. I Der Taxifahrer ist am Warten oder unterwegs. I Außerdem ist er heute so gut gelaunt, dass er uns sogar seine wahre Schuhgröße verrät, wenn wir ihm eine Leberkäsesemmel mitbringen.
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
9.2 Zustände
info10 – OOP Markus Schlager
Anfangs- und Endzustände
Zustandsmodelle Zustandsübergänge Zustände
I
I
Zu Beginn seines Lebenszyklus befindet sich ein Objekt in einem klar definierten Anfangszustand. Endzustände eines Objektes sind Zustände, aus denen keine Übergänge mehr herausführen.
Automaten Einfachstes Beispiel – der Lichtschalter Zustandsdiagramme Modellierung eines CD-Spielers Modellierung eines Münztelephons endliche Automaten Zustandstabellen Noch einmal der CD-Spieler Kara
Beispiele I Anfangs ist ein Tropfen immer frisch. I Lässt man einen Tropfen in Ruhe, ist er am Ende verschwunden. I Erwischt ihn der Käfer rechtzeitig, endet der Tropfen in einem von zwei anderen möglichen Endzuständen: frisch konserviert oder alt konserviert.
Zustandsmodellierung Unit-Tests
info10 – OOP
9.3 (Endliche) Automaten
Markus Schlager
I
Beispiele für Automaten I I I I
Geldautomat Getränkeautomat Münztelephon Waschmaschine
Zustandsmodelle I
CD-Spieler
I
Lichtschalter
I
...
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
I
Typische Merkmale eines Automaten I I I
I
Eingaben möglich (z.B. Tastendruck, Geldeinwurf) führt Aktionen aus (z.B. Wechselgeldausgabe) wartet in einem Zustand auf Ereignisse (z.B. Telephon während des Freizeichens) prüft Bedingungen (z.B. Wecker, ob der Klang aktiviert ist und die Uhrzeit passt)
Zustandsmodellierung Unit-Tests
Einfachstes Beispiel – der Lichtschalter
info10 – OOP Markus Schlager Zustandsmodelle Zustandsübergänge Zustände Automaten Einfachstes Beispiel – der Lichtschalter
drücken
Licht aus
drücken
Zustandsdiagramme
Licht an
Modellierung eines CD-Spielers Modellierung eines Münztelephons endliche Automaten Zustandstabellen Noch einmal der CD-Spieler Kara Zustandsmodellierung Unit-Tests
I
Zwei Zustände: ‚Licht aus‘ bzw. ‚Licht an‘
I
Ein Zustand wird als Startzustand gekennzeichnet.
I
Geeignete Zustände werden als Endzustände gekennzeichnet.
I
Durch ein Ereignis (z.B. eine Eingabe) geht ein Zustand in einen anderen über.
9.5 Zustandsübergangsdiagramme
info10 – OOP Markus Schlager
Symbole in Zustandsübergangsdiagrammen
Zustandsmodelle Zustandsübergänge Zustände Automaten
Zustand
Einfachstes Beispiel – der Lichtschalter Zustandsdiagramme Modellierung eines CD-Spielers
Startzustand
Modellierung eines Münztelephons endliche Automaten Zustandstabellen Noch einmal der CD-Spieler Kara Zustandsmodellierung
Endzustand Zustandsübergang auslösendes Ereignis [Bedingung] / ausgelöste Aktion
Unit-Tests
info10 – OOP
9.6 Modellierung eines CD-Spielers
Markus Schlager Zustandsmodelle
Spulen
Zustandsübergänge Zustände Automaten
standby
Einfachstes Beispiel – der Lichtschalter Zustandsdiagramme Modellierung eines CD-Spielers
D einlegen ower power play[voll] fwd,rwd
Modellierung eines Münztelephons
spielbereit
endliche Automaten Zustandstabellen Noch einmal der CD-Spieler
power stop ower time eject [leer] out] CD-Ende] fwd,rwd /pause wirf CD aus
Kara Zustandsmodellierung
Abspielen
aus
Pause
Unit-Tests
9.7 Modellierung eines Münztelephons
info10 – OOP Markus Schlager 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
9.8 Automaten aus Sicht der Informatik
info10 – OOP Markus Schlager
Endlicher, deterministischer Automat M
Zustandsmodelle Zustandsübergänge Zustände Automaten Einfachstes Beispiel – der Lichtschalter
M = (Z, E, A, δ, z0 , F) Z: eine endliche, nichtleere Menge von Zuständen E: das Eingabealphabet (Ereignisse und Bedingungen) A: das Ausgabealphabet (ausgelöste Aktionen) z0 : ein (der!) Startzustand F: die Menge der zulässigen Endzustände (F ⊆ Z) δ: die Zustandsübergangsfunktion
Zustandsdiagramme Modellierung eines CD-Spielers Modellierung eines Münztelephons endliche Automaten Zustandstabellen Noch einmal der CD-Spieler Kara Zustandsmodellierung Unit-Tests
info10 – OOP
9.9 Zustandsübergangstabellen
Markus Schlager
Zustandsübergangsfunktion
Zustandsmodelle Zustandsübergänge Zustände Automaten Einfachstes Beispiel – der Lichtschalter
δ : Z×E → Z×A
Zustandsdiagramme
(z, e) 7→ (z 0 , a)
Modellierung eines CD-Spielers Modellierung eines Münztelephons endliche Automaten
I
Jeder möglichen Kombination aus Zustand und Eingabezeichen gibt es genau eine Kombination aus Übergang zu einem Folgezustand und Ausgabzeichen.
I
Der gezeichnete Automat muss also vollständig sein!
I
Oft stellt man δ in einer Zustandsübergangstabelle dar: aktueller Zustand z
Eingabe e
Ausgabe a
Folgezustand z0
Zustandstabellen Noch einmal der CD-Spieler Kara Zustandsmodellierung Unit-Tests
9.10 Noch einmal der CD-Spieler
info10 – OOP Markus Schlager 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
9.11 Kara – auch ein Käfer
info10 – OOP Markus Schlager 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
9.12 Zustandsmodellierung
info10 – OOP Markus Schlager
vgl. PAETEC S. 33 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
9.13 Programmierung von Unit-Tests
info10 – OOP Markus Schlager 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
9.13 Programmierung von Unit-Tests
info10 – OOP Markus Schlager 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
info10 – OOP Markus Schlager Anhang Literatur Links About
Teil X Anhang
Überblick
info10 – OOP Markus Schlager
Grundkonzepte
Anhang Literatur Links
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
About
Gliederung
info10 – OOP Markus Schlager Anhang Literatur Links About
Anhang Literatur Links About this Document
10.1 Literatur I
info10 – OOP Markus Schlager
[All]
B. J. Allen-Conn, K. Rose Powerful Ideas in the Classromm Viewpoints Research Institute, Glendale (CA) 2003
[Bar] D. J. Barnes, M. Kölling Java lernen mit BlueJ Pearson Studium, München 20063 http://www.bluej.org/objects-first
[Bla] A. P. Black et al. Squeak by Example Square Bracket Associates, Kehrsatz 2008 http://SqueakByExample.org
[Bot] P. Bothner, W. Kähler S MALLTALK: Einführung in die objekt-orientierte Programmierung Vieweg, Braunschweig 1999 http://e-books.zfn.uni-bremen.de/e-book-SMALLTALK.html
Anhang Literatur Links About
10.1 Literatur II
info10 – OOP Markus Schlager
[Bra] J. Brauer Grundkurs Smalltalk Vieweg, Wiesbaden 20042 [Bri]
P. Brichzin et al. Informatik II Oldenbourg Schulbuchverlag, München 2008
[Brf] X. Briffault, S. Ducasse Squeak programmation Éditions Eyrolles, Paris 2002 [Bur] C. Burkert Smalltalk FAQ http://www.chrisburkert.de/download/smalltalk/chbuSmalltalkFAQ.pdf
[Dec] D. G. Deck Programando con Smalltalk Edit Lin Editorial, Madrid 2006 http://wiki.gnulinex.org/LibroProgramacionSmalltalk/10.
Anhang Literatur Links About
10.1 Literatur III
info10 – OOP Markus Schlager
[Duc] S. Ducasse Squeak: Learn Programming with Robots Springer, New York 2005 [Ehm] M. Ehmann et al. Informatik Bayern 10 DUDEN PAETEC Schulbuchverlag, Berlin 2008 [Gam] E. Gamma, R. Helm, R. Johnson, J. Vlissides Design Patterns Addison-Wesley, Boston 200326 http://st-www.cs.illinois.edu/users/patterns/DPBook/DPBook.html
[Gol] M. H. Goldwasser, D. Letscher Object-Oriented Programming in Python Pearson Prentice Hall, New Jersey 2008 http://www.prenhall.com/goldwasser http://www.cs1graphics.org
Anhang Literatur Links About
10.1 Literatur IV
info10 – OOP Markus Schlager
[Hub] P. Hubwieser et al. Informatik 3 Ernst Klett Verlag, Stuttgart 2008 [Lin] G. Lingl Python für Kids mitp-Verlag, Bonn 2003 http://python4kids.net
[Nie] O. Nierstrasz et al. Pharo by Example Square Bracket Associates, Kehrsatz 2009 http://PharoByExample.org
[Oes] B. Oesterreich Objektorientierte Softwareentwicklung Oldenbourg Verlag, München 20015 http://www.oose.de/uml
Anhang Literatur Links About
10.1 Literatur V
info10 – OOP Markus Schlager
[Scr] H. Schröder Squeak – Informatik in einer schönen Smalltalk-Umgebung
Anhang Literatur Links
http://www.od.shuttle.de/evb-1/squeakdoc/squeakdoc.html
[Sha] A. Sharp Smalltalk by Example Mc Graw-Hill, New York 1997 http://www.iam.unibe.ch/~ducasse/WebPages/FreeBooks.html
[Sie] K. Sierra, B. Bates Head First Java O’Reilly, Sebastopol (CA) 20052 http://www.headfirstlabs.com/books/hfjava/
[Swa] E. Schwass Squeak – ein Streifzug http://people.freenet.de/deckard73/page1.html
[Wei] M. Weigend Objektorientierte Programmierung mit Python mitp-Verlag, Bonn 2004
About
10.2 Links I
info10 – OOP Markus Schlager
I
Smalltalk [Sqd] http://www.squeak.de [Sql] http://www.squeakland.org [Squ] http://www.squeak.org [Smt] http://www.smalltalk.org [Ssw] http://wiki.squeak.org/squeak [Sjc] http://squeak.joyful.com/LanguageNotes [Sbe] http://squeakbyexample.org [Pha] http://www.pharo-project.org [Pbe] http://pharobyexample.org [Pca] http://book.pharo-project.org [Pre] http://squeak.preeminent.org/tut2007/html/
I
Python [Pyt] http://www.python.org
Anhang Literatur Links About
10.2 Links II
info10 – OOP Markus Schlager
[CS1] http://www.cs1graphics.org I
Java
Anhang Literatur Links
[Jav] http://www.java.com [Otj] http: //docs.oracle.com/javase/tutorial/java [BlJ] http://www.bluej.org [BlT] http://www.bluej.org/doc/tutorial.html [Jgt] http://www.ovtg.de/3_arbeit/informatik/ JGUIWeb/JGUIWebstart.html
About
About this Document
info10 – OOP Markus Schlager
I
I
I I
I
Dieses Dokument wurde mit dem Beamer-Paket mittels pdflatex in LATEX erzeugt. Für Quelltextlistings kam das Paket listings.sty mit Anpassungen für Smalltalk zum Einsatz. Struktogramme wurden mit Hilfe von StrukTEX erstellt. In den TEX-Quellen integrierte Diagramme sind PGF -Graphiken, die mit tikz.sty erzeugt wurden. Die dabei benutzte UML-Bibliothek stammt vom Autor dieses Dokumentes. Die übrigen Diagramme entstanden mit Dia und wurden als eps-Graphiken exportiert, mit epstopdf in pdf-Dateien umgewandelt und mittels \includegraphics in die LATEX-Quellen eingebunden.
Anhang Literatur Links About