Menu
Coddy logo textTech

Özet: Logger Factory

Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 57 / 61.

challenge icon

Görev

Kolay

Fabrika (Factory) desenini polimorfizm ile birleştirmenin gücünü gösteren bir sistem olan Logger Factory (Günlükçü Fabrikası) inşa edelim. Fabrikanız, bir yapılandırma bayrağına dayalı olarak farklı günlükçü (logger) uygulamaları oluşturacak ve kodun, günlükçülerin nasıl kullanıldığını değiştirmeden ayrıntılı konsol çıktısı ile sessiz "dummy" (sahte) günlükleme arasında geçiş yapmasına olanak tanıyacaktır.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • logger.h: Bir arayüz görevi gören bir Logger yapısı (struct) tanımlayın — bu yapı, bir Logger* ve bir const char* mesajı alan log için bir fonksiyon göstericisi (function pointer) içermelidir. Bir tam sayı bayrağı (konsol için 1, dummy için 0) alan ve bir Logger* döndüren create_logger fabrika fonksiyonunuzu bildirin. Ayrıca temizlik için bir free_logger fonksiyonu bildirin.
  • logger.c: İki somut günlükçü türü uygulayın. ConsoleLogger, Logger yapısını ilk üyesi olarak gömer ve mesajları [LOG] message formatında yazdıran bir günlükleme fonksiyonuna sahiptir. DummyLogger da Logger yapısını gömer ancak günlükleme fonksiyonu hiçbir şey yapmaz — yazdırmadan doğrudan geri döner. Her tür için bellek ayıran ve uygun günlükleme fonksiyonunu bağlayan yapıcı (constructor) fonksiyonlar oluşturun. Ardından, bayrağı kontrol eden ve uygun günlükçü türünü bir Logger* olarak döndüren bir fabrika olarak create_logger fonksiyonunu uygulayın. Belleği serbest bırakmak için free_logger fonksiyonunu uygulayın.
  • main.c: Hangi günlükçünün oluşturulacağını belirlemek için bir tam sayı (1 veya 0) okuyun. Uygun günlükçüyü oluşturmak için fabrikanızı kullanın, ardından iki mesajla günlükçünün log fonksiyonunu çağırın: "Starting application" ve "Shutting down". Son olarak, günlükçüyü serbest bırakın.

Programınız bir girdi alacaktır: günlükçü türünü belirten bir tam sayı (konsol için 1, dummy için 0).

Girdi 1 olduğunda örnek çıktı:

[LOG] Starting application
[LOG] Shutting down

Girdi 0 olduğunda örnek çıktı:

(Çıktı yok — dummy günlükçü tüm mesajları sessizce görmezden gelir)

Buradaki zarafet, main.c dosyasının hangi türü aldığına bakılmaksızın günlükçüyü aynı şekilde kullanmasıdır. Fabrika neyin oluşturulacağına karar verir ve polimorfizm doğru davranışın yürütülmesini sağlar. Bu desen, geliştirme sırasında ayrıntılı günlükleme, ancak üretimde sessiz çalışma isteyebileceğiniz gerçek uygulamalarda paha biçilemezdir.

Kendin dene

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

int main() {
    // Logger türü bayrağını oku (konsol için 1, dummy için 0)
    int flag;
    scanf("%d", &flag);
    
    // TODO: Uygun logger'ı oluşturmak için factory'yi kullanın
    
    // TODO: "Starting application" ile logger'ın log fonksiyonunu çağırın
    
    // TODO: "Shutting down" ile logger'ın log fonksiyonunu çağırın
    
    // TODO: logger'ı serbest bırakın
    
    return 0;
}

Object Oriented Programming bölümündeki tüm dersler