The before code mixes all data in dictionaries without clear structure, making it hard to manage. The after code defines User, Group, and Expense classes to organize data clearly. Group ensures only members can pay or participate in expenses, improving data integrity and maintainability.
### Before: No clear structure, all data mixed
expenses = [
{"payer": "Alice", "amount": 100, "participants": ["Bob", "Charlie"]},
{"payer": "Bob", "amount": 50, "participants": ["Alice"]}
]
# No clear user or group representation
### After: Using User, Group, Expense classes
from typing import List
class User:
def __init__(self, user_id: int, name: str):
self.user_id = user_id
self.name = name
class Expense:
def __init__(self, expense_id: int, amount: float, paid_by: User, participants: List[User]):
self.expense_id = expense_id
self.amount = amount
self.paid_by = paid_by
self.participants = participants
class Group:
def __init__(self, group_id: int, name: str, members: List[User]):
self.group_id = group_id
self.name = name
self.members = members
self.expenses: List[Expense] = []
def add_expense(self, expense: Expense):
if expense.paid_by not in self.members:
raise ValueError("Payer must be a group member")
for participant in expense.participants:
if participant not in self.members:
raise ValueError("All participants must be group members")
self.expenses.append(expense)
# Example usage
alice = User(1, "Alice")
bob = User(2, "Bob")
charlie = User(3, "Charlie")
friends = Group(1, "Friends", [alice, bob, charlie])
expense1 = Expense(1, 100.0, alice, [bob, charlie])
expense2 = Expense(2, 50.0, bob, [alice])
friends.add_expense(expense1)
friends.add_expense(expense2)