Ödünç Alma Sistemi
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 100 / 107.
Görev
KolayKütüphane Yönetimi projemiz için ödünç alma sistemini kuralım! Kitap ve kullanıcı koleksiyonlarını yöneten, ödünç alma ve iade işlemlerini uygun doğrulamalarla birlikte gerçekleştiren metotlara sahip bir Library yapısı oluşturacaksınız.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
book.go: Önceki dersten kalmaID,Title,Author,ISBNveAvailablealanlarına sahipBookyapınız. Kitapları kullanılabilir (available) olarak başlatanNewBookyapıcı fonksiyonunu (constructor) dahil edin.user.go:ID,Name,EmailveBorrowedBooks(kitap ID'lerinden oluşan bir slice) alanlarına sahipUseryapınız. Kullanıcıları boş bir ödünç listesiyle başlatanNewUseryapıcı fonksiyonunu dahil edin.library.go: Kitapları ve kullanıcıları map'lerde (ID'lerine göre anahtarlanmış) saklayan birLibraryyapısı oluşturun. Şu bileşenleri inşa edin:- Kitaplar ve kullanıcılar için boş map'leri başlatan bir
NewLibraryyapıcı fonksiyonu - Kütüphaneye bir kitap ekleyen
AddBookmetodu - Kütüphaneye bir kullanıcı ekleyen
AddUsermetodu - Bir kullanıcı ID'si ve kitap ID'si alan, işlemi doğrulayan, kitabı ödünç alınmış olarak işaretleyen, kitap ID'sini kullanıcının ödünç listesine ekleyen ve bir şeyler ters giderse hata döndüren bir
Borrowmetodu - Ödünç alma işlemini tersine çeviren; kitabı kullanılabilir olarak işaretleyen ve kullanıcının ödünç listesinden çıkaran bir
Returnmetodu
Borrowmetodunuz şu hataları döndürmelidir:- Kullanıcı ID'si mevcut değilse
user not found - Kitap ID'si mevcut değilse
book not found - Kitap zaten ödünç alınmışsa
book not available
Returnmetodunuz şu hataları döndürmelidir:- Kullanıcı ID'si mevcut değilse
user not found - Kitap ID'si mevcut değilse
book not found - Kitap zaten kullanılabilir durumdaysa (ödünç alınmamışsa)
book not borrowed
- Kitaplar ve kullanıcılar için boş map'leri başlatan bir
main.go: Bir kütüphane oluşturarak, kitap ve kullanıcı ekleyerek, ardından ödünç alma/iade işlemlerini işleyerek her şeyi bir araya getirin.Kitap sayısını okuyun, ardından her kitap için ID, başlık, yazar ve ISBN bilgilerini okuyun. Sonra kullanıcı sayısını okuyun ve her kullanıcı için ID, isim ve e-posta bilgilerini okuyun. Daha sonra işlem sayısını okuyun; her işlem ya
borrow [userID] [bookID]ya dareturn [userID] [bookID]şeklindedir.Her işlem için, başarılıysa
OK, başarısızsaError: [message]yazdırın.
Aşağıdaki girdiler sağlanacaktır:
- Kitap sayısı, ardından her kitabın ID'si, başlığı, yazarı, ISBN'i (her biri ayrı satırlarda)
- Kullanıcı sayısı, ardından her kullanıcının ID'si, ismi, e-postası (her biri ayrı satırlarda)
- İşlem sayısı, ardından her işlem ayrı bir satırda
Örneğin, şu girdi verildiğinde:
2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com
4
borrow U001 B001
borrow U001 B001
return U001 B001
borrow U002 B001Çıktınız şu olmalıdır:
OK
Error: book not available
OK
Error: user not foundVe şu girdi verildiğinde:
1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com
3
borrow U001 B100
borrow U002 B100
return U001 B100Çıktınız şu olmalıdır:
OK
Error: book not available
OKVe şu girdi verildiğinde:
1
B001
Go in Action
William Kennedy
978-1617291784
1
U001
Dave Miller
dave@test.com
2
return U001 B001
borrow U001 B999Çıktınız şu olmalıdır:
Error: book not borrowed
Error: book not foundKütüphanenin (Library) nasıl merkezi bir koordinatör görevi gördüğüne dikkat edin; durumu değiştirmeden önce tüm işlemleri doğrular, kitapların ve kullanıcıların senkronize kalmasını sağlar. Pointer receiver'lar kullanmak, metotlarınızın map'lerde saklanan gerçek verileri değiştirmesine olanak tanır!
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Kitap sayısını oku
var numBooks int
fmt.Scanln(&numBooks)
// TODO: Yeni bir kütüphane oluştur
// TODO: Her kitabın ayrıntılarını oku (ayrı satırlarda ID, Title, Author, ISBN)
// ve bunları kütüphaneye ekle
for i := 0; i < numBooks; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
author, _ := reader.ReadString('\n')
author = strings.TrimSpace(author)
isbn, _ := reader.ReadString('\n')
isbn = strings.TrimSpace(isbn)
// TODO: Kitap oluştur ve kütüphaneye ekle
}
// Kullanıcı sayısını oku
var numUsers int
fmt.Scanln(&numUsers)
// TODO: Her kullanıcının ayrıntılarını oku (ayrı satırlarda ID, Name, Email)
// ve bunları kütüphaneye ekle
for i := 0; i < numUsers; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
// TODO: Kullanıcı oluştur ve kütüphaneye ekle
}
// İşlem sayısını oku
var numOps int
fmt.Scanln(&numOps)
// TODO: Her işlemi işle
// Format: "borrow [userID] [bookID]" veya "return [userID] [bookID]"
for i := 0; i < numOps; i++ {
line, _ := reader.ReadString('\n')
line = strings.TrimSpace(line)
parts := strings.Split(line, " ")
// TODO: İşlemi ayrıştır ve uygun metodu çağır
// Başarı durumunda "OK" veya hata durumunda "Error: [message]" yazdır
}
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool12İleri Düzey OOP Kavramları
Functional Options DeseniGo'da Builder DeseniMetot ZincirlemeTür Takma Adları vs. TanımlamalarReflection TemelleriKod Üretimine Genel Bakış15Proje: Kütüphane Yönetimi
Projeye Genel Bakış ve YapıKitap ve Kullanıcı Struct'ları