Chaînage de méthodes
Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy. Leçon 81 sur 107.
Le chaînage de méthodes est une technique dans laquelle les méthodes renvoient le récepteur, ce qui permet de relier plusieurs appels de méthodes dans une seule instruction. Vous avez déjà vu cela dans le pattern Builder, mais il s’agit d’un concept autonome utile dans de nombreux contextes.
La clé consiste à renvoyer un pointeur vers la structure depuis chaque méthode :
type Query struct {
table string
columns []string
where string
limit int
}
func (q *Query) Select(cols ...string) *Query {
q.columns = cols
return q
}
func (q *Query) From(table string) *Query {
q.table = table
return q
}
func (q *Query) Where(condition string) *Query {
q.where = condition
return q
}
func (q *Query) Limit(n int) *Query {
q.limit = n
return q
}Vous pouvez maintenant enchaîner ces appels de manière fluide :
query := &Query{}
query.Select("name", "email").From("users").Where("active = true").Limit(10)Cela se lit presque comme du langage naturel, comparé à des instructions distinctes. Le chaînage de méthodes fonctionne particulièrement bien lorsque les opérations configurent ou modifient un objet sans avoir besoin de renvoyer d’autres valeurs. Il est couramment utilisé dans les constructeurs de requêtes, les API de configuration et les bibliothèques d’assertions de tests.
N’oubliez pas que chaque méthode doit utiliser un récepteur pointeur et renvoyer *StructType pour que la chaîne fonctionne correctement.
Défi
FacileConstruisons un générateur d’éléments HTML fluide qui utilise l’enchaînement de méthodes pour construire des balises HTML avec des attributs et du contenu ! Il s’agit d’une application pratique de l’enchaînement de méthodes : tu vas créer une API qui se lit presque comme du langage naturel lors de la construction d’éléments HTML.
Tu organiseras ton code sur deux fichiers :
element.go: définis ton générateur d’éléments HTML avec des méthodes chaînables.Crée une structure
Elementqui stocke le nom de la balise, une map d’attributs (de chaîne à chaîne) et le contenu interne. Construis ces méthodes chaînables, qui renvoient chacune*Element:NewElement(tag string)- constructeur qui crée un nouvel Element avec le nom de balise donné et une map d’attributs initialisée (vide)Attr(key, value string)- ajoute un attribut à l’élémentID(id string)- méthode pratique qui définit l’attribut "id"Class(class string)- méthode pratique qui définit l’attribut "class"Content(text string)- définit le contenu interne de l’élément
Ajoute une méthode
Render()qui renvoie la chaîne HTML. Les attributs doivent apparaître dans l’ordre alphabétique de leur clé. Le format est le suivant :<tag attr1="value1" attr2="value2">content</tag>S’il n’y a aucun attribut, rends simplement
<tag>content</tag>. S’il n’y a pas de contenu, rends<tag attr="value"></tag>.main.go: construis des éléments HTML en utilisant l’enchaînement de méthodes.Lis le nom de la balise, puis lis un nombre d’opérations à effectuer. Chaque opération est l’une des suivantes :
idsuivi de la valeur de l’IDclasssuivi de la valeur de la classeattrsuivi du nom et de la valeur de l’attribut (deux lignes)contentsuivi du texte du contenu
Enchaîne toutes les opérations de manière fluide, puis affiche le HTML généré.
Les entrées suivantes seront fournies :
- Ligne 1 : nom de la balise
- Ligne 2 : nombre d’opérations
- Lignes suivantes : type d’opération et valeur(s)
Par exemple, avec :
div
3
id
container
class
main-content
content
Hello WorldTa sortie doit être :
<div class="main-content" id="container">Hello World</div>Et avec :
a
3
attr
href
https://example.com
attr
target
_blank
content
Click hereTa sortie doit être :
<a href="https://example.com" target="_blank">Click here</a>Et avec :
input
2
attr
type
text
attr
placeholder
Enter nameTa sortie doit être :
<input placeholder="Enter name" type="text"></input>Et avec :
p
1
content
Simple paragraphTa sortie doit être :
<p>Simple paragraph</p>Remarque comment l’enchaînement de méthodes te permet de construire des éléments étape par étape de manière lisible. Chaque méthode modifie l’élément et le renvoie, ce qui permet d’enchaîner directement l’appel de la méthode suivante.
Essayez vous-même
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Lire le nom de la balise
scanner.Scan()
tagName := scanner.Text()
// Lire le nombre d'opérations
scanner.Scan()
numOps, _ := strconv.Atoi(scanner.Text())
// Créer l'élément
element := NewElement(tagName)
// Traiter chaque opération
for i := 0; i < numOps; i++ {
scanner.Scan()
operation := scanner.Text()
// TODO: En fonction du type d'opération, enchaîner la méthode appropriée
// Les opérations peuvent être : "id", "class", "attr", ou "content"
// - Pour "id" : lire la ligne suivante comme valeur de l'ID
// - Pour "class" : lire la ligne suivante comme valeur de la classe
// - Pour "attr" : lire les DEUX lignes suivantes (nom de l'attribut, puis valeur)
// - Pour "content" : lire la ligne suivante comme texte du contenu
// Utiliser le chaînage de méthodes pour construire l'élément de manière fluide
_ = operation // Supprimer cette ligne lors de l'implémentation
}
// Affiche le HTML rendu
fmt.Println(element.Render())
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
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 codeEntraînez-vous par vous-même : Compilateur Go en ligne