Verfasst: Freitag 20. April 2007, 16:04
Naja, ein bisschen besser ist es schon, aber noch nicht perfekt.
Es wird wieder Code wiederholt und zwar die `join()`-Aufrufe mit den Einträgen. `self.menue_eintraege` ist ein Attribut das meiner Meinung nach zuviel ist. Das gehört nicht zum Zustand eines Menüs. Der ist mit `eingeklappt` und den Menütexten ausreichend definiert. Und `self.menue` ist auch nicht notwendig. Mal davon abgesehen, das ich in der `__init__()` das Menü nicht ausgeben würde, hätte ein ``print self`` völlig gereicht.
Also mal von vorne. Ein "klappbares" Menü braucht Daten und zwar die Menüpunkte und die Information ob es gerade ein- oder ausgeklappt ist. Die notwendigen Daten werden in der `__init__()`-Methode gesetzt.
Dann braucht ein Objekt noch "Verhalten" in Form von Methoden. Das Menü soll man ein- und ausgeklappen können, also je eine Methode dafür. Was man dabei nur ändern muss ist `self.eingeklappt` damit man jederzeit abfragen kann in welchem Zustand sich das Menü gerade befindet.
Und weil man das Menü auch ausgeben möchte, gibt's eine Funktion die aus den Informationen die den Zustand beschreiben eine Zeichenkette zusammenbaut. Das ist der einzige Teil wo wirklich etwas interessantes passiert.
Die Zeichenkette besteht aus der Kopfzeile an die die numerierten Menüpunkte angehängt werden. Wenn das Menü eingeklappt ist, dann wird dieser Vorgang nach dem dritten Punkt abgebrochen.
Wenn das Menü lang genug ist, um ein- oder ausgeklappt zu werden muss man jetzt entscheiden welcher der beiden Menüpunkte zum klappen angezeigt werden muss.
Zum Schluss noch der Beenden-Menüpunkt und die Fusszeile. Ergebnis:
Es wird wieder Code wiederholt und zwar die `join()`-Aufrufe mit den Einträgen. `self.menue_eintraege` ist ein Attribut das meiner Meinung nach zuviel ist. Das gehört nicht zum Zustand eines Menüs. Der ist mit `eingeklappt` und den Menütexten ausreichend definiert. Und `self.menue` ist auch nicht notwendig. Mal davon abgesehen, das ich in der `__init__()` das Menü nicht ausgeben würde, hätte ein ``print self`` völlig gereicht.
Also mal von vorne. Ein "klappbares" Menü braucht Daten und zwar die Menüpunkte und die Information ob es gerade ein- oder ausgeklappt ist. Die notwendigen Daten werden in der `__init__()`-Methode gesetzt.
Dann braucht ein Objekt noch "Verhalten" in Form von Methoden. Das Menü soll man ein- und ausgeklappen können, also je eine Methode dafür. Was man dabei nur ändern muss ist `self.eingeklappt` damit man jederzeit abfragen kann in welchem Zustand sich das Menü gerade befindet.
Und weil man das Menü auch ausgeben möchte, gibt's eine Funktion die aus den Informationen die den Zustand beschreiben eine Zeichenkette zusammenbaut. Das ist der einzige Teil wo wirklich etwas interessantes passiert.
Die Zeichenkette besteht aus der Kopfzeile an die die numerierten Menüpunkte angehängt werden. Wenn das Menü eingeklappt ist, dann wird dieser Vorgang nach dem dritten Punkt abgebrochen.
Wenn das Menü lang genug ist, um ein- oder ausgeklappt zu werden muss man jetzt entscheiden welcher der beiden Menüpunkte zum klappen angezeigt werden muss.
Zum Schluss noch der Beenden-Menüpunkt und die Fusszeile. Ergebnis:
Code: Alles auswählen
# -*- coding: utf-8 -*-
class Menue(object):
kopfzeile = '----------Menü-----------'
option_a = 'a für ausklappen'
option_e = 'e für einklappen'
option_E = 'E für Ende'
fusszeile = '-------------------------'
def __init__(self, eintraege, eingeklappt=True):
self.eintraege = eintraege
self.eingeklappt = eingeklappt
def __str__(self):
result = [self.kopfzeile]
for i, eintrag in enumerate(self.eintraege):
if self.eingeklappt and i > 2:
break
result.append('%d. %s' % (i + 1, eintrag))
if len(self.eintraege) > 2:
if self.eingeklappt:
result.append(self.option_a)
else:
result.append(self.option_e)
result.extend((self.option_E, self.fusszeile))
return '\n'.join(result)
def ausklappen(self):
self.eingeklappt = False
def einklappen(self):
self.eingeklappt = True
if __name__ == '__main__':
menue = Menue(('Umfang Rechteck',
'Fläche Rechteck',
'Umfang Dreieck',
'Fläche rechtwinkliges Dreieck',
'Umfang Kreis'))
print menue
menue.ausklappen()
print menue
menue.einklappen()
print menue