ich habe überlegt, wie man vielleicht eine Anwendung aufbauen könnte, die das MVC-Pattern (zumindest teilweise) umsetzen könnte und dabei eine Art Endlicher Automat (zumindest in Grundzügen) ist. Die "Idee" dahinter ist es, eine Art Grund-Engine für z.B. pygame-basierte Anwendungen zu schreiben. Dabei werden verschiedene "Zustände der Anwendung" (z.B. das Hauptmenü des Spiels, ein Spiel-Laden-Menü, ein Karteneditor usw. als eigenständige Zustände) von einander getrennt und bei in Grundzügen das MVC-Pattern verfolgt. Genau genommen meine ich damit lediglich die Teilung in Model, View und Controller - ohne ein Observer-Pattern usw. zu realisieren. Ich hoffe mein Ziel ist verständlich formuliert

Hier mal ein Code-Schnippsel mit den Überlegungen:
Code: Alles auswählen
class Application(object):
''' Eine Art State Machine, die den aktuellen Zustand der Anwendung enthält (z.B. Hauptmenü). '''
def __init__(self, starting_state):
''' Initialisiert die State Machine mit einem Anfangszustand.
@param starting_state: Objekt eines Zustands (class State) '''
self.state = starting_state
self.next_state = None
def set_state(self, next_state):
''' Merkt sich den Zustand, der beim nächsten Tick eingenommen wird
@param next_state: Objekt eines Zustands (class State) '''
self.next_state = next_state
def tick(self):
''' Haupt-Logik '''
# hier könnte z.B. ein pygame-Display geleert werden
if self.next_state:
# switch to next state
self.state = self.next_state
self.next_state = None
if self.state:
# do state's model stuff
self.state.model.tick()
# do state's view stuff
self.state.view.tick()
# handle state's controller stuff
self.state.tick()
# und hier könnte z.B. ein pygame-Display geflippt werden
class State(object):
''' Ein Zustand, den die State Machine annehmen kann. Diese Klasse repräsentiert den Controller. '''
def __init__(self, model, view):
''' Initialisiert einen Zustand mit zugehörigen Model+ und View-Objekten
@param model: Objekt für Datenmodell (class BaseModel)
@param view: Objekt für Datenrepräsentation (class BaseView) '''
self.model = model
self.view = view
def tick(self):
''' Haupt-Logik - sollte von Unterklasse überschrieben werden '''
pass
class BaseModel(object):
''' Enthält alle Daten und Manipulationsmethoden für diese, z.B. setFoo, getBar, addCounter. '''
pass
class ViewModel(object):
''' Enthält alle Objekte, die für die Repräsentation der Daten verantwortlich sind, und entsprechende Methoden um diese zu manipulieren.
Beispielsweise verschiedene pygame.sprite.Sprite-Objekte und Methoden wie moveObject oder focusButton. '''
pass
LG Glocke