Objektorientierte Modellierung und Programmierung

info10 – OOP Markus Schlager Objektorientierte Modellierung und Programmierung Einführung im Informatikunterricht der 10. Klasse Markus Schlager Gym...
5 downloads 3 Views 6MB Size
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



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



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