Admin CLI Arayüzü
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 103 / 107.
Görev
KolayKomut Deseni'ni (Command Pattern) kullanarak Kütüphane Yönetim Sistemimiz için bir komut satırı arayüzü oluşturalım! Kitap ekleme, kullanıcı kaydetme ve ödünç alma işlemlerini yönetme gibi yönetici komutlarını işleyen, temiz ve genişletilebilir bir mimariye sahip bir CLI oluşturacaksınız.
Kodunuzu altı dosya halinde düzenleyeceksiniz:
book.go:ID,Title,Author,ISBNveAvailablealanları için JSON etiketlerine sahipBookyapınız.NewBookyapıcı metodunu (constructor) ekleyin.user.go:ID,Name,EmailveBorrowedBooksalanları için JSON etiketlerine sahipUseryapınız.NewUseryapıcı metodunu ekleyin.library.go: Kitaplar ve kullanıcılar için map'ler içerenLibraryyapınız; önceki derslerdekiAddBook,AddUser,BorrowveReturnmetodlarını da ekleyin.commands.go: Komut Deseni'nin hayat bulduğu yer burası! Bir*Libraryve[]stringargümanları alan ve bir string sonucu döndürenExecutemetoduna sahip birCommandarayüzü tanımlayın. Ardından şu komut yapılarını (structs) uygulayın:AddBookCommand— 4 argüman bekler: id, title, author, isbn. Kitabı ekler veBook added: [title]döndürür.AddUserCommand— 3 argüman bekler: id, name, email. Kullanıcıyı ekler veUser added: [name]döndürür.BorrowCommand— 2 argüman bekler: userID, bookID. Başarılı olduğundaBorrowed: [bookID], başarısız olduğundaError: [message]döndürür.ReturnCommand— 2 argüman bekler: userID, bookID. Başarılı olduğundaReturned: [bookID], başarısız olduğundaError: [message]döndürür.ListBooksCommand— argüman almaz. Her kitabın ID'sini ve başlığını ayrı satırlarda[id]: [title]formatında döndürür, liste boşsaNo booksdöndürür (kitapları ID'ye göre sıralı listeleyin).
Bir komut yetersiz argüman alırsa,
Error: insufficient argumentsdöndürün.cli.go: BirLibraryişaretçisi (pointer) ve komut adlarınıCommanduygulamalarına eşleyen bir map tutan birCLIyapısı oluşturun. Şunları oluşturun:- CLI'yı bir kütüphane ile başlatan ve tüm komutları kaydeden
NewCLIyapıcı metodu:addbook,adduser,borrow,return,listbooks - Bir girdi string'i alan, bunu
strings.Fieldskullanarak ayrıştıran, komutu bulan ve yürütenRunmetodu. Boş girdi içinNo command provided, tanınmayan komutlar içinUnknown command: [name]döndürün.
- CLI'yı bir kütüphane ile başlatan ve tüm komutları kaydeden
main.go: Bir kütüphane ve CLI oluşturun, ardından girdiden gelen komutları işleyin. Komut sayısını okuyun, ardından her bir komut string'ini ayrı bir satırda okuyun. Her komut içinRunmetodunu çağırın ve sonucu yazdırın.
Aşağıdaki girdiler sağlanacaktır:
- Komut sayısı
- Kendi satırında tam bir string olarak her bir komut
Örneğin, şu girdi verildiğinde:
6
addbook B001 Go-Programming Alan-Donovan 978-0134190440
addbook B002 Clean-Code Robert-Martin 978-0132350884
adduser U001 Alice alice@test.com
borrow U001 B001
listbooks
borrow U001 B001Çıktınız şu olmalıdır:
Book added: Go-Programming
Book added: Clean-Code
User added: Alice
Borrowed: B001
B001: Go-Programming
B002: Clean-Code
Error: book not availableVe şu girdi verildiğinde:
4
listbooks
addbook B100 Design-Patterns Gang-of-Four 978-0201633610
listbooks
invalidcmd testÇıktınız şu olmalıdır:
No books
Book added: Design-Patterns
B100: Design-Patterns
Unknown command: invalidcmdVe şu girdi verildiğinde:
5
adduser U001 Bob bob@email.com
borrow U001 B001
addbook B001 Golang-Guide John-Smith 123-456
borrow U001 B001
return U001 B001Çıktınız şu olmalıdır:
User added: Bob
Error: book not found
Book added: Golang-Guide
Borrowed: B001
Returned: B001CLI'nın her bir işlemin ayrıntılarını bilmesine nasıl gerek kalmadığına dikkat edin; sadece komutu bulur ve yürütmeyi devreder. Bu, yeni komutlar eklemeyi, Command arayüzünü uygulayan yeni bir yapı oluşturmak ve bunu CLI'ya kaydetmek kadar basit hale getirir!
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// Komut sayısını oku
var n int
fmt.Scanln(&n)
// Tam satırları okumak için bir tarayıcı (scanner) oluştur
scanner := bufio.NewScanner(os.Stdin)
// TODO: Yeni bir Library oluştur
// TODO: Kütüphane ile yeni bir CLI oluştur
// TODO: Her komutu işle
// n komutun her biri için:
// - scanner.Scan() ve scanner.Text() kullanarak komut satırını oku
// - Komutu CLI üzerinden çalıştır
// - Sonucu yazdır
_ = scanner // scanner kullandığında bu satırı kaldı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ı