Erarbeitung — Verwaltung von Bankkonten
Entwurf zur Erprobung von OOPython. Grundlage ist die Seite Einstieg — Verwaltung von Bankkonten. Der Text bis Aufgabe 1 ist unverändert; ab „Softwareobjekt in Aktion“ ist die Erarbeitung so umgebaut, dass sie im Werkzeug stattfindet statt in einem lokalen Python-Editor — erst mit der Maus, dann im Code-Pad, zuletzt im Quelltext.
Objektorientiert modellieren
Hast du bereits ein eigenes Konto? Hast du schon einmal einen Kontoauszug gesehen? Wenn nicht, dann schau dir den folgenden Kontoauszug erst einmal genauer an. Welche Informationen werden dargestellt? Welche Daten müssen folglich von dem zu entwickelnden System verwaltet werden?
Wenn man ein Verwaltungssystem für einen bestimmten Weltausschnitt (wie eine Bank) entwickeln möchte, dann muss man den Weltausschnitt erst einmal analysieren: Welche Objekte sind im betrachteten Weltausschnitt wichtig? Welche Eigenschaften haben diese Objekte? Im Kontext Bank spielen Konten eine zentrale Rolle - mit ihrer Hilfe wird schließlich das Geld der Bankkunden verwaltet. Konten können also als wichtige Objekte des betrachteten Weltausschnitts angesehen werden. Ein Bankkonto hat eine bestimmte Kontonummer und einen Kontoinhaber. Ein Bankkonto hat zudem einen bestimmten Stand - das ist der Geldbetrag, der aktuell auf dem Konto verfügbar ist. Von einem Bankkonto kann man Geldbeträge auszahlen, auf ein Bankkonto kann man auch Geldbeträge einzahlen.
So, wie die zu beschreibende Welt aus Objekten besteht, soll auch das Verwaltungssystem aus Softwareobjekten aufgebaut werden. Ein Konto-Softwareobjekt soll die beiden vorerst relevanten Daten eines Kontos - Kontonummer und Kontostand - verwalten. Der Inhaber ist sicher auch wichtig, soll zunächst aber noch keine Rolle spielen. Das folgende Diagramm veranschaulicht den Aufbau eines Konto-Softwareobjekts.
Das Softwareobjekt hat hier den Namen konto. Sein Zustand wird durch die Werte der
benutzten Variablen nr und stand festgelegt.
Wir gehen zudem davon aus, dass ein Konto-Softwareobjekt folgende Operationen ausführen kann:
- einen Betrag einzahlen
- einen Betrag auszahlen
Das folgende Ablaufprotokoll zeigt exemplarisch, wie sich solche Operationen auf den aktuellen Zustand des Konto-Softwareobjekts auswirken:
Im Ablaufprotokoll werden auch schon spezielle Schreibweisen für das Ausführen von Operationen benutzt:
-
konto.einzahlen(...): Das Softwareobjektkontoerhöht den Kontostand um den übergebenen Betrag. -
konto.auszahlen(...): Das Softwareobjektkontoverringert den Kontostand um den übergebenen Betrag.
Aufgabe 1
Ergänze die fehlenden Zustandsbeschreibungen bzw. Operationen:
{konto: nr -> 234126, stand -> 2380.0, inhaber -> ...}
konto.auszahlen(450.0)
{konto: nr -> 234126, stand -> 1930.0, inhaber -> ...}
konto.einzahlen(1000.0)
?
?
{konto: nr -> 234126, stand -> 2130.0, inhaber -> ...}
Softwareobjekt in Aktion
Ein Konto-Softwareobjekt muss - wie in der realen Welt - erst einmal erzeugt werden, bevor es in Aktion treten kann. Hierzu wird ein Bauplan benötigt. In Python heißt ein solcher Bauplan Klasse.
Im folgenden Werkzeug steht ein Bauplan Konto schon bereit — als Kasten im
Klassendiagramm links. Wie der Bauplan im Inneren aussieht, schauen wir uns später an;
zuerst benutzen wir ihn:
- Über das Menü ▾ am Klassenkasten erzeugst du mit Neues Objekt … ein Konto-Objekt. Das Werkzeug fragt dich nach der Kontonummer.
- Das Objekt erscheint als Karte auf der . Über das Menü der Karte rufst du seine Operationen auf.
- Ein Doppelklick auf die Karte öffnet den : Er zeigt den Zustand des Objekts, also die Werte von
nr,standundinhaber. - Der zeigt zu jedem Klick, wie dieselbe Aktion in Python geschrieben wird.
data-config dieses Werkzeugs
{
"titel": "Konto — Objekte erzeugen und benutzen",
"profil": "zustand-verstehen",
"detailtiefe": "namen",
"dateien": "konto.py"
}Aufgabe 2
(a) Erzeuge ein Objekt konto mit der Kontonummer 234126. Öffne den .
Welche Werte haben nr, stand und inhaber direkt nach dem Erzeugen?
Vergleiche mit dem Objektdiagramm oben.
(b) Spiele das Ablaufprotokoll nach: Zahle zuerst 2380.0 ein, dann führe die Operationen aus dem Ablaufprotokoll aus. Prüfe nach jeder Operation im , ob der Kontostand mit dem Protokoll übereinstimmt.
(c) Der hat für jeden deiner Klicks eine Zeile Python geschrieben. Schreibe diese Zeilen untereinander ab. Was steht vor dem Punkt, was dahinter? Wo taucht die Kontonummer auf, wo der Betrag?
(d) Erzeuge ein zweites Objekt konto2 mit einer anderen Kontonummer und zahle etwas ein.
Ändert sich dadurch der Kontostand von konto? Erkläre.
Vom Klicken zum Tippen
Was du gerade mit der Maus erledigt hast, lässt sich genauso als Text an Python schicken. Ein solcher
Python-Dialog sieht so aus — jede Zeile mit >>> ist eine Eingabe, die Zeile
darunter die Antwort von Python:
>>> konto = Konto(234126)
>>> konto.nr
234126
>>> konto.stand
0.0
>>> konto.stand = 2380.0
>>> konto.stand
2380.0
>>> konto.auszahlen(450.0)
>>> konto.stand
1930.0
>>> konto.einzahlen(1000.0)
>>> konto.stand
2930.0
>>> konto.auszahlen(800.0)
>>> konto.stand
2130.0
Die Zeilen, die du in Aufgabe 2 (c) abgeschrieben hast, kommen hier alle wieder vor. Neu sind zwei
Dinge: Mit konto.stand fragt man einen Wert ab, und mit konto.stand = 2380.0
setzt man ihn direkt — das ging mit der Maus nicht.
Das folgende Werkzeug hat dafür ein Code-Pad: Was du dort eintippst, wird an Python geschickt. und zeigen die Wirkung genauso wie beim Klicken, und rechts liegt der Quelltext des Bauplans zum Lesen.
data-config dieses Werkzeugs
{
"titel": "Konto — vom Klicken zum Tippen",
"profil": "zustand-verstehen",
"codepad": true,
"quelltextAnzeigen": true,
"dateien": "konto.py"
}Aufgabe 3
(a) Tippe den Python-Dialog von oben Zeile für Zeile in das Code-Pad ein. Beobachte nach jeder Zeile die und den .
(b) Erzeuge mehrere Konto-Objekte:
>>> k1 = Konto(5)
>>> k1.einzahlen(1000.0)
>>> k2 = Konto(8)
>>> ...
Überweise mit passenden Operationen 500.0 (Euro) vom Konto mit der Kontonummer 5 auf das Konto mit der Kontonummer 8. Du kannst wahlweise klicken oder tippen — der zeigt in beiden Fällen dieselben Zeilen.
(c) Schreibe das Ablaufprotokoll zur Überweisung aus (b) in der Schreibweise von Aufgabe 1 auf.
Der Bauplan
Die folgende Python-Klassendeklaration ist der Bauplan, den du die ganze Zeit benutzt hast. Im Werkzeug oben steht er rechts unter .
class Konto(object):
def __init__(self, nummer):
self.nr = nummer
self.stand = 0.0
self.inhaber = None
def einzahlen(self, betrag):
self.stand = self.stand + betrag
def auszahlen(self, betrag):
self.stand = self.stand - betrag
Du wirst vermutlich erst einmal nicht alle Details dieser Klassendeklaration verstehen. Das macht gar nichts.
Einiges erkennst du aber wieder: die Namen nr, stand und inhaber
aus dem , die Operationen einzahlen und auszahlen aus dem Menü der
Objektkarte, und den Parameter nummer, nach dem das Werkzeug beim Erzeugen gefragt hat.
Aufgabe 4
(a) Die Zeile self.stand = 0.0 legt fest, welchen Wert stand direkt nach dem
Erzeugen hat. Welche Zeile legt den Wert von nr fest? Woher kommt dieser Wert?
(b) In welcher Zeile wird der Kontostand erhöht? Erkläre, was self.stand = self.stand + betrag
mit dem Ablaufprotokoll aus Aufgabe 1 zu tun hat.
Zusatz: Vom Dialog zum Programm — und den Bauplan verändern
Das folgende Werkzeug hat zwei Editoren. Im stehen die Zeilen aus Aufgabe 3 untereinander; Starten führt sie auf einen Schlag aus, so wie ein Programm, das ohne dich läuft. Im Editor steht der Bauplan: Änderst du ihn, folgt das Klassendiagramm sofort, mit Ausführen gilt der neue Bauplan für alle Objekte, die du danach erzeugst.
data-config dieses Werkzeugs
{
"titel": "Konto — den Bauplan verändern",
"hauptprogramm": "main.py",
"profil": "selbst-programmieren",
"laden": "klick",
"dateien": "konto.py"
}Aufgabe 5 (Zusatz)
(a) Im fehlt die Überweisung aus Aufgabe 3. Ergänze die beiden Zeilen und starte das Programm. Prüfe die Ausgabe: Konto 5 muss 500.0 zeigen, Konto 8 ebenfalls. Schau danach in das Protokoll „Was du geklickt hast, als Python“ — dort steht dein Programm als Block.
(b) Erzeuge mit der Maus ein drittes Konto und starte das Programm noch einmal, einmal mit und einmal ohne den Haken „Bisherige Objekte behalten“. Was passiert jeweils mit dem dritten Konto?
(c) Bisher bleibt inhaber immer None. Ändere den Bauplan so, dass beim Erzeugen
auch der Name des Inhabers angegeben wird. Prüfe mit einem neuen Objekt und dem Inspektor, ob es
klappt — und schau, wonach das Werkzeug beim Erzeugen jetzt fragt.
(d) Ergänze eine Operation kontostand_anzeigen, die den Kontostand mit print
ausgibt. Wo erscheint die Ausgabe?