Interface CLI d'administration
Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy — leçon 103 sur 107.
Défi
FacileConstruisons une interface en ligne de commande pour notre système de gestion de bibliothèque en utilisant le modèle de conception Command ! Vous allez créer une CLI qui traite les commandes d'administration telles que l'ajout de livres, l'enregistrement d'utilisateurs et la gestion des opérations d'emprunt, le tout via une architecture propre et extensible.
Vous organiserez votre code sur six fichiers :
book.go: Votre structureBookavec des balises JSON pourID,Title,Author,ISBNetAvailable. Incluez le constructeurNewBook.user.go: Votre structureUseravec des balises JSON pourID,Name,EmailetBorrowedBooks. Incluez le constructeurNewUser.library.go: Votre structureLibraryavec des maps pour les livres et les utilisateurs, ainsi que les méthodesAddBook,AddUser,BorrowetReturndes leçons précédentes.commands.go: C'est ici que le modèle Command prend vie ! Définissez une interfaceCommandavec une méthodeExecutequi prend un*Libraryet des arguments[]string, retournant un résultat sous forme de chaîne. Implémentez ensuite ces structures de commande :AddBookCommand— attend 4 arguments : id, title, author, isbn. Ajoute le livre et retourneBook added: [title]AddUserCommand— attend 3 arguments : id, name, email. Ajoute l'utilisateur et retourneUser added: [name]BorrowCommand— attend 2 arguments : userID, bookID. RetourneBorrowed: [bookID]en cas de succès, ouError: [message]en cas d'échecReturnCommand— attend 2 arguments : userID, bookID. RetourneReturned: [bookID]en cas de succès, ouError: [message]en cas d'échecListBooksCommand— ne prend aucun argument. Retourne l'ID et le titre de chaque livre sur des lignes séparées au format[id]: [title], ouNo bookssi la liste est vide (listez les livres triés par ID)
Si une commande reçoit des arguments insuffisants, retournez
Error: insufficient argumentscli.go: Créez une structureCLIqui contient un pointeur vers uneLibraryet une map associant les noms de commandes aux implémentations deCommand. Construisez :- Le constructeur
NewCLIqui initialise la CLI avec une bibliothèque et enregistre toutes les commandes :addbook,adduser,borrow,return,listbooks - La méthode
Runqui prend une chaîne d'entrée, l'analyse à l'aide destrings.Fields, recherche la commande et l'exécute. RetournezNo command providedpour une entrée vide, ouUnknown command: [name]pour les commandes non reconnues
- Le constructeur
main.go: Créez une bibliothèque et une CLI, puis traitez les commandes à partir de l'entrée. Lisez le nombre de commandes, puis lisez chaque chaîne de commande sur une ligne séparée. Pour chaque commande, appelezRunet affichez le résultat.
Les entrées suivantes seront fournies :
- Le nombre de commandes
- Chaque commande sous forme de chaîne complète sur sa propre ligne
Par exemple, étant donné :
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 B001Votre sortie devrait être :
Book added: Go-Programming
Book added: Clean-Code
User added: Alice
Borrowed: B001
B001: Go-Programming
B002: Clean-Code
Error: book not availableEt étant donné :
4
listbooks
addbook B100 Design-Patterns Gang-of-Four 978-0201633610
listbooks
invalidcmd testVotre sortie devrait être :
No books
Book added: Design-Patterns
B100: Design-Patterns
Unknown command: invalidcmdEt étant donné :
5
adduser U001 Bob bob@email.com
borrow U001 B001
addbook B001 Golang-Guide John-Smith 123-456
borrow U001 B001
return U001 B001Votre sortie devrait être :
User added: Bob
Error: book not found
Book added: Golang-Guide
Borrowed: B001
Returned: B001Remarquez comment la CLI n'a pas besoin de connaître les détails de chaque opération — elle recherche simplement la commande et délègue l'exécution. Cela rend l'ajout de nouvelles commandes aussi simple que la création d'une nouvelle structure qui implémente l'interface Command et son enregistrement dans la CLI !
Essayez vous-même
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// Lire le nombre de commandes
var n int
fmt.Scanln(&n)
// Créer un scanner pour lire des lignes complètes
scanner := bufio.NewScanner(os.Stdin)
// TODO: Créer une nouvelle Library
// TODO: Créer une nouvelle CLI avec la library
// TODO: Traiter chaque commande
// Pour chacune des n commandes :
// - Lire la ligne de commande en utilisant scanner.Scan() et scanner.Text()
// - Exécuter la commande via la CLI
// - Afficher le résultat
_ = scanner // Supprimer cette ligne lorsque vous utilisez scanner
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO en Go
Fichiers externesEspace de travail et Modules GoPackages et ImportsNoms exportés vs non exportésIntroduction à la POO en GoLes Structs comme ClassesDéfinir des méthodes sur les StructsReceveurs par pointeur vs par valeurInitialisation de StructsFonctions constructeursRécapitulatif - Calculatrice simple4Interfaces
Introduction aux interfacesImplémentation impliciteL'interface comme contratInterface vide (any)Assertion de typeType SwitchComposition d'interfacesInterfaces Stringer & ErrorRécapitulatif - Calculateur de formes7Encapsulation
Champs exportés vs non exportésEncapsulation au niveau du packageMéthodes Getter & SetterMasquage d'informations en GoRécapitulatif - Dossiers étudiants10Génériques (Go 1.18+)
Introduction aux génériquesParamètres de typeContraintes de typeStructures génériquesContournement pour les méthodes génériquesRécapitulatif - Collections génériques13Patrons de conception, Partie 1
Introduction aux Design PatternsPatron SingletonPatron FactoryPatron Abstract FactoryPatron ObserverPatron Strategy2Exploration approfondie des Types et Structs
Types de base et compositesDéfinitions de types personnalisésTags de StructStructs anonymesStructs imbriquéesValeurs par défaut et Zero ValuesRécapitulatif - Carnet de contacts5Composition plutôt qu'héritage
Pourquoi Go n'a pas d'héritageLes bases de l'imbrication de structsPromotion de méthodesImbriquer plusieurs structsImbrication vs AgrégationMasquage de méthodes imbriquéesRécapitulatif - Hiérarchie des employés8Gestion des erreurs & POO
L'interface errorTypes d'erreurs personnalisésError Wrapping (fmt.Errorf)Erreurs sentinelleserrors.Is() et errors.As()Panic, Defer et RecoverRécapitulatif - File Parser11Bibliothèque standard et POO
io.Reader & io.WriterL'interface sort.InterfaceL'interface fmt.Stringerencoding/json avec les StructsL'interface http.HandlerRécapitulatif - Modèles d'API REST14Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositeMiddleware en tant que Décorateur3Pointeurs et Mémoire
Bases des pointeurs en GoPointeurs vers des structsPassage par valeur vs référenceLa fonction new()Garbage Collection en GoRécapitulatif - Constructeur de liste chaînée6Le polymorphisme en Go
Le polymorphisme via les interfacesLe Duck Typing en GoRègles de satisfaction des interfacesCollections polymorphesInjection de dépendancesRécapitulatif - Processeur de paiement9Concurrence et POO
Bases des GoroutinesChannels et CommunicationChannels avec buffer vs sans bufferL'instruction Selectsync.Mutex et sync.RWMutexsync.WaitGroupConception de structures Thread-SafeRécapitulatif - Worker Pool12Concepts POO Avancés
Pattern Functional OptionsPattern Builder en GoChaînage de méthodesAlias de types vs DéfinitionsBases de la RéflexionAperçu de la génération de code15Projet : Gestion de bibliothèque
Présentation et structure du projetStructures Livre et Utilisateur