Der Programmrumpf
Das Programmiergerüst entwickeln
Bevor wir uns den etwas schwierigeren Programmierteilen wie der Implementierung der Gebrauchsanweisung widmen, wollen wir aus dem zuvor entwickelten Klassendiagramm das Programmiergerüst entwickeln. Dies wollen wir an einem Beispiel der Klasse Player verdeutlichen:
Die Methoden/Funktionen und Attribute finden wir bereits in unserer Klassenbeschreibung.
Den Rumpf dieser Methoden in Python zu implementieren, ist nur noch 'Handwerkszeug':
Eine Get-Methode liefert ein bestimmtes Attribut der Klasse zurück (hier das Namensattribut):
def getName(self):
return self.__name
Eine Set-Methode verändert den Wert eines bestimmten Attributes (hier das Namensattribut):
def setName(self,name):
self.__name = name
Detaillierte Erklärungen zum Fachkonzept 'Datenkapselung' mit Getter/Setter Methoden findest du hier. Die restlichen Methoden lassen wir zunächst einmal unberührt und füllen sie später mit Leben.
Immer wenn man ein Objekt (bspw. 'player1') einer Klasse (bspw. 'Player') erzeugt, wird implizit die sogenannte 'Konstruktor'-Methode aufgerufen, die uns dann ein solches Objekt erzeugt und es in die Variable 'player1' schreibt. In Python heißt die Konstruktor Methode '__init__'. In der Player-Klasse initialisiert der Konstruktor nur die Attribute, die im Klassendiagramm aufgelistet sind. Da ein Spieler einen Namen, eine ID und einen Spielmodus hat, benötigen wir auch diese Parameter im Konstruktor. Damit sieht unsere Klasse im UML Diagramm wie folgt aus:
In Python implementiert sieht der Konstruktor dann so aus:
def __init__(self, name, playerID,gameMode):
self.__name = name
self.__playerID = playerID
self.__gameMode = gameMode
Neben den drei oben bereits erwähnten Parameter 'name', 'playerID' und 'gameMode', steht als
erster Parameter die Referenz 'self'. In Python ist dies Konvention für Klassenmethoden. Diese
haben die Besonderheit gegenüber gewöhnlichen Funktionen - sie müssen einen zusätzlichen ersten
Namen haben, der am Beginn der Parameterliste hinzugefügt wird. Diese spezielle Variable repräsentiert
das Objekt selbst, und es ist Konvention, ihr den Namen self zu geben.
Danach werden den entsprechenden Attributen im Objekt - gekennzeichnet mit 'self.__' - die übergegebenen Werte zugewiesen.
Muss der Konstruktor nichts tun, bspw. da es keine Attribute in einer Klasse gibt, muss er auch nicht als
Programmrumpf implementiert werden. Python ruft dann automatisch einen 'leeren' Konstruktor auf.
Aufgabe 1
Ergänze das Klassendiagramm mit den Konstruktoren wie in der Playerklasse.
(Hinweis: Überlege dir zunächst, ob in den Klassen 'GUI' und 'Ruleset' etwas getan werden muss)
Aufgabe 2
Erstelle den Programmrumpf für die Klassen 'Ruleset', 'GUI' und 'Field': Den Code der entsprechenden Konstruktoren werden wir bei den Klassen selbst erstellen; die Getter/Setter Methoden musst du erstellen.
Aufgabe 3
Implementiere nun zuletzt den Rumpf für die 'Spielraum-Klasse' 'FourWinsGame'. Beachte im Klassendiagramm, welche Objekte im Konstruktor erstellt werden müssen!Quellen
- [1]: UML-Diagramm1 Player - Urheber: SD BRI - Lizenz: inf-schule.de
- [2]: UML-Diagramm2 Player - Urheber: SD BRI - Lizenz: inf-schule.de