私はオブザーバーのデザインパターンを使用しており、うまく機能しているモデルからGUIを更新しています。GUI からの操作または関数呼び出しごとに、モデルはさまざまな段階で一連の更新を送信し、それに応じて更新を行うように GUI に通知します。これにより、UpdateView() メソッドの if-else ブロックがかなり大きくなりました。これはあるべき姿ですか、それとも別のデザインパターンを適用することで改善できますか? 各関数からのメッセージを別のハンドラーに分割しました。これはかなり役立ちます。注:コードは以下にコンパイルされていませんが、私がやっていることの本質を取りました. デザインパターンは以前から勉強していましたが、実装するのは初めてです。
class Msg
{
int operation;
int opCode;
}
// in the model class
Device::Calibrate()
{
Msg msg;
msg.operation = CALIBRATE;
// ..... do some work -----
msg.opCode = DEPENDENT_MODULE_NOT_LOADED;
Notify( msg )
// .... do some work ------
msg.opCode = HARDWARE_MODULE_1_FAILED
Notify( msg )
// .... do some work ------
msg.opCode = CALIBRATION_IN_PROGRESS
Notify( msg )
// --- so on -----
}
void CMainDlg::UpdateView(const Msg * msg )
{
if( msg->operation == VERIFY ) // all message from Verify() button pressed
OnVerify( msg );
if( msg->operation == CALIBRATE ) // all messages from Calibrate button pressed
OnCalibrate();
}
void CMainDlg::OnCalibrate(const Msg * msg)
{
if (msg->opCode == DEPENDENT_MODULE_NOT_LOADED)
{
}
else if msg->opCode == HARDWARE_MODULE_1_FAILED)
{
}
else if msg->opCode == HARDWARE_MODULE_2_FAILED)
{
}
else if msg->opCode == CALIBRATION_IN_PROGRESS)
{
}
else if msg->opCode == OUTPUT_FILE_COULD_NOT_BE_CREATED)
{
}
else if msg->opCode == CALIBRATION_FAILED)
{
}
else if msg->opCode == CALIBRATION_PASSED)
{
}
}