Métodos auxiliares
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 10 de 61.
Hasta ahora, hemos visto funciones que modifican los datos de una estructura (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 una estructura sin cambiar nada.
Considera una estructura Rectangle que almacena el ancho y la altura. El área no se almacena: se calcula cuando se necesita:
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 de la estructura y producen un nuevo valor. Observa que usan punteros const, ya que solo leen y nunca escriben. El resultado calculado se devuelve en lugar de almacenarse en la estructura.
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 estructuras optimizadas: almacena solo los datos esenciales y calcula todo lo demás cuando sea necesario. También garantiza que los valores derivados sean siempre coherentes con el estado actual.
Desafío
FácilConstruyamos 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. Declara también 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 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 lo modifiques.main.c: Crea un Circle y usa los métodos auxiliares para calcular y mostrar sus propiedades.
Recibirás una entrada: el radio del círculo (como un double).
En tu archivo principal, inicializa un Circle con el radio proporcionado; después, usa los métodos auxiliares para calcular e imprimir el área y la circunferencia.
Imprime los resultados con 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.42Pruébalo tú mismo
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Crea un struct Circle con el radio dado
// TODO: Use circle_area and circle_circumference helper methods
// 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 Programación Orientada a Objetos
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írculoImplementación del rectánguloUso polimórficoContenedor de figurasPractica por tu cuenta: Compilador de C online