Méthodes utilitaires
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 10 sur 61.
Jusqu'à présent, nous avons vu des fonctions qui modifient les données d'une structure (comme player_take_damage) et des fonctions qui les affichent simplement. Mais il existe une autre catégorie importante : les fonctions qui calculent des valeurs dérivées à partir des membres de la structure sans rien modifier.
Considérez une structure Rectangle qui stocke la largeur et la hauteur. L'aire n'est pas stockée — elle est calculée à la demande :
typedef struct {
double width;
double height;
} Rectangle;
double rectangle_area(const Rectangle *self) {
return self->width * self->height;
}
double rectangle_perimeter(const Rectangle *self) {
return 2 * (self->width + self->height);
}
Ce sont des méthodes utilitaires — elles utilisent les données existantes de la structure pour produire une nouvelle valeur. Remarquez qu'elles utilisent des pointeurs const puisqu'elles ne font que lire, sans jamais écrire. Le résultat calculé est renvoyé plutôt que d'être stocké dans la structure.
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
Ce modèle permet de garder vos structs légères : ne stockez que les données essentielles et calculez tout le reste au besoin. Cela garantit également que les valeurs dérivées sont toujours cohérentes avec l'état actuel.
Défi
FacileConstruisons un module Circle qui calcule des valeurs dérivées à partir de données stockées. Vous allez vous entraîner à écrire des méthodes d'aide (helper methods)—des fonctions qui calculent des résultats à partir des membres d'une structure sans les modifier.
Vous allez créer trois fichiers :
circle.h: Déclarez une structureCircleavec un seul membredouble radius. Déclarez également deux méthodes d'aide :circle_area— prend un pointeurconstvers Circle et retourne l'airecircle_circumference— prend un pointeurconstvers Circle et retourne la circonférence
CIRCLE_H.circle.c: Implémentez les deux méthodes d'aide. Pour les calculs, utilisez3.14159comme valeur de pi. La formule de l'aire estpi * radius * radius, et la formule de la circonférence est2 * pi * radius. Les deux fonctions doivent uniquement lire le rayon—ne jamais le modifier.main.c: Créez un Circle et utilisez les méthodes d'aide pour calculer et afficher ses propriétés.
Vous recevrez une entrée : le radius du cercle (sous forme de double).
Dans votre fichier principal, initialisez un Circle avec le rayon donné, puis utilisez vos méthodes d'aide pour calculer et afficher l'aire et la circonférence.
Affichez les résultats dans ce format :
Area: {area}
Circumference: {circumference}Utilisez %.2f pour les deux valeurs afin d'afficher deux décimales.
Par exemple, avec un rayon de 5.0, la sortie serait :
Area: 78.54
Circumference: 31.42Aide-mémoire
Les fonctions peuvent calculer des valeurs dérivées à partir des membres d'une structure sans modifier la structure elle-même. Celles-ci sont appelées méthodes auxiliaires (helper methods).
Les méthodes auxiliaires utilisent des pointeurs const puisqu'elles ne font que lire les données, sans jamais les modifier :
typedef struct {
double width;
double height;
} Rectangle;
double rectangle_area(const Rectangle *self) {
return self->width * self->height;
}
double rectangle_perimeter(const Rectangle *self) {
return 2 * (self->width + self->height);
}
Utilisation des méthodes auxiliaires :
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
Ce modèle permet de garder les structures légères en ne stockant que les données essentielles et en calculant les valeurs dérivées à la demande, garantissant ainsi la cohérence avec l'état actuel.
Essayez vous-même
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Créer une struct Circle avec le rayon donné
// TODO: Utiliser les méthodes auxiliaires circle_area et circle_circumference
// pour calculer et afficher les résultats
// Format d'affichage :
// printf("Area: %.2f\n", ...);
// printf("Circumference: %.2f\n", ...);
return 0;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Object Oriented Programming
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercle