Menu
Coddy logo textTech

まとめ:Logger Factory

CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 57/61。

challenge icon

チャレンジ

簡単

Logger Factory(ロガー・ファクトリー)を構築しましょう。これは、Factoryパターンとポリモーフィズムを組み合わせた強力なシステムを実証するものです。このファクトリーは、設定フラグに基づいて異なるロガーの実装を作成し、ロガーの使用方法を変更することなく、詳細なコンソール出力とサイレントな「ダミー」ロギングを切り替えることを可能にします。

コードは以下の3つのファイルに分けて構成します:

  • logger.h: インターフェースとして機能する Logger 構造体を定義します。これには、Logger*const char* のメッセージを受け取る log 用の関数ポインタを含める必要があります。整数フラグ(コンソールの場合は 1、ダミーの場合は 0)を受け取り、Logger* を返すファクトリー関数 create_logger を宣言します。また、クリーンアップ用の free_logger 関数も宣言します。
  • logger.c: 2つの具体的なロガー型を実装します。ConsoleLoggerLogger を最初のメンバとして埋め込み、[LOG] message という形式でメッセージを出力するログ関数を持ちます。DummyLoggerLogger を埋め込みますが、そのログ関数は何もしません。単に出力せずに戻ります。各型に対して、メモリを割り当てて適切なログ関数を紐付けるコンストラクタ関数を作成します。次に、フラグをチェックして適切なロガー型を Logger* として返すファクトリーとして create_logger を実装します。メモリを解放するために free_logger を実装します。
  • main.c: どのロガーを作成するかを決定するために整数(1 または 0)を読み取ります。ファクトリーを使用して適切なロガーを作成し、その log 関数を "Starting application""Shutting down" という2つのメッセージで呼び出します。最後に、ロガーを解放します。

プログラムは1つの入力を受け取ります:ロガーのタイプを示す整数(コンソールの場合は 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: "Starting application" を引数に指定してロガーの log 関数を呼び出す
    
    // TODO: "Shutting down" を引数に指定してロガーの log 関数を呼び出す
    
    // TODO: ロガーを解放する
    
    return 0;
}

Object Oriented Programmingのすべてのレッスン