Ricerca con interfacce
Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 101 di 107.
Sfida
FacileAggiungiamo funzionalità di ricerca flessibili al nostro sistema di gestione della biblioteca! Implementerai il pattern Strategy usando le interfacce, consentendo agli utenti di cercare libri secondo criteri diversi senza modificare il codice di base della biblioteca.
Organizzerai il codice in cinque file:
book.go: La structBookdelle lezioni precedenti, con i campiID,Title,Author,ISBNeAvailable. Includi il costruttoreNewBook.user.go: La structUser, con i campiID,Name,EmaileBorrowedBooks. Includi il costruttoreNewUser.search.go: Definisci l'interfaccia della strategia di ricerca e le relative implementazioni.Crea un'interfaccia
SearchStrategycon un solo metodo:Match(book *Book, query string) boolImplementa tre strategie di ricerca:
TitleSearch: trova una corrispondenza se il titolo del libro contiene la query (senza distinzione tra maiuscole e minuscole)AuthorSearch: trova una corrispondenza se l'autore del libro contiene la query (senza distinzione tra maiuscole e minuscole)ISBNSearch: trova una corrispondenza se l'ISBN del libro è esattamente uguale alla query
library.go: La structLibrary, con map per libri e utenti. Aggiungi un metodoSearchche accetti qualsiasiSearchStrategye una stringa di query e restituisca uno slice di puntatori ai libri corrispondenti. Il metodo deve scorrere tutti i libri e usare il metodoMatchdella strategia per trovare i risultati.main.go: Crea una biblioteca con dei libri, quindi esegui ricerche usando strategie diverse.Leggi il numero di libri, quindi, per ciascun libro, leggi l'ID, il titolo, l'autore e l'ISBN. Poi leggi il numero di operazioni di ricerca. Ogni operazione consiste in un tipo di ricerca (
title,authoroisbn) seguito dalla stringa di query.Per ogni ricerca, stampa
Search by [type]: [query], seguito dagli ID dei libri corrispondenti sulla riga successiva, ordinati in ordine crescente e separati da virgole (l'iterazione su una map avviene in ordine casuale, quindi ordina gli ID prima di stamparli). Se non corrisponde nessun libro, stampa inveceNo results.
Verranno forniti i seguenti dati in input:
- Numero di libri, poi l'ID, il titolo, l'autore e l'ISBN di ciascun libro (ognuno su una riga separata)
- Numero di ricerche, poi il tipo e la query di ciascuna ricerca (ognuno su una riga separata)
Per esempio, dato:
3
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Go in Action
William Kennedy
978-1617291784
B003
Learning Python
Mark Lutz
978-1449355739
3
title
go
author
kennedy
isbn
978-1449355739L'output dovrebbe essere:
Search by title: go
B001,B002
Search by author: kennedy
B002
Search by isbn: 978-1449355739
B003E dato:
2
B001
Clean Code
Robert Martin
978-0132350884
B002
The Pragmatic Programmer
David Thomas
978-0135957059
2
title
java
author
martinL'output dovrebbe essere:
Search by title: java
No results
Search by author: martin
B001E dato:
2
B001
Design Patterns
Gang of Four
978-0201633610
B002
Head First Design Patterns
Eric Freeman
978-0596007126
1
title
designL'output dovrebbe essere:
Search by title: design
B001,B002Nota come il metodo Search funzioni con qualsiasi strategia. Non sa se sta cercando per titolo, autore o ISBN. Questo approccio polimorfico permette di aggiungere nuovi tipi di ricerca (come la ricerca per disponibilità o anno di pubblicazione) semplicemente creando nuove struct che implementano SearchStrategy!
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))
// Crea la libreria
library := NewLibrary()
// Leggi i dettagli di ciascun libro
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)
isbn, _ := reader.ReadString('\n')
isbn = strings.TrimSpace(isbn)
book := NewBook(id, title, author, isbn)
library.AddBook(book)
}
// Leggi il numero di ricerche
numSearchesStr, _ := reader.ReadString('\n')
numSearches, _ := strconv.Atoi(strings.TrimSpace(numSearchesStr))
// Elabora ogni ricerca
for i := 0; i < numSearches; i++ {
searchType, _ := reader.ReadString('\n')
searchType = strings.TrimSpace(searchType)
query, _ := reader.ReadString('\n')
query = strings.TrimSpace(query)
// TODO: Seleziona la strategia di ricerca appropriata in base a searchType
// searchType può essere "title", "author" o "isbn"
var strategy SearchStrategy
// TODO: Implementa qui la logica di selezione della strategia
// TODO: Esegui la ricerca usando library.Search(strategy, query)
// TODO: Stampa i risultati nel formato richiesto
// Formato: "Search by [type]: [query]" seguito dagli ID corrispondenti o da "No results"
fmt.Printf("Search by %s: %s\n", searchType, query)
// TODO: Stampa gli ID dei libri corrispondenti separati da virgole, oppure "No results"
_ = strategy // Rimuovi questa riga quando implementi la soluzione
}
}
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