Problem Statement
When designing a library management system, poor class design leads to tightly coupled code, making it hard to maintain or extend. Without clear responsibilities, classes become bloated or overlap, causing bugs and confusion.
┌─────────┐ ┌───────────┐ ┌────────────┐ ┌─────────┐
│ Member │──────▶│ Loan │◀──────│ Book │ │Librarian│
└─────────┘ └───────────┘ └────────────┘ └─────────┘
│ ▲
│ │
└────────────────────────────────────────────────────────┘This diagram shows the relationships: Members borrow Books via Loans, Librarians manage the system, and Loans connect Members and Books.
### Before: Poor class design with mixed responsibilities class Library: def __init__(self): self.books = [] self.members = [] self.loans = [] def add_book(self, book): self.books.append(book) def add_member(self, member): self.members.append(member) def loan_book(self, book, member): if book.available: book.available = False self.loans.append({'book': book, 'member': member}) ### After: Clear class design with responsibilities separated class Book: def __init__(self, title, author): self.title = title self.author = author self.available = True class Member: def __init__(self, name): self.name = name self.loans = [] class Loan: def __init__(self, book, member): self.book = book self.member = member self.active = True book.available = False member.loans.append(self) class Librarian: def __init__(self, name): self.name = name def loan_book(self, book, member): if book.available: return Loan(book, member) else: return None