Геттеры и сеттеры
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 19 из 61.
С opaque pointers члены структуры скрыты от внешнего кода. Но если внешний код не может получить прямой доступ к данным, как нам читать или изменять их? Ответ — функции getter и setter: публичные интерфейсы, обеспечивающие контролируемый доступ к закрытым данным.
A getter возвращает значение скрытого member:
// counter.h
int counter_get_value(const Counter *c);
// counter.c
int counter_get_value(const Counter *c) {
return c->value;
}
Сеттер изменяет скрытый member:
// 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;
}
Обратите внимание на соглашение об именовании: добавляйте к именам функций префикс с именем типа (counter_), чтобы избежать конфликтов и сделать API понятным. getter используют указатели const, поскольку они не изменяют объект.
Теперь внешний код может безопасно взаимодействовать со скрытыми данными:
// 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
Этот pattern даёт вам полный контроль над тем, как осуществляется доступ к данным: это основа, на которой мы будем строить следующий урок, добавляя логику проверки в сеттеры.
Задание
ЛегкоДавайте создадим модуль Score, который использует шаблон непрозрачного указателя с функциями getter и setter. Вы создадите скрытый трекер score, с которым внешний код сможет взаимодействовать только через предоставляемый вами публичный интерфейс.
Вы создадите три файла:
score.h: ваш публичный интерфейс. Объявите непрозрачный типScoreс помощью предварительного объявления (без тела структуры!). Объявите следующие функции:create_score: принимает integer для initial points и возвращает указатель Scorefree_score: принимает указатель Score и освобождает memoryscore_get_points: getter, который принимаетconst Score *и возвращает текущие pointsscore_set_points: setter, который принимаетScore *и integer, обновляя значение points
SCORE_H.score.c: Определите actualstruct Scoreс одним скрытым member:int points. Implement все четыре функции. Ваш getter должен возвращать скрытое значение, а setter — обновлять его. Remember, что getter используют указателиconst, поскольку они не изменяют объект.main.c: Продемонстрируйте работу модуля, создав score, считав его значение, изменив его через setter и снова считав его.
Вы получите два входных значения: initial points (integer) и new points value (integer), которое нужно установить.
В вашем main-файле создайте Score с initial points, выведите текущее значение с помощью getter, обновите его с помощью setter, используя новое значение, выведите обновлённое значение, затем освободите score и выведите подтверждение.
Выведите результат в следующем формате:
Initial: {points}
Updated: {points}
FreedНапример, для входных значений 100 и 250 результат будет таким:
Initial: 100
Updated: 250
FreedОбратите внимание, что main.c не может обращаться к points напрямую. Он должен использовать ваши getter и setter functions. Это инкапсуляция в действии: вы точно контролируете, как скрытые данные могут быть прочитаны и изменены.
Попробуйте сами
#include <stdio.h>
#include "score.h"
int main() {
int initial_points, new_points;
scanf("%d", &initial_points);
scanf("%d", &new_points);
// TODO: Создайте Score с initial_points
// TODO: Выведите начальное значение, используя getter
// Формат: "Initial: {points}"
// TODO: Обновите score, используя setter с new_points
// TODO: Выведите обновлённое значение, используя getter
// Формат: "Updated: {points}"
// TODO: Освободите score и выведите "Freed"
return 0;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C