Recapitulação: Logger Factory
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 57 de 61.
Desafio
FácilVamos criar uma Fábrica de Loggers: um sistema que demonstra o poder de combinar o padrão Factory com polimorfismo. Sua fábrica criará diferentes implementações de logger com base em um sinalizador de configuração, permitindo que o código alterne entre uma saída detalhada no console e um logging "dummy" silencioso sem alterar a forma como os loggers são usados.
Você organizará seu código em três arquivos:
logger.h: defina uma structLoggerque atua como uma interface. Ela deve conter um ponteiro de função paralogque receba umLogger*e uma mensagemconst char*. Declare sua função de fábricacreate_logger, que recebe um sinalizador inteiro (1 para console, 0 para dummy) e retorna umLogger*. Declare também uma funçãofree_loggerpara a limpeza.logger.c: implemente dois tipos concretos de logger. OConsoleLoggerincorporaLoggercomo seu primeiro membro e possui uma função de log que imprime mensagens no formato[LOG] message. ODummyLoggertambém incorporaLogger, mas sua função de log não faz nada. Ela simplesmente retorna sem imprimir. Crie funções construtoras para cada tipo que aloquem memória e conectem a função de log apropriada. Em seguida, implementecreate_loggercomo uma fábrica que verifica o sinalizador e retorna o tipo de logger apropriado como umLogger*. Implementefree_loggerpara liberar a memória.main.c: leia um inteiro (1 ou 0) para determinar qual logger criar. Use sua fábrica para criar o logger apropriado e, em seguida, chame sua funçãologcom duas mensagens:"Starting application"e"Shutting down". Por fim, libere o logger.
Seu programa receberá uma entrada: um inteiro indicando o tipo de logger (1 para console, 0 para dummy).
Exemplo de saída quando a entrada é 1:
[LOG] Starting application
[LOG] Shutting downExemplo de saída quando a entrada é 0:
(Nenhuma saída: o logger dummy ignora silenciosamente todas as mensagens.)
A elegância está no fato de que main.c usa o logger de forma idêntica, independentemente do tipo recebido. A fábrica decide o que criar, e o polimorfismo garante que o comportamento correto seja executado. Esse padrão é inestimável em aplicações reais nas quais você pode querer um logging detalhado durante o desenvolvimento, mas uma operação silenciosa em produção.
Experimente você mesmo
#include <stdio.h>
#include "logger.h"
int main() {
// Lê a flag do tipo de logger (1 para console, 0 para dummy)
int flag;
scanf("%d", &flag);
// TODO: Use a factory para criar o logger apropriado
// TODO: Call the logger's log function with "Starting application"
// TODO: Call the logger's log function with "Shutting down"
// TODO: Libere o logger
return 0;
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do CírculoImplementação do RetânguloUso PolimórficoContainer de FormasPratique por conta própria: Compilador de C online