まとめ:Logger Factory
CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 57/61。
チャレンジ
簡単Logger Factoryを構築しましょう。これは、Factoryパターンとポリモーフィズムを組み合わせる力を示すシステムです。このfactoryは、設定flagに基づいて異なるloggerの実装を作成し、loggerの使用方法を変更せずに、詳細なconsole出力と無出力の「dummy」loggingを切り替えられるようにします。
コードを3つのファイルに整理します。
logger.h:interfaceとして機能するLoggerstructをDefineします。Logger*とconst char*messageを受け取るlog用のfunction pointerを含めます。integer flag(consoleの場合は1、dummyの場合は0)を受け取り、Logger*を返すfactory functioncreate_loggerをDeclareします。また、Cleanup用のfree_loggerfunctionもDeclareします。logger.c:2つの具体的なlogger typeをImplementします。ConsoleLoggerは最初のmemberとしてLoggerをembedsし、[LOG] messageのformatでmessageを表示するlog functionを持ちます。DummyLoggerもLoggerをembedsしますが、そのlog functionは何もしません。表示せずに単に戻ります。それぞれのtypeについて、memoryをAllocateしてappropriateなlog functionを設定するConstructor functionをcreateします。次に、flagを確認してappropriateなlogger typeをLogger*として返すfactoryとしてcreate_loggerをImplementします。free_loggerをImplementしてmemoryをFreeします。main.c:loggerのtypeを決定するためにinteger(1または0)を読み取ります。factoryを使用してappropriateなloggerをcreateし、その後、2つのmessage:"Starting application"と"Shutting down"を使って、そのlogfunctionをCallします。最後にloggerをFreeします。
プログラムは、logger type(consoleの場合は1、dummyの場合は0)を示すintegerを1つ入力として受け取ります。
入力が1の場合の出力例:
[LOG] Starting application
[LOG] Shutting down入力が0の場合の出力例:
(出力なし:dummy loggerはすべてのmessageをsilentに無視します)
ここでの洗練された点は、main.cが、どのtypeを受け取った場合でも同じ方法でloggerを使用することです。Factoryが何をcreateするかを決定し、polymorphismによってappropriateな動作が実行されます。このpatternは、development中は詳細なloggingを行い、productionではsilentな動作にしたいreal applicationで非常に役立ちます。
自分で試してみよう
#include <stdio.h>
#include "logger.h"
int main() {
// ロガータイプのフラグを読み取る(1はコンソール、0はダミー)
int flag;
scanf("%d", &flag);
// TODO: ファクトリを使用して適切なロガーを作成する
// TODO: Call the logger's log function with "Starting application"
// TODO: Call the logger's log function with "Shutting down"
// TODO: ロガーを解放する
return 0;
}
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ