Métodos auxiliares
Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 10 de 61.
Hasta ahora, hemos visto funciones que modifican datos de estructuras (como player_take_damage) y funciones que simplemente los muestran. Pero hay otra categoría importante: funciones que calculan valores derivados a partir de los miembros de la estructura sin cambiar nada.
Considera una estructura Rectangle que almacena el ancho y el alto. El área no se almacena; se calcula bajo demanda:
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);
}
Estos son métodos auxiliares—toman los datos existentes del struct y producen un nuevo valor. Observa que utilizan punteros const, ya que solo leen, nunca escriben. El resultado calculado se devuelve en lugar de almacenarse en el struct.
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
Este patrón mantiene tus structs ligeros: almacena solo los datos esenciales y calcula todo lo demás cuando sea necesario. También garantiza que los valores derivados sean siempre consistentes con el estado actual.
Desafío
FácilVamos a construir un módulo Circle que calcule valores derivados a partir de datos almacenados. Practicarás la escritura de métodos auxiliares: funciones que calculan resultados a partir de miembros de una estructura sin modificarlos.
Crearás tres archivos:
circle.h: Declara una estructuraCirclecon un único miembrodouble radius. También declara dos métodos auxiliares:circle_area— recibe un punteroconsta Circle y devuelve el áreacircle_circumference— recibe un punteroconsta Circle y devuelve la circunferencia
CIRCLE_H.circle.c: Implementa ambos métodos auxiliares. Para los cálculos, usa3.14159como el valor de pi. La fórmula del área espi * radius * radius, y la fórmula de la circunferencia es2 * pi * radius. Ambas funciones solo deben leer el radio, nunca modificarlo.main.c: Crea un Circle y usa los métodos auxiliares para calcular y mostrar sus propiedades.
Recibirás una entrada: el radius del círculo (como un double).
In su archivo principal, inicializa un Circle con el radio dado, luego usa tus métodos auxiliares para calcular e imprimir el área y la circunferencia.
Imprime los resultados en este formato:
Area: {area}
Circumference: {circumference}Usa %.2f para ambos valores para mostrar dos decimales.
Por ejemplo, con un radio de 5.0, la salida sería:
Area: 78.54
Circumference: 31.42Hoja de referencia
Las funciones pueden calcular valores derivados de los miembros de una estructura sin modificar la estructura. Estos se denominan métodos auxiliares.
Los métodos auxiliares utilizan punteros const ya que solo leen datos, nunca escriben:
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);
}
Uso de métodos auxiliares:
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
Este patrón mantiene las estructuras ligeras al almacenar solo los datos esenciales y calcular los valores derivados bajo demanda, garantizando la coherencia con el estado actual.
Pruébalo tú mismo
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Crear una estructura Circle con el radius dado
// TODO: Usar los métodos auxiliares circle_area y circle_circumference
// para calcular e imprimir los resultados
// Formato de impresión:
// printf("Area: %.2f\n", ...);
// printf("Circumference: %.2f\n", ...);
return 0;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculo