0

私はオブザーバーのデザインパターンを使用しており、うまく機能しているモデルから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)
    {

    }
}
4

0 に答える 0