У цій статті ми розглянемо створення Системи Управління Бібліотекою (LMS) за допомогою Go, зосередившись на її основних функціях, рішеннях дизайну та ключових фрагментах коду. Незалежно від того, чи ви початківець, чи досвідчений розробник, цей посібник допоможе вам зрозуміти, як побудувати масштабовану та ефективну систему.
Основні функції системи управління бібліотекою
1. Управління книгами
Система підтримує кілька копій кожної книги, що дозволяє ефективно відслідковувати інвентар. Кожна книга має властивості, такі як ID, заголовок, автор, рік публікації та масив BookItem
, що представляє окремі копії.
type Book struct {
ID int
BookItem []BookItem
Title string
Author string
PublishedYear string
mu sync.RWMutex
}
2. Управління користувачами
Члени можуть позичати книги, а система відслідковує їх історію позик.
Кожен член має квоту на позики, щоб обмежити кількість книг, які він може позичити одночасно.
type Member struct {
ID int
Name string
ContactInfo string
CurrentBorrowed []*BookItem
BorrowHistory []*BookItem
}
3. Позика та повернення книг
Система перевіряє наявність доступних копій і оновлює їхній статус при позичанні або поверненні. Історія позик також оновлюється для кожного члена.
func (m *Member) AddBorrowedBook(bookItem *BookItem) {
m.CurrentBorrowed = append(m.CurrentBorrowed, bookItem)
}
func (l *Library) BorrowBookByMember(memberID int, bookID int) *BookItem {
// Логіка позичання книги
}
4. Контроль паралельного виконання
Використовуючи можливості паралельного виконання Go, система обробляє кілька запитів на позичання та повернення одночасно.
sync.RWMutex
забезпечує безпечне для потоків виконання операцій, запобігаючи виникненню гонок.
func (b *Book) IsBookAvailable() bool {
b.mu.RLock()
defer b.mu.RUnlock()
for _, bookCopy := range b.BookItem {
if bookCopy.Status == Available {
return true
}
}
return false
}
5. Управління простроченими книгами
Система перевіряє наявність прострочених книг, сповіщає членів і може накладати штрафи відповідно до бізнес-правил.
func (bi *BookItem) IsOverdue() bool {
if bi.Status != Borrowed {
return false
}
return time.Since(bi.LastBorrowed) > time.Hour*24*7
}
Рішення щодо дизайну
Чому Go?
Go був обраний за свою простоту, ефективність і вбудовану підтримку паралельного виконання, що є необхідним для обробки кількох запитів у бібліотечному середовищі.
Його сильна типізація та перевірки під час компіляції також зменшують кількість помилок і покращують підтримуваність коду.
Шаблон Singleton для екземпляра бібліотеки
Система використовує шаблон одиничного екземпляра (singleton) для управління єдиним екземпляром бібліотеки, централізуючи операції, такі як додавання книг і управління членами.
var (
libraryInstance *Library
once sync.Once
)
func GetLibraryInstance() *Library {
once.Do(func() {
libraryInstance = &Library{books: make(map[int]*Book), members: make(map[int]*Member)}
})
return libraryInstance
}
Інкапсуляція та захист даних
Мютекси (sync.RWMutex
) захищають спільні ресурси, забезпечуючи сталий стан у багатокористувацькому середовищі, де кілька членів взаємодіють з системою одночасно.
Ознайомлення з кодом
Для повної реалізації та можливості внести внесок у подальші покращення, перегляньте репозиторій на GitHub:
https://github.com/DmitriiKumancev/low-level-design-systems
Ця стаття є частиною 5-частинної серії з низькорівневого дизайну в Go.
Залишайтеся з нами для ще більше інсайтів з системного дизайну!
Серія:
- Алгоритми планування ліфтів: FCFS, SSTF, SCAN, і LOOK
- Системний дизайн: Система управління бібліотекою
- Побудова торгового автомату на Go (скоро)
- Побудова простій соціальної медіа-платформи на Go (скоро)
- Побудова системи парковки на Go (скоро)
Це все! Сподіваюся, моя стаття була цікавою і корисною для вас 😎😜
Не забувайте про мій GitHub: https://github.com/DmitriiKumancev
До зустрічі!❤️️
Перекладено з: Build a Scalable Library Management System in Go: Design & Concurrency Tips