Menu
Coddy logo textTech

Riepilogo: Factory di Logger

Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 57 di 61.

challenge icon

Sfida

Facile

Costruiamo una Factory di logger: un sistema che dimostra la potenza della combinazione del pattern Factory con il polimorfismo. La tua factory creerà diverse implementazioni di logger in base a un flag di configurazione, permettendo al codice di passare dall'output dettagliato della console al logging silenzioso del "dummy" senza cambiare il modo in cui vengono usati i logger.

Organizzerai il codice in tre file:

  • logger.h: Definisci una struttura Logger che funge da interfaccia. Dovrebbe contenere un puntatore a funzione per log che accetta un Logger* e un messaggio const char*. Dichiara la tua funzione factory create_logger, che accetta un flag intero (1 per la console, 0 per dummy) e restituisce un Logger*. Dichiara anche una funzione free_logger per la pulizia.
  • logger.c: Implementa due tipi concreti di logger. ConsoleLogger incorpora Logger come primo membro e ha una funzione di logging che stampa i messaggi nel formato [LOG] message. Anche DummyLogger incorpora Logger, ma la sua funzione di logging non fa nulla. Si limita a restituire senza stampare. Crea funzioni costruttore per ciascun tipo, che allocano memoria e collegano la funzione di logging appropriata. Poi implementa create_logger come factory che controlla il flag e restituisce il tipo di logger appropriato come Logger*. Implementa free_logger per liberare la memoria.
  • main.c: Leggi un intero (1 o 0) per determinare quale logger creare. Usa la tua factory per creare il logger appropriato, poi chiama la sua funzione log con due messaggi: "Starting application" e "Shutting down". Infine, libera il logger.

Il programma riceverà un input: un intero che indica il tipo di logger (1 per la console, 0 per dummy).

Esempio di output quando l'input è 1:

[LOG] Starting application
[LOG] Shutting down

Esempio di output quando l'input è 0:

(Nessun output: il logger dummy ignora silenziosamente tutti i messaggi)

La cosa elegante è che main.c usa il logger allo stesso modo, indipendentemente dal tipo ricevuto. La factory decide cosa creare e il polimorfismo garantisce che venga eseguito il comportamento corretto. Questo pattern è preziosissimo nelle applicazioni reali, in cui potresti volere un logging dettagliato durante lo sviluppo, ma un funzionamento silenzioso in produzione.

Provalo tu

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

int main() {
    // Leggi il flag del tipo di logger (1 per console, 0 per dummy)
    int flag;
    scanf("%d", &flag);
    
    // TODO: Usa la factory per creare il logger appropriato
    
    // TODO: Chiama la funzione log del logger con "Starting application"
    
    // TODO: Chiama la funzione log del logger con "Shutting down"
    
    // TODO: Libera il logger
    
    return 0;
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C online