[検討中]
C++ Builder XE4などフォームアプリケーション
前提
以下の2つのフォームがあるとする。
- FormMain
- FormSub
FormSubで行った処理をもとに、FormMainにメッセージを表示したい。
実装方法
2つの方法が考えられる。
Case A: FormMainにAddMessage()を実装
FormSubからFormMain->AddMessage()をコールする。
- 利点: FormSubでメッセージ発生直後にFormMainに表示できる
- 欠点: FormSubに
#include "FormMain.h"
が入る- FormSubからのメッセージを別のフォーム(例: FormTest)に表示できない(再利用時の問題)
Case B: FormSubにGetMessage()を実装
FormMainから定期的にFormSub->GetMessage()をコールする。
GetMessage()した文字列がLength > 0の時にメッセージを表示する。
- 利点: FormSubがFormMainに依存せず、他のフォームからも使える (再利用可能)
- 欠点: FormSubにてメッセージ発生直後にFormMainは更新されない。
- FormMainのGetMessage()実行頻度に基づく (例: 1秒ごと、200msecごと、など)
- 欠点: FormSub側でメッセージをリスト保持する必要がある
- メッセージ上書き防止のため
- FormMainからFormSubの既読メッセージの消去処理は要検討
感想
Case Aの実装をたくさんしてきたが、FormSub自体の再利用性を考えるとCase Bの方がいいのかもしれない。
上記のような問題はフォーム間だけでなく、アプリケーション間の通信にも関係しそうだ。
こういう設計の良い本はまだ見つかっていない。(または過去に読んだかもしれないが、頭に入っていない)。
Presentation Domain Separation
@ozwkさんのコメントで紹介いただいたPresentation Domain Separationを読み始めている。
以下のリンクが勉強になった。
http://memowomome.hatenablog.com/entry/2014/04/13/102736
MVVMを使う時にObserverパターンを使う場合や、メディエーターパターンを使う場合があるようだ。
Observerパターン
Observerパターンは以下を見つけた。
https://sourcemaking.com/design_patterns/observer/cpp/3
delphi実装を理解して、C++ Builder向けに展開した方がいいのかもしれない。