The before code uses hardcoded string parsing and evaluation logic inside one class, making it hard to extend. The after code uses the Interpreter pattern by defining an abstract Expression class and concrete classes for numbers and operations. Each class knows how to interpret itself, making the system extensible and easier to maintain.
### Before: Without Interpreter Pattern (hardcoded evaluation)
class Evaluator:
def evaluate(self, expression):
if '+' in expression:
left, right = expression.split('+')
return int(left) + int(right)
elif '-' in expression:
left, right = expression.split('-')
return int(left) - int(right)
else:
return int(expression)
# Usage
expr = "3+5"
eval = Evaluator()
print(eval.evaluate(expr)) # Output: 8
### After: With Interpreter Pattern
from abc import ABC, abstractmethod
class Expression(ABC):
@abstractmethod
def interpret(self):
pass
class Number(Expression):
def __init__(self, value):
self.value = value
def interpret(self):
return self.value
class Add(Expression):
def __init__(self, left, right):
self.left = left
self.right = right
def interpret(self):
return self.left.interpret() + self.right.interpret()
class Subtract(Expression):
def __init__(self, left, right):
self.left = left
self.right = right
def interpret(self):
return self.left.interpret() - self.right.interpret()
# Client code to parse "3+5" into expression tree
left = Number(3)
right = Number(5)
expression = Add(left, right)
print(expression.interpret()) # Output: 8