The before code allows changing order states without checks, risking invalid flows. The after code defines allowed transitions and enforces them, preventing invalid state changes and making order processing safer and clearer.
### Before: No state machine, direct state changes without checks
class Order:
def __init__(self):
self.state = 'Created'
def pay(self):
self.state = 'Paid'
def ship(self):
self.state = 'Shipped'
def deliver(self):
self.state = 'Delivered'
### After: Using state machine to enforce valid transitions
class OrderStateMachine:
allowed_transitions = {
'Created': ['Paid', 'Canceled'],
'Paid': ['Shipped', 'Canceled'],
'Shipped': ['Delivered', 'Canceled'],
'Delivered': ['Returned'],
'Canceled': [],
'Returned': []
}
def __init__(self):
self.state = 'Created'
def transition(self, new_state):
if new_state in self.allowed_transitions[self.state]:
self.state = new_state
else:
raise Exception(f"Invalid transition from {self.state} to {new_state}")
def pay(self):
self.transition('Paid')
def ship(self):
self.transition('Shipped')
def deliver(self):
self.transition('Delivered')
def cancel(self):
self.transition('Canceled')
def return_order(self):
self.transition('Returned')