Panoramica e struttura del progetto
Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 98 di 107.
Sfida
FacileIniziamo il progetto del Sistema di gestione della biblioteca impostando la struttura fondamentale! In questo primo passaggio, creerai l'impalcatura di base che supporterà tutte le funzionalità che svilupperemo nelle prossime lezioni.
Organizzerai il codice in tre file per garantire una chiara separazione delle responsabilità:
book.go: Definisci una structBookche rappresenta un libro della biblioteca. Ogni libro deve avere unID, unTitle, unAuthore uno statoAvailable(booleano). Crea una funzione costruttriceNewBookche accetta ID, titolo e autore come parametri e restituisce un puntatore a un nuovo Book conAvailableimpostato sutrueper impostazione predefinita. Aggiungi anche un metodoString()che restituisce le informazioni del libro nel formato:[ID] Title by Authoruser.go: Definisci una structUserche rappresenta un membro della biblioteca con i campiID,NameedEmail. Crea una funzione costruttriceNewUserche accetta tutti e tre i valori e restituisce un puntatore a un nuovo User. Aggiungi un metodoString()che restituisce:User: Name (Email)main.go: Metti insieme tutti gli elementi leggendo i dati di input per creare libri e utenti, quindi visualizzane le informazioni.Leggi il numero di libri da creare. Per ogni libro, leggi l'ID, il titolo e l'autore su righe separate. Poi leggi il numero di utenti e, per ogni utente, leggi l'ID, il nome e l'email su righe separate.
Dopo aver creato tutti gli elementi, stampa la rappresentazione in stringa di ogni libro su una riga a sé, seguita dalla rappresentazione in stringa di ogni utente, anch'essa su una riga a sé.
Verranno forniti i seguenti input:
- Numero di libri
- Per ogni libro: ID, titolo e autore (ciascuno su una riga separata)
- Numero di utenti
- Per ogni utente: ID, nome ed email (ciascuno su una riga separata)
Per esempio, dato:
2
B001
The Go Programming Language
Alan Donovan
B002
Clean Code
Robert Martin
1
U001
Alice Smith
alice@library.comIl tuo output dovrebbe essere:
[B001] The Go Programming Language by Alan Donovan
[B002] Clean Code by Robert Martin
User: Alice Smith (alice@library.com)E dato:
1
B100
Design Patterns
Gang of Four
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comIl tuo output dovrebbe essere:
[B100] Design Patterns by Gang of Four
User: Bob Jones (bob@email.com)
User: Carol White (carol@email.com)Queste basi stabiliscono i modelli di dati fondamentali che amplierai nel corso del progetto. Nella prossima lezione, migliorerai queste struct e aggiungerai la funzionalità di prestito!
Provalo tu
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Leggi il numero di libri
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: Crea una slice per memorizzare i libri
// TODO: Leggi le informazioni di ogni libro (ID, titolo, autore su righe separate)
// e crea oggetti Book usando 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: Crea un nuovo libro e aggiungilo alla tua slice
}
// Leggi il numero di utenti
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: Crea una slice per memorizzare gli utenti
// TODO: Leggi le informazioni di ogni utente (ID, nome, email su righe separate)
// e crea oggetti User usando 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: Crea un nuovo utente e aggiungilo alla tua slice
}
// TODO: Stampa la rappresentazione come stringa di ogni libro
// TODO: Stampa la rappresentazione come stringa di ogni utente
fmt.Println("TODO: Print output here")
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP in Go
File esterniWorkspace e moduli GoPacchetti e importazioniNomi esportati e non esportatiIntroduzione all’OOP in GoGli struct come classiDefinire metodi sugli structReceiver con puntatore vs receiver con valoreInizializzazione degli structFunzioni costruttriciRiepilogo - Calcolatrice semplice4Interfacce
Introduzione alle interfacceImplementazione implicitaL’interfaccia come contrattoInterfaccia vuota (any)Asserzione di tipoSwitch sul tipoComposizione di interfacceInterfacce Stringer ed ErrorRipasso - Calcolatore di forme7Incapsulamento
Campi esportati e non esportatiIncapsulamento a livello di packageMetodi Getter e SetterNascondimento delle informazioni in GoRiepilogo - Registri degli studenti10Tipi generici (Go 1.18+)
Introduzione ai tipi genericiParametri di tipoVincoli di tipoStruct genericheSoluzione alternativa per i metodi genericiRiepilogo - Collezione generica13Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello Abstract FactoryModello ObserverModello Strategy2Approfondimento su tipi e struct
Tipi di base e compostiDefinizioni di tipi personalizzatiTag delle structStruct anonimeStruct annidateValori zero e predefinitiRipasso - Rubrica5Composizione invece dell'ereditarietà
Perché Go non ha l'ereditarietàFondamenti dell'embedding delle structPromozione dei metodiEmbedding di più structEmbedding e aggregazione a confrontoMascheramento dei metodi embeddedRiepilogo: gerarchia dei dipendenti8Gestione degli errori e OOP
L'interfaccia errorTipi di errore personalizzatiWrapping degli errori (fmt.Errorf)Errori sentinellaerrors.Is() ed errors.As()Panic, Defer e RecoverRiepilogo - Parser di file11Libreria standard e OOP
io.Reader e io.Writersort.InterfaceInterfaccia fmt.Stringerencoding/json con le structInterfaccia http.HandlerRipasso - modelli REST API14Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeMiddleware come Decorator3Puntatori e memoria
Concetti base dei puntatori in GoPuntatori a structPassaggio per valore vs per riferimentoLa funzione new()Garbage collection in GoRiepilogo - Costruttore di liste concatenate6Polimorfismo in Go
Polimorfismo tramite interfacceDuck typing in GoRegole di soddisfacimento delle interfacceCollezioni polimorficheIniezione delle dipendenzeRiepilogo - Elaboratore di pagamenti9Concorrenza e OOP
Basi delle goroutineCanali e comunicazioneCanali bufferizzati vs non bufferizzatiIstruzione selectsync.Mutex e sync.RWMutexsync.WaitGroupProgettazione di struct thread-safeRiepilogo: worker pool12Concetti avanzati di OOP
Pattern delle opzioni funzionaliPattern Builder in GoConcatenamento dei metodiAlias di tipo e definizioni a confrontoNozioni di base sulla reflectionPanoramica sulla generazione del codice15Progetto: Gestione della biblioteca
Panoramica e struttura del progettoStruct per libri e utentiEsercitati da solo: Compilatore Go online