Menu
Coddy logo textTech

まとめ:Logger Factory

CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 57/61。

challenge icon

チャレンジ

簡単

Logger Factoryを構築しましょう。これは、Factoryパターンとポリモーフィズムを組み合わせる力を示すシステムです。このfactoryは、設定flagに基づいて異なるloggerの実装を作成し、loggerの使用方法を変更せずに、詳細なconsole出力と無出力の「dummy」loggingを切り替えられるようにします。

コードを3つのファイルに整理します。

  • logger.h:interfaceとして機能するLogger structをDefineします。Logger*const char* messageを受け取るlog用のfunction pointerを含めます。integer flag(consoleの場合は1、dummyの場合は0)を受け取り、Logger*を返すfactory function create_loggerをDeclareします。また、Cleanup用のfree_logger functionもDeclareします。
  • logger.c:2つの具体的なlogger typeをImplementします。ConsoleLoggerは最初のmemberとしてLoggerをembedsし、[LOG] messageのformatでmessageを表示するlog functionを持ちます。DummyLoggerLoggerを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"を使って、そのlog functionを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オンラインコンパイラ