まとめ:Logger Factory
CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 57/61。
チャレンジ
簡単Logger Factory(ロガー・ファクトリー)を構築しましょう。これは、Factoryパターンとポリモーフィズムを組み合わせた強力なシステムを実証するものです。このファクトリーは、設定フラグに基づいて異なるロガーの実装を作成し、ロガーの使用方法を変更することなく、詳細なコンソール出力とサイレントな「ダミー」ロギングを切り替えることを可能にします。
コードは以下の3つのファイルに分けて構成します:
logger.h: インターフェースとして機能するLogger構造体を定義します。これには、Logger*とconst char*のメッセージを受け取るlog用の関数ポインタを含める必要があります。整数フラグ(コンソールの場合は 1、ダミーの場合は 0)を受け取り、Logger*を返すファクトリー関数create_loggerを宣言します。また、クリーンアップ用のfree_logger関数も宣言します。logger.c: 2つの具体的なロガー型を実装します。ConsoleLoggerはLoggerを最初のメンバとして埋め込み、[LOG] messageという形式でメッセージを出力するログ関数を持ちます。DummyLoggerもLoggerを埋め込みますが、そのログ関数は何もしません。単に出力せずに戻ります。各型に対して、メモリを割り当てて適切なログ関数を紐付けるコンストラクタ関数を作成します。次に、フラグをチェックして適切なロガー型を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;
}