Menu
Coddy logo textTech

JSON Kalıcılık Katmanı

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

challenge icon

Görev

Kolay

Kütüphane Yönetim Sistemimize veri kalıcılığı ekleyelim! Kütüphanenizin verilerini kaydetmek için JSON formatına dönüştürebilen ve JSON dizelerinden geri yükleyebilen bir JSON kalıcılık katmanı uygulayacaksınız. Bu, oturumlar arasında verileri koruması gereken her gerçek uygulama için gereklidir.

Kodunuzu beş dosya halinde düzenleyeceksiniz:

  • book.go: Serileştirmeyi kontrol etmek için JSON struct etiketlerine sahip Book struct'ınız. Her alanın karşılık gelen bir JSON etiketi olmalıdır: id, title, author, isbn ve available. NewBook yapılandırıcınızı (constructor) dahil edin.
  • user.go: id, name, email ve borrowed_books için JSON struct etiketlerine sahip User struct'ınız. NewUser yapılandırıcınızı dahil edin.
  • data.go: JSON serileştirmesi için bir transfer nesnesi görevi gören bir LibraryData struct'ı oluşturun. İki alanı olmalıdır: Books (Book pointer'larından oluşan bir slice) ve Users (User pointer'larından oluşan bir slice), her biri uygun JSON etiketlerine (books ve users) sahip olmalıdır.
  • library.go: Kitaplar ve kullanıcılar için map'ler içeren Library struct'ınız. İki yeni metot ekleyin:
    • ToJSON() — iki boşluk girinti ile json.MarshalIndent kullanarak kütüphanenin verilerini biçimlendirilmiş bir JSON dizesine dönüştürür. Map'lerdeki tüm kitapları ve kullanıcıları bir LibraryData struct'ında toplamalı ve ardından serileştirmelidir.
    • FromJSON(jsonStr string) — bir JSON dizesi alır, onu bir LibraryData struct'ına unmarshal eder ve kütüphanenin map'lerini yüklenen kitaplar ve kullanıcılarla doldurur.
  • main.go: Bir kütüphane oluşturup onu JSON'a dönüştürerek kalıcılık katmanını gösterin.

    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. Kütüphaneyi doldurduktan sonra ToJSON() metodunu çağırın ve sonuçta oluşan JSON dizesini 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)

Ö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

Çıktınız şu olmalıdır:

{
  "books": [
    {
      "id": "B001",
      "title": "The Go Programming Language",
      "author": "Alan Donovan",
      "isbn": "978-0134190440",
      "available": true
    },
    {
      "id": "B002",
      "title": "Clean Code",
      "author": "Robert Martin",
      "isbn": "978-0132350884",
      "available": true
    }
  ],
  "users": [
    {
      "id": "U001",
      "name": "Alice Smith",
      "email": "alice@library.com",
      "borrowed_books": []
    }
  ]
}

Ve şu girdi verildiğinde:

1
B100
Design Patterns
Gang of Four
978-0201633610
0

Çıktınız şu olmalıdır:

{
  "books": [
    {
      "id": "B100",
      "title": "Design Patterns",
      "author": "Gang of Four",
      "isbn": "978-0201633610",
      "available": true
    }
  ],
  "users": []
}

Önemli: Slice'larınızı oluşturmak için map'ler üzerinde döngü kurarken, kitapları şu sırayla ekleyin: B001, B002, vb. (ID'ye göre alfabetik olarak sıralanmış) ve kullanıcıları da benzer şekilde ekleyin. Bu, tutarlı bir JSON çıktısı sağlar. Döngüden önce map anahtarları üzerinde sort.Strings kullanabilirsiniz.

LibraryData struct'ı, map tabanlı depolamanız ile JSON'un dizi tabanlı formatı arasındaki boşluğu doldurur. Bu transfer nesnesi (transfer object) deseni, karmaşık veri yapılarını serileştirirken yaygındır!

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Yeni bir kütüphane oluştur
	library := NewLibrary()

	// Kitap sayısını oku
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: Her kitabın detaylarını (ID, title, author, ISBN) oku
	// ve onları kütüphaneye ekle
	for i := 0; i < numBooks; i++ {
		// TODO: Kitap ID'sini oku
		// TODO: Kitap başlığını oku
		// TODO: Kitap yazarını oku
		// TODO: Kitap ISBN numarasını oku
		// TODO: Kitabı oluştur ve kütüphaneye ekle
	}

	// Kullanıcı sayısını oku
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: Her kullanıcının detaylarını (ID, name, email) oku
	// ve onları kütüphaneye ekle
	for i := 0; i < numUsers; i++ {
		// TODO: Kullanıcı ID'sini oku
		// TODO: Kullanıcı adını oku
		// TODO: Kullanıcı e-postasını oku
		// TODO: Kullanıcıyı oluştur ve kütüphaneye ekle
	}

	// TODO: Kütüphaneyi JSON formatına dönüştür ve yazdır
	fmt.Println(library.ToJSON())
}

Nesne Yönelimli Programlama bölümündeki tüm dersler