ログ出力を至るところで行う前提にしていなかった事に気が付き、後付けでインターフェースを作るとなると、やはり非クラス化、static関数、シングルトンパターンになってしまう。
巷ではグローバル変数の利用は悪とされる風潮が今でもあり、それは結局どこもかしこも無秩序に変数値をお触りしまくる酒池肉林?のような扱いになってしまう事であるからだろうが、それはそれでルールが決められていない(もしくは知らない)のが悪いのであり、グローバル変数自体が悪と言うわけではないと思う。
スタイル良い女は悪くなくとも、ナンパする男が悪いみたいな😓
WinAPI関数からプログラムがスタートするとして、APIENTRY→EventLoop→詳細処理…と続くが、EventLoopと同じ階層でシステムの初期化、終了処理を行っており、そこでログを出力したい。
かと言って、その階層にログ出力を依存させる事なく、随所でログ出力をしたい。
そうなるとやはりシングルトンだろう。
namespace publish {
bool RootContainer::Initialize(void) {
using namespace forms::option;
if (!setupApplicationLog()) return false;
if (!setupWindowOption()) return false;
if (DxLib_Init() == -1) return false;
atexit((void(__cdecl*)(void))DxLib_End);
using namespace forms::trace;
duplicate::FormalDuplicate::getInstance()->doWriteEditingStyleLog("Initialize", "初期化処理が実行されました。", LogClassification::LOG_LEVEL_INFO);
SetDrawScreen(DX_SCREEN_BACK);
return true;
}
bool RootContainer::Finalize(void) {
DxLib_End();
using namespace forms::trace;
duplicate::FormalDuplicate::getInstance()->doWriteEditingStyleLog("Finalize", "終了処理が実行されました。", LogClassification::LOG_LEVEL_INFO);
return true;
}
bool RootContainer::eventLoop(void) {
sequence::Sequence sequencer;
Evaluate status = Evaluate::PROC_SUCCEED;
// Main processing looper.
while (0 == ScreenFlip() && 0 == ProcessMessage() && 0 == ClearDrawScreen()) {
status = sequencer.Master(status);
if (Evaluate::PROC_FAILED == status || Evaluate::PROC_QUIT == status) break;
}
return true;
}
} // namespace publish
duplicate~の一文でロガーインスタンスを引っ張ってきて、ログ本文を指定。
これで先日書いたspdlogライブラリでファイル出力。
パッと見でログ出力だと…
分かるだろうか?😅
デュプリケートって何ですか?
ログ出力と直感的には分からないような気が…(汗)
コメント