Menu
Coddy logo textTech

Admin CLI Arayüzü

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 103 / 107.

challenge icon

Görev

Kolay

Komut 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, ISBN ve Available alanları için JSON etiketlerine sahip Book yapınız. NewBook yapıcı metodunu (constructor) ekleyin.
  • user.go: ID, Name, Email ve BorrowedBooks alanları için JSON etiketlerine sahip User yapınız. NewUser yapıcı metodunu ekleyin.
  • library.go: Kitaplar ve kullanıcılar için map'ler içeren Library yapınız; önceki derslerdeki AddBook, AddUser, Borrow ve Return metodlarını da ekleyin.
  • commands.go: Komut Deseni'nin hayat bulduğu yer burası! Bir *Library ve []string argümanları alan ve bir string sonucu döndüren Execute metoduna sahip bir Command arayü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 ve Book added: [title] döndürür.
    • AddUserCommand — 3 argüman bekler: id, name, email. Kullanıcıyı ekler ve User added: [name] döndürür.
    • BorrowCommand — 2 argüman bekler: userID, bookID. Başarılı olduğunda Borrowed: [bookID], başarısız olduğunda Error: [message] döndürür.
    • ReturnCommand — 2 argüman bekler: userID, bookID. Başarılı olduğunda Returned: [bookID], başarısız olduğunda Error: [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şsa No books döndürür (kitapları ID'ye göre sıralı listeleyin).

    Bir komut yetersiz argüman alırsa, Error: insufficient arguments döndürün.

  • cli.go: Bir Library işaretçisi (pointer) ve komut adlarını Command uygulamalarına eşleyen bir map tutan bir CLI yapısı oluşturun. Şunları oluşturun:
    • CLI'yı bir kütüphane ile başlatan ve tüm komutları kaydeden NewCLI yapıcı metodu: addbook, adduser, borrow, return, listbooks
    • Bir girdi string'i alan, bunu strings.Fields kullanarak ayrıştıran, komutu bulan ve yürüten Run metodu. Boş girdi için No command provided, tanınmayan komutlar için Unknown command: [name] döndürün.
  • 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çin Run metodunu ç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 available

Ve ş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: invalidcmd

Ve ş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: B001

CLI'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