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 patron Command ! Vous allez créer une CLI qui traite des commandes d’administration telles que l’ajout de livres, l’inscription d’utilisateurs et la gestion des opérations d’emprunt, le tout grâce à une architecture claire 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 patron Command prend vie ! Définissez une interfaceCommandavec une méthodeExecutequi accepte un*Libraryet des arguments[]string, et renvoie un résultat sous forme de chaîne. Implémentez ensuite les structures de commandes suivantes :AddBookCommand: attend 4 arguments : id, title, author, isbn. Ajoute le livre et renvoieBook added: [title]AddUserCommand: attend 3 arguments : id, name, email. Ajoute l’utilisateur et renvoieUser added: [name]BorrowCommand: attend 2 arguments : userID, bookID. RenvoieBorrowed: [bookID]en cas de réussite, ouError: [message]en cas d’échecReturnCommand: attend 2 arguments : userID, bookID. RenvoieReturned: [bookID]en cas de réussite, ouError: [message]en cas d’échecListBooksCommand: n’accepte aucun argument. Renvoie l’ID et le titre de chaque livre sur des lignes séparées au format[id]: [title], ouNo bookssi la liste est vide (triez les livres par ID)
Si une commande reçoit un nombre insuffisant d’arguments, renvoyez
Error: insufficient argumentscli.go: créez une structureCLIqui contient un pointeur vers uneLibraryet une map associant les noms des commandes à des implémentations deCommand. Construisez :- le constructeur
NewCLI, qui initialise la CLI avec une bibliothèque et enregistre toutes les commandes :addbook,adduser,borrow,return,listbooks - la méthode
Run, qui accepte une chaîne d’entrée, l’analyse à l’aide destrings.Fields, recherche la commande, puis l’exécute. RenvoyezNo 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 saisies. 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, avec :
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 doit être :
Book added: Go-Programming
Book added: Clean-Code
User added: Alice
Borrowed: B001
B001: Go-Programming
B002: Clean-Code
Error: book not availableEt avec :
4
listbooks
addbook B100 Design-Patterns Gang-of-Four 978-0201633610
listbooks
invalidcmd testVotre sortie doit être :
No books
Book added: Design-Patterns
B100: Design-Patterns
Unknown command: invalidcmdEt avec :
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 doit être :
User added: Bob
Error: book not found
Book added: Golang-Guide
Borrowed: B001
Returned: B001Remarquez que 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 son exécution. Ainsi, l’ajout de nouvelles commandes se résume à créer une nouvelle structure qui implémente l’interface Command et à l’enregistrer 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 un nouveau 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 le 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 et non exportésIntroduction à la POO en GoStructs comme classesDéfinir des méthodes sur des structsRécepteurs pointeurs ou par valeurInitialisation des structsFonctions constructeursRécapitulatif - Calculatrice simple4Interfaces
Introduction aux interfacesImplémentation impliciteL’interface comme contratInterface vide (any)Assertion de typeCommutation de typeComposition d’interfacesInterfaces Stringer et ErrorRécapitulatif - Calculateur de formes7Encapsulation
Champs exportés vs non exportésEncapsulation au niveau du packageMéthodes Getter et SetterDissimulation de l’information en GoRécapitulatif – Fiches d’étudiants10Génériques (Go 1.18+)
Introduction aux génériquesParamètres de typeContraintes de typeStructures génériquesSolution de contournement pour les méthodes génériquesRécapitulatif - Collection générique2Plongée approfondie dans les types et les structs
Types de base et compositesDéfinitions de types personnalisésTags de structStructs anonymesStructs imbriquésValeurs zéro et valeurs par défautRécapitulatif - Carnet de contacts5La composition plutôt que l’héritage
Pourquoi Go n’a pas d’héritageBases de l’inclusion de structsPromotion des méthodesInclure plusieurs structsInclusion ou agrégationMasquage des méthodes inclusesRécapitulatif : hiérarchie des employés8Gestion des erreurs et POO
L’interface errorTypes d’erreurs personnalisésEnrobage des erreurs (fmt.Errorf)Erreurs sentinelleserrors.Is() et errors.As()Panic, Defer et RecoverRécapitulatif - Analyseur de fichiers11Bibliothèque standard et POO
io.Reader et io.Writersort.InterfaceInterface fmt.Stringerencoding/json avec des structsInterface http.HandlerRécapitulatif - Modèles d’API REST14Modèles de conception – Partie 2
Modèle CommandeModèle AdaptateurModèle DécorateurModèle Méthode modèleModèle ÉtatModèle CompositeMiddleware comme décorateur3Pointeurs et mémoire
Notions de base des pointeurs en GoPointeurs vers des structuresPassage par valeur ou par référenceLa fonction new()Garbage collection en GoRécapitulatif - Constructeur de listes chaînées6Polymorphisme en Go
Polymorphisme via les interfacesDuck typing en GoRègles de satisfaction des interfacesCollections polymorphesInjection de dépendancesRécapitulatif – Processeur de paiements9Concurrence et POO
Bases des GoroutinesCanaux et communicationCanaux tamponnés ou non tamponnésInstruction selectsync.Mutex et sync.RWMutexsync.WaitGroupConception de structures thread-safeRécapitulatif - Pool de workers12Concepts avancés de la POO
Pattern des options fonctionnellesPattern Builder en GoChaînage de méthodesAlias de types vs définitionsBases de la réflexionVue d’ensemble de la génération de code15Projet : gestion de bibliothèque
Vue d’ensemble et structure du projetStructures Book et UserEntraînez-vous par vous-même : Compilateur Go en ligne