Ö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
KolayLibrary Management projemiz için ödünç alma sistemini oluşturalım! Kitap ve kullanıcı collections yöneten bir Library struct'ı oluşturacak ve teslim alma ile iade işlemlerini uygun doğrulamayla ele alan metotlar yazacaksınız.
Kodunuzu dört dosya arasında düzenleyeceksiniz:
book.go: Önceki derstekiBookstruct'ınız;ID,Title,Author,ISBNveAvailablealanlarına sahip olacak. books'u available olarak başlatanNewBookconstructor'ını ekleyin.user.go:ID,Name,EmailveBorrowedBooks(book ID'lerinden oluşan slice) alanlarına sahipUserstruct'ınız. Kullanıcıları boş bir ödünç alınanlar listesiyle başlatanNewUserconstructor'ını ekleyin.library.go: books ve kullanıcıları map'lerde (ID'lerine göre anahtarlanmış) saklayan birLibrarystruct'ı oluşturun. Bu bileşenleri geliştirin:- books ve kullanıcılar için boş map'ler başlatan bir
NewLibraryconstructor'ı - library'ye bir book ekleyen bir
AddBookmetodu - library'ye bir kullanıcı ekleyen bir
AddUsermetodu - bir kullanıcı ID'si ve book ID'si alan, işlemi doğrulayan, book'u kullanılamaz olarak işaretleyen, book ID'sini kullanıcının ödünç alınanlar listesine ekleyen ve bir sorun oluşursa error döndüren bir
Borrowmetodu - ödünç alma sürecini tersine çeviren: book'u kullanılabilir olarak işaretleyen ve kullanıcının ödünç alınanlar listesinden kaldıran bir
Returnmetodu
Borrowmetodunuz şu error'ları döndürmelidir:- kullanıcı ID'si mevcut değilse
user not found - book ID'si mevcut değilse
book not found - book zaten ödünç alınmışsa
book not available
Returnmetodunuz şu error'ları döndürmelidir:- kullanıcı ID'si mevcut değilse
user not found - book ID'si mevcut değilse
book not found - book zaten available durumundaysa
book not borrowed
- books ve kullanıcılar için boş map'ler başlatan bir
main.go: Bir library oluşturarak, books ve kullanıcılar ekleyerek, ardından ödünç alma/iade işlemlerini işleyerek her şeyi bir araya getirin.books sayısını okuyun, ardından her book için ID'sini, başlığını, yazarını ve ISBN'sini okuyun. Sonra kullanıcıların sayısını okuyun ve her kullanıcı için ID'sini, adını ve email adresini okuyun. Ardından, her biri
borrow [userID] [bookID]veyareturn [userID] [bookID]olan işlemlerin sayısını okuyun.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:
- books sayısı, ardından her book'un ID'si, başlığı, yazarı ve ISBN'si (her biri ayrı satırda)
- Kullanıcı sayısı, ardından her kullanıcının ID'si, adı ve email adresi (her biri ayrı satırda)
- İş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 foundŞ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
OKŞ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 foundLibrary'nin merkezi koordinatör olarak nasıl davrandığına dikkat edin. Durumu değiştirmeden önce tüm işlemleri doğrulayarak books 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.Fscanln(reader, &numBooks)
// TODO: Yeni bir kütüphane oluştur
// TODO: Her kitabın detaylarını oku (ID, Title, Author, ISBN ayrı satırlarda)
// 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.Fscanln(reader, &numUsers)
// TODO: Her kullanıcının detaylarını oku (ID, Name, Email ayrı satırlarda)
// 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.Fscanln(reader, &numOps)
// TODO: Her işlemi işle
// Biçim: "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ıda "OK", başarısızlıkta "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ıKendi başına pratik yap: Online Go derleyicisi