PyDay: Kaffee kochen

KaffeemaschineNun sind eine Menge Vorbereitungen erledigt und wir haben einiges über das organisatorische Umfeld unseres Projektes gelernt. Jetzt soll es darum gehen, die Kernfunktionalität unserer Kaffeemaschine auszuweiten und vor allem diese mit unserer Kommandozeile in der Routine main() zu verbinden.

Dazu werden wir zunächst unsere Klasse Kocher etwas aufbohren und parallel natürlich die zugehörigen Unittests programmieren.

Wie bereits zu Beginn erläutert, definiert unsere Kommandozeilenschnittstelle (siehe die Funktion parse_command_line im Modul kaffeemaschine.py) zwei Parameter, die die Menge und die Sorte entgegennehmen. Ferner sind dort bereits Standardwerte hinterlegt, die immer dann greifen, wenn der Gast sich nicht für etwas bestimmtes entschieden hat. Denkbar wäre es natürlich, diese (oder andere) Standardwerte auch in der Kocher-Klasse zu hinterlegen, doch ich halte dies nicht für sinnvoll. Ich finde, die Klasse sollte mit konkreten Werten bestückt werden, welche sie im Constructor entgegen nimmt und in lokalen Variablen speichert. Zusätzlich setzt sie noch einen Merker für den Zustand “fertig” auf den Initialwert “False”.

def __init__(self, sorte, menge):
    self._sorte = sorte
    self._menge = menge
    self._fertig = False

Das ist soweit schön, aber damit kann noch kein Kaffee gekocht werden. Das wollen wir nun ergänzen.

Zunächst bekommt der Kocher eine Funktion spendiert, die kochen kann. Vorerst geht das recht flott, später folgt da noch eine kleine Ergänzung:

def aufbruehen(self):
    '''
    Dies ist die Funktion, die für das Aufbrühen des Kaffees verantwortlich ist.
    '''
    print('Brühe Kaffee ...\n   Sorte: {sorte}\n   Menge: {menge} l'.format(sorte = self._sorte, menge = self._menge))
    self._status_fertig = True

Dann kommen noch ein paar Properties, damit gewisse Eigenschaften nur gelesen werden können:

@property
def fertig(self):
    '''
    Der Getter liefert den aktuellen Status zurück.
    '''
    return self._status_fertig

@property
def sorte(self):
    '''
    Der Getter liefert die aktuelle Sorte zurück.
    '''
    if self.fertig:
        return self._sorte
    else:
        return None

@property
def menge(self):
    '''
    Der Getter liefert in Abhängigkeit des Status entweder die verfügbare Menge oder nichts.
    '''
    if self.fertig:
        return self._menge
    else:
        return None

Das ist der Stand in Changeset 1794186. Es folgen die Unittests (Changeset 1a42a8c).

Nun müssen wir nur noch die Kocher-Klasse in der main-Routine instanzieren und ihre Methoden entsprechend aufrufen:

kocher = Kocher(args.sorte, args.menge)
kocher.aufbruehen()
if kocher.fertig:
    print('Der Kaffee ist fertig!')

Wie das genau gehen kann, erfährst du in Changeset 6a800bb. Die einzelnen Schritte sind in Mercurial ebenfalls dokumentiert. Aber probiere es ruhig vorher mal selbst aus.

Ähnliche Artikel:

1 Kommentar

  1. Die Changesets sind nun ebenfalls auf Bitbucket verfügbar.

Schreibe einen Kommentar

Deine Email-Adresse wird nicht veröffentlicht.

2 × vier =