Przegląd i struktura projektu
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 98 z 107.
Wyzwanie
ŁatwyRozpocznijmy projekt Systemu Zarządzania Biblioteką od przygotowania podstawowej struktury! W tym pierwszym kroku utworzysz podstawowy szkielet, który będzie obsługiwał wszystkie funkcje, jakie dodamy w kolejnych lekcjach.
Uporządkujesz kod w trzech plikach, aby zachować przejrzysty podział odpowiedzialności:
book.go: Zdefiniuj strukturęBook, która reprezentuje książkę biblioteczną. Każda książka powinna miećID,Title,Authororaz statusAvailable(wartość logiczną). Utwórz funkcję konstruktoraNewBook, która przyjmuje ID, tytuł i autora jako parametry oraz zwraca wskaźnik do nowej książki z domyślnie ustawionymAvailablenatrue. Dodaj też metodęString(), która zwraca informacje o książce w formacie:[ID] Title by Authoruser.go: Zdefiniuj strukturęUserreprezentującą użytkownika biblioteki z polamiID,NameiEmail. Utwórz funkcję konstruktoraNewUser, która przyjmuje wszystkie trzy wartości i zwraca wskaźnik do nowego użytkownika. Dodaj metodęString(), która zwraca:User: Name (Email)main.go: Połącz wszystko, odczytując dane wejściowe w celu utworzenia książek i użytkowników, a następnie wyświetl ich informacje.Odczytaj liczbę książek do utworzenia. Dla każdej książki odczytaj jej ID, tytuł i autora, każdy w osobnym wierszu. Następnie odczytaj liczbę użytkowników, a dla każdego z nich odczytaj ID, imię i nazwisko oraz adres e-mail, każdy w osobnym wierszu.
Po utworzeniu wszystkich elementów wypisz reprezentację tekstową każdej książki w osobnym wierszu, a następnie reprezentację tekstową każdego użytkownika, również w osobnym wierszu.
Dane wejściowe będą miały następujący format:
- Liczba książek
- Dla każdej książki: ID, tytuł i autor (każdy w osobnym wierszu)
- Liczba użytkowników
- Dla każdego użytkownika: ID, imię i nazwisko oraz adres e-mail (każdy w osobnym wierszu)
Na przykład dla danych:
2
B001
The Go Programming Language
Alan Donovan
B002
Clean Code
Robert Martin
1
U001
Alice Smith
alice@library.comOczekiwany wynik:
[B001] The Go Programming Language by Alan Donovan
[B002] Clean Code by Robert Martin
User: Alice Smith (alice@library.com)A dla danych:
1
B100
Design Patterns
Gang of Four
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comOczekiwany wynik:
[B100] Design Patterns by Gang of Four
User: Bob Jones (bob@email.com)
User: Carol White (carol@email.com)Ta podstawa tworzy kluczowe modele danych, które będziesz rozwijać w dalszej części projektu. W następnej lekcji rozbudujesz te struktury i dodasz funkcjonalność wypożyczania!
Spróbuj swoich sił
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Odczytaj liczbę książek
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: Utwórz wycinek do przechowywania książek
// TODO: Odczytaj dane każdej książki (ID, tytuł, autor w osobnych wierszach)
// i utwórz obiekty Book za pomocą NewBook
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)
// TODO: Utwórz nową książkę i dodaj ją do swojego wycinka
}
// Odczytaj liczbę użytkowników
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: Utwórz wycinek do przechowywania użytkowników
// TODO: Odczytaj dane każdego użytkownika (ID, imię, email w osobnych wierszach)
// i utwórz obiekty User za pomocą NewUser
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: Utwórz nowego użytkownika i dodaj go do swojego wycinka
}
// TODO: Wypisz reprezentację tekstową każdej książki
// TODO: Wypisz reprezentację tekstową każdego użytkownika
fmt.Println("TODO: Print output here")
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP w Go
Pliki zewnętrzneObszar roboczy i moduły GoPakiety i importyNazwy eksportowane i nieeksportowaneWprowadzenie do OOP w GoStruktury jako klasyDefiniowanie metod dla strukturOdbiorniki wskaźnikowe i wartościoweInicjalizacja strukturFunkcje konstruktoraPodsumowanie – prosty kalkulator4Interfejsy
Wprowadzenie do interfejsówImplementacja niejawnaInterfejs jako kontraktPusty interfejs (any)Asercja typuPrzełącznik typówKompozycja interfejsówInterfejsy Stringer i ErrorPowtórka — kalkulator figur7Hermetyzacja
Pola eksportowane i nieeksportowaneHermetyzacja na poziomie pakietuMetody pobierające i ustawiająceUkrywanie informacji w GoPowtórka – dane studentów10Typy generyczne (Go 1.18+)
Wprowadzenie do typów generycznychParametry typówOgraniczenia typówStruktury generyczneObejście ograniczeń metod generycznychPodsumowanie — generyczna kolekcja2Typy i struktury w praktyce
Typy proste i złożoneDefiniowanie własnych typówTagi pól strukturStruktury anonimoweStruktury zagnieżdżoneWartości zerowe i domyślnePodsumowanie – książka kontaktów5Kompozycja zamiast dziedziczenia
Dlaczego Go nie ma dziedziczeniaPodstawy osadzania strukturPromowanie metodOsadzanie wielu strukturOsadzanie a agregacjaPrzesłanianie osadzonych metodPodsumowanie — hierarchia pracowników8Obsługa błędów i programowanie obiektowe
Interfejs błęduWłasne typy błędówOpakowywanie błędów (fmt.Errorf)Błędy wartowniczeerrors.Is() i errors.As()Panic, Defer i RecoverPodsumowanie — parser plików3Wskaźniki i pamięć
Podstawy wskaźników w GoWskaźniki do strukturPrzekazywanie przez wartość a przez referencjęFunkcja new()Odśmiecanie pamięci w GoPowtórka — kreator listy wiązanej6Polimorfizm w Go
Polimorfizm za pomocą interfejsówDuck typing w GoZasady spełniania interfejsówKolekcje polimorficzneWstrzykiwanie zależnościPowtórka — procesor płatności9Współbieżność i OOP
Podstawy goroutinesKanały i komunikacjaKanały buforowane i niebuforowaneInstrukcja selectsync.Mutex i sync.RWMutexsync.WaitGroupProjektowanie struktur bezpiecznych wątkowoPowtórka – pula workerów12Zaawansowane zagadnienia programowania obiektowego
Wzorzec opcji funkcyjnychWzorzec Builder w GoŁańcuchowe wywoływanie metodAliasy typów a definicje typówPodstawy refleksjiPrzegląd generowania kodu15Projekt: Zarządzanie biblioteką
Przegląd i struktura projektuStruktury książek i użytkownikówPoćwicz samodzielnie: Kompilator Go online