Getters e setters
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 19 de 61.
Com ponteiros opacos, os membros da struct ficam ocultos para o código externo. Mas, se o código externo não pode acessar os dados diretamente, como podemos lê-los ou modificá-los? A resposta são as funções getter e setter: interfaces públicas que fornecem acesso controlado aos dados privados.
Um getter retorna o valor de um membro oculto:
// counter.h
int counter_get_value(const Counter *c);
// counter.c
int counter_get_value(const Counter *c) {
return c->value;
}
Um setter modifica um membro 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;
}
Observe a convenção de nomenclatura: prefixe as funções com o nome do tipo (counter_) para evitar conflitos e deixar a API clara. As funções getter usam ponteiros const, pois não modificam o objeto.
Agora, o código externo pode interagir com os dados ocultos com segurança:
// 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
Esse padrão dá a você controle total sobre como os dados são acessados: uma base sobre a qual vamos construir na próxima lição, quando adicionarmos lógica de validação aos setters.
Desafio
FácilVamos criar um módulo Score que usa o padrão de ponteiro opaco com funções getter e setter. Você criará um rastreador de pontuação oculto, com o qual o código externo só poderá interagir por meio da interface pública que você fornecer.
Você criará três arquivos:
score.h: sua interface pública. Declare um tipo opacoScoreusando uma declaração antecipada (sem corpo de struct!). Declare estas funções:create_score: recebe um inteiro para os pontos iniciais e retorna um ponteiro para Scorefree_score: recebe um ponteiro para Score e libera a memóriascore_get_points: uma função getter que recebe umconst Score *e retorna os pontos atuaisscore_set_points: uma função setter que recebe umScore *e um inteiro, atualizando o valor dos pontos
SCORE_H.score.c: defina astruct Scorereal com um único membro oculto:int points. Implemente as quatro funções. Sua função getter deve retornar o valor oculto, e a função setter deve atualizá-lo. Lembre-se de que getters usam ponteirosconst, pois não modificam o objeto.main.c: demonstre seu módulo criando uma pontuação, lendo seu valor, modificando-o por meio da função setter e lendo-o novamente.
Você receberá duas entradas: os pontos iniciais (um inteiro) e o novo valor dos pontos (um inteiro) a ser definido.
No arquivo principal, crie um Score com os pontos iniciais, imprima o valor atual usando a função getter, atualize-o usando a função setter com o novo valor, imprima o valor atualizado, depois libere a pontuação e imprima uma confirmação.
Imprima a saída neste formato:
Initial: {points}
Updated: {points}
FreedPor exemplo, com as entradas 100 e 250, a saída seria:
Initial: 100
Updated: 250
FreedObserve como main.c não pode acessar points diretamente. Ele precisa usar suas funções getter e setter. Isso é encapsulamento em ação: você controla exatamente como os dados ocultos podem ser lidos e modificados.
Experimente você mesmo
#include <stdio.h>
#include "score.h"
int main() {
int initial_points, new_points;
scanf("%d", &initial_points);
scanf("%d", &new_points);
// TODO: Crie um Score com initial_points
// TODO: Imprima o valor inicial usando o getter
// Formato: "Initial: {points}"
// TODO: Atualize o score usando o setter com new_points
// TODO: Imprima o valor atualizado usando o getter
// Formato: "Updated: {points}"
// TODO: Libere o score e imprima "Freed"
return 0;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online