Angenommen, ich den folgenden CodeAufrufen von Methoden mit Klasseninstanz als Argument in Python
IDLE = 0
STARTED = 1
STOPPED = 2
ERRORED = 3
# additional states as needed
class StateMachine:
def __init__(self)
self.state = IDLE
def start(self):
self.state = STARTED
# do something
def stop(self):
self.state = STOPPED
# do something
def reset(self):
self.state = IDLE
# do something
Unsere aktuellen Schnittstelle ermöglicht es einem Client zu ändern, um den Zustand einer Instanz durch Angabe der gewünschten Soll-Zustand haben, an welchem Punkt wir laufen bestimmte Validierungsprüfungen und dann die entsprechende Methode. Ich würde im Idealfall eine Wörterbuchzuordnung des gewünschten Zielzustands auf die richtige Methode beibehalten, um massive und sinnlose if-Anweisungsblöcke zu vermeiden. das heißt
if target_state = STARTED:
instance.start()
elif target_state = STOPPED:
instance.stop()
...
Aber ich bin unsicher, ob die folgende Lösung gute Praxis betrachtet wird oder nicht (es fühlt sich ein bisschen whacky calling Methoden aus der Klasse eine Instanz als arg verwenden).
state_mapping = {
IDLE: StateMachine.reset,
STARTED: StateMachine.start,
....
}
Und dann mit Aufruf:
action = state_mapping[target_state]
action(instance)
....
Irgendwelche Gedanken?
Haben Sie versucht, einen 'Lambda'-Ausdruck zu verwenden? –
Ich denke, die Lösung ist in Ordnung. Vielleicht sollten Sie eine Bankmarkierung in Betracht ziehen, um zu sehen, was zeiteffizienter ist. Wenn Effizienz keine Rolle spielt, sollte Lesbarkeit sein. Ich persönlich finde die 'if'' elif' 'elif'' else' Lösung lesbarer - auch wenn es ein wenig langweilig ist. – ChickenFeet
Es gibt einen weiteren Ansatz, bei dem es sich um eine StateMachine-Klasse und dann um eine Unterklasse für jeden Status handelt, z. B. StateMachineStopped, StateMachineStarted. Sie wechseln mit einem 'self .__ class__ = StateMachineStopped'-Ansatz hin und her. Siehe https://stackoverflow.com/questions/13280680/how-dangerous-is-setting-self-class-to-something-else/24643654#24463654 zum Beispiel. –