Getters y Setters
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 19 de 61.
Con los punteros opacos, los miembros de la estructura están ocultos para el código externo. Pero si el código externo no puede acceder directamente a los datos, ¿cómo los leemos o modificamos? La respuesta son las funciones getter y setter: interfaces públicas que proporcionan un acceso controlado a los datos privados.
Un getter devuelve el valor de un miembro oculto:
// counter.h
int counter_get_value(const Counter *c);
// counter.c
int counter_get_value(const Counter *c) {
return c->value;
}
Un setter modifica un miembro oculto:
// counter.h
void counter_set_value(Counter *c, int new_value);
// counter.c
void counter_set_value(Counter *c, int new_value) {
c->value = new_value;
}
Observa la convención de nombres: antepone a las funciones el nombre del tipo (counter_) para evitar conflictos y hacer clara la API. Los getters usan punteros const porque no modifican el objeto.
Ahora el código externo puede interactuar de forma segura con los datos ocultos:
// main.c
Counter *c = create_counter(10);
printf("%d\n", counter_get_value(c)); // 10
counter_set_value(c, 25);
printf("%d\n", counter_get_value(c)); // 25
Este patrón te brinda control total sobre cómo se accede a los datos: una base sobre la que construiremos en la próxima lección, cuando añadamos lógica de validación a los setters.
Desafío
FácilConstruyamos un módulo Score que use el patrón de puntero opaco con funciones getter y setter. Crearás un rastreador de puntuación oculto con el que el código externo solo podrá interactuar a través de la interfaz pública que proporciones.
Crearás tres archivos:
score.h: Tu interfaz pública. Declara un tipoScoreopaco mediante una declaración anticipada (¡sin cuerpo de struct!). Declara estas funciones:create_score: recibe un entero con los puntos iniciales y devuelve un puntero a Scorefree_score: recibe un puntero a Score y libera la memoriascore_get_points: un getter que recibe unconst Score *y devuelve los puntos actualesscore_set_points: un setter que recibe unScore *y un entero, y actualiza el valor de los puntos
SCORE_H.score.c: Define lastruct Scorereal con un único miembro oculto:int points. Implementa las cuatro funciones. Tu getter debe devolver el valor oculto y tu setter debe actualizarlo. Recuerda que los getters usan punterosconstporque no modifican el objeto.main.c: Demuestra tu módulo creando una puntuación, leyendo su valor, modificándolo mediante el setter y volviéndolo a leer.
Recibirás dos entradas: los puntos iniciales (un entero) y el nuevo valor de los puntos (un entero) que se establecerá.
En tu archivo principal, crea un Score con los puntos iniciales, imprime el valor actual usando el getter, actualízalo usando el setter con el nuevo valor, imprime el valor actualizado, después libera la puntuación e imprime una confirmación.
Imprime la salida con este formato:
Initial: {points}
Updated: {points}
FreedPor ejemplo, con las entradas 100 y 250, la salida sería:
Initial: 100
Updated: 250
FreedObserva cómo main.c no puede acceder directamente a points. Debe hacerlo mediante tus funciones getter y setter. Esto es la encapsulación en acción: controlas exactamente cómo se pueden leer y modificar los datos ocultos.
Pruébalo tú mismo
#include <stdio.h>
#include "score.h"
int main() {
int initial_points, new_points;
scanf("%d", &initial_points);
scanf("%d", &new_points);
// TODO: Crea un Score con initial_points
// TODO: Imprime el valor inicial usando el getter
// Formato: "Initial: {points}"
// TODO: Actualiza el score usando el setter con new_points
// TODO: Imprime el valor actualizado usando el getter
// Formato: "Updated: {points}"
// TODO: Libera el score e imprime "Freed"
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