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
KolayCommand 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ı temiz ve genişletilebilir bir mimari üzerinden işleyen bir CLI oluşturacaksınız.
Kodunuzu altı dosyaya ayıracaksınız:
book.go:Book,ID,Title,AuthorveISBNiçin JSON etiketlerine sahipAvailableyapınız.NewBookyapıcısını da ekleyin.user.go:User,ID,NameveEmailiçin JSON etiketlerine sahipBorrowedBooksyapınız.NewUseryapıcısını da ekleyin.library.go: Kitaplar ve kullanıcılar için eşlemelerin yanı sıra önceki derslerdekiLibrary,AddBook,AddUserveBorrowyöntemlerine sahipReturnyapınız.commands.go: Command Pattern'ın hayata geçtiği yer burasıdır!CommandveExecutetüründe args alan ve dize türünde bir sonuç döndüren*Libraryyöntemine sahip bir[]stringarayüzü tanımlayın. Ardından şu komut yapılarını 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ı olursaBorrowed: [bookID], başarısız olursaError: [message]döndürür.ReturnCommand: 2 argüman bekler: userID, bookID. Başarılı olursaReturned: [bookID], başarısız olursaError: [message]döndürür.ListBooksCommand: Argüman almaz. Her kitabın kimliğini ve başlığını ayrı satırlarda[id]: [title]biçiminde döndürür veya liste boşsaNo booksdöndürür (kitapları ID'ye göre sıralayın).
Bir komut yetersiz sayıda argüman alırsa
Error: insufficient argumentsdöndürün.cli.go: BirCLIişaretçisi ve komut adlarınıLibraryuygulamalarına eşleyen bir harita tutanCommandyapısını oluşturun. Şunları oluşturun:NewCLIyapıcısı, CLI'ı bir kütüphane ile başlatır ve tüm komutları kaydeder:addbook,adduser,borrow,return,listbooks- Bir girdi dizesi alan, bu girdiyi
Runkullanarak ayrıştıran, komutu arayan ve çalıştıranstrings.Fieldsyöntemi. Boş girdi içinNo command provided, tanınmayan komutlar içinUnknown command: [name]döndürün.
main.go: Bir kütüphane ve CLI oluşturun, ardından girdiden komutları işleyin. Komut sayısını okuyun, sonra her komut dizesini ayrı bir satırda okuyun. Her komut içinRunçağrısı yapın ve sonucu yazdırın.
Aşağıdaki girdiler sağlanacaktır:
- Komut sayısı
- Her komut, kendi satırında eksiksiz bir dize olarak
Ö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 şekilde 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 availableŞu girdi verildiğinde:
4
listbooks
addbook B100 Design-Patterns Gang-of-Four 978-0201633610
listbooks
invalidcmd testÇıktınız şu şekilde olmalıdır:
No books
Book added: Design-Patterns
B100: Design-Patterns
Unknown command: invalidcmdŞ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 şekilde olmalıdır:
User added: Bob
Error: book not found
Book added: Golang-Guide
Borrowed: B001
Returned: B001CLI'ın her işlemin ayrıntılarını bilmesine gerek olmadığına dikkat edin. CLI yalnızca komutu arar ve çalıştırmayı ona devreder. Bu, yeni komutlar eklemeyi, Command arayüzünü uygulayan yeni bir yapı oluşturup bunu CLI'a kaydetmek kadar basit hâle 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 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:
// - Komut satırını scanner.Scan() ve scanner.Text() kullanarak oku
// - Komutu CLI üzerinden çalıştır
// - Sonucu yazdır
_ = scanner // scanner'ı kullandığınızda bu satırı kaldırın
}
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