# **OOD筆記(Library Management System - 圖書管理系統)**
日期 : 2024/10/12
### **設計**
這個系統需要支持以下需求:
書籍管理:新增、刪除、查找書籍。
借閱和歸還書籍:會員可以借書和歸還書。
會員管理:系統能管理會員的資料和借閱記錄。
限制:每位會員一次只能借一定數量的書籍,例如最多 5 本。
書籍的狀態:書籍可以是「已借出」或「可借閱」
### **實作**
```python
from enum import Enum
from typing import List, Dict
class BookStatus(Enum):
AVAILABLE = 1
BORROWED = 2
```
```python
class Book:
def __init__(self, book_id: str, title: str, author: str):
self.book_id = book_id
self.title = title
self.author = author
self.status = BookStatus.AVAILABLE
def is_available(self) -> bool:
return self.status == BookStatus.AVAILABLE
```
```python
class Member:
def __init__(self, member_id: str, name: str):
self.member_id = member_id
self.name = name
self.borrowed_books: List[Book] = []
def borrow_book(self, book: Book) -> bool:
if len(self.borrowed_books) >= 5:
print(f"{self.name} has already borrowed the maximum number of books.")
return False
if book.is_available():
book.status = BookStatus.BORROWED
self.borrowed_books.append(book)
return True
return False
def return_book(self, book: Book) -> bool:
if book in self.borrowed_books:
book.status = BookStatus.AVAILABLE
self.borrowed_books.remove(book)
return True
return False
```
```python
class Library:
def __init__(self):
self.books: Dict[str, Book] = {}
self.members: Dict[str, Member] = {}
def add_book(self, book: Book):
self.books[book.book_id] = book
def remove_book(self, book_id: str):
if book_id in self.books:
del self.books[book_id]
def find_book(self, title: str) -> List[Book]:
book_list = []
for book in self.books.values():
if book.title.lower() == title.lower():
book_list.append(book)
return book_list
def add_member(self, member: Member):
self.members[member.member_id] = member
def borrow_book(self, book_id: str, member_id: str) -> bool:
if book_id in self.books and member_id in self.members:
book = self.books[book_id]
member = self.members[member_id]
return member.borrow_book(book)
return False
def return_book(self, book_id: str, member_id: str) -> bool:
if book_id in self.books and member_id in self.members:
book = self.books[book_id]
member = self.members[member_id]
return member.return_book(book)
return False
```
---
### **測試**
```python
if __name__ == "__main__":
library = Library()
# 新增書籍
book1 = Book("1", "Harry Potter", "J.K. Rowling")
book2 = Book("2", "The Hobbit", "J.R.R. Tolkien")
library.add_book(book1)
library.add_book(book2)
# 新增會員
member = Member("1001", "Alice")
library.add_member(member)
# 借閱書籍
if library.borrow_book("1", "1001"):
print(f"{member.name} borrowed {book1.title}")
# 嘗試借同一本書
if not library.borrow_book("1", "1001"):
print(f"{book1.title} is already borrowed.")
# 歸還書籍
if library.return_book("1", "1001"):
print(f"{member.name} returned {book1.title}")
```
```
Alice borrowed Harry Potter
Harry Potter is already borrowed.
Alice returned Harry Potter
```
---
### **Data Flows**
```
新增書籍和會員:
- 書籍和會員的資料通過 Library.add_book 和 Library.add_member 進入系統。
借閱流程:
- 當會員借書時,系統會檢查書籍是否可借(Book.is_available)
- 若可借,系統更新書籍狀態為 BORROWED,並將該書加入會員的借閱列表
歸還流程:
- 歸還時,系統檢查該會員是否已借過此書。
- 若已借,書籍狀態更新為 AVAILABLE,並從會員借閱列表中移除。
```
---
### **UML 類圖**
```
+------------------------+
| Library |
+------------------------+
| - books: List[Book] |
| - members: List[Member] |
+------------------------+
| + add_book(book: Book): void |
| + remove_book(book_id: str): void|
| + find_book(title: str): List[Book] |
| + borrow_book(book_id: str, member_id: str): bool |
| + return_book(book_id: str, member_id: str): bool |
+------------------------+
+------------------------+
| Book |
+------------------------+
| - book_id: str |
| - title: str |
| - author: str |
| - status: BookStatus |
+------------------------+
| + is_available(): bool |
+------------------------+
+------------------------+
| Member |
+------------------------+
| - member_id: str |
| - name: str |
| - borrowed_books: List[Book] |
+------------------------+
| + borrow_book(book: Book): bool |
| + return_book(book: Book): bool |
+------------------------+
+------------------------+
| BookStatus |
+------------------------+
| AVAILABLE |
| BORROWED |
+------------------------+
```
---
### **細節**
**講解連結**
Provided by.