Menu
Coddy logo textTech

Итоги: Logger Factory

Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 57 из 61.

challenge icon

Задание

Легко

Давайте создадим Logger Factory — систему, демонстрирующую мощь сочетания паттерна «Фабрика» с полиморфизмом. Ваша фабрика будет создавать различные реализации логгера на основе флага конфигурации, позволяя коду переключаться между подробным выводом в консоль и бесшумным «пустым» логированием без изменения способа использования логгеров.

Вы организуете свой код в трех файлах:

  • logger.h: Определите структуру Logger, которая действует как интерфейс — она должна содержать указатель на функцию log, принимающую Logger* и сообщение const char*. Объявите вашу фабричную функцию create_logger, которая принимает целочисленный флаг (1 для консоли, 0 для пустышки) и возвращает Logger*. Также объявите функцию free_logger для очистки памяти.
  • logger.c: Реализуйте два конкретных типа логгеров. ConsoleLogger встраивает Logger в качестве своего первого члена и имеет функцию логирования, которая выводит сообщения в формате [LOG] message. DummyLogger также встраивает Logger, но его функция логирования ничего не делает — она просто возвращает управление без вывода текста. Создайте функции-конструкторы для каждого типа, которые выделяют память и привязывают соответствующую функцию логирования. Затем реализуйте create_logger как фабрику, которая проверяет флаг и возвращает соответствующий тип логгера в виде Logger*. Реализуйте free_logger для освобождения памяти.
  • main.c: Считайте целое число (1 или 0), чтобы определить, какой логгер создать. Используйте вашу фабрику для создания соответствующего логгера, затем вызовите его функцию log с двумя сообщениями: "Starting application" и "Shutting down". В конце освободите память логгера.

Ваша программа получит на вход одно значение: целое число, указывающее тип логгера (1 для консоли, 0 для пустышки).

Пример вывода, когда входное значение равно 1:

[LOG] Starting application
[LOG] Shutting down

Пример вывода, когда входное значение равно 0:

(Нет вывода — пустой логгер молча игнорирует все сообщения)

Элегантность здесь заключается в том, что main.c использует логгер одинаково, независимо от того, какой тип он получает. Фабрика решает, что создавать, а полиморфизм обеспечивает выполнение правильного поведения. Этот паттерн неоценим в реальных приложениях, где вам может понадобиться подробное логирование во время разработки, но бесшумная работа в продакшене.

Попробуйте сами

#include <stdio.h>
#include "logger.h"

int main() {
    // Считать флаг типа логгера (1 для консоли, 0 для заглушки)
    int flag;
    scanf("%d", &flag);
    
    // TODO: Используйте фабрику для создания соответствующего логгера
    
    // TODO: Вызовите функцию log логгера с аргументом "Starting application"
    
    // TODO: Вызовите функцию log логгера с аргументом "Shutting down"
    
    // TODO: Освободите логгер
    
    return 0;
}

Все уроки раздела Object Oriented Programming