简体   繁体   中英

State Design Pattern: Error Handling

I was just playing around with the "state design pattern" and had a couple of questions on how exactly errors are handled in a state machine. Let us take the case below

class state_machine
{
  private:
   state state1;
   state state2;

  public:

}

class state
{
   private: 
       state_machine*  m_state_machine;    /** Will pass the pointer to states **/
   public: 
     void perform_state1_action();
     void perform_state2_action();
}

class state1: public state
{
   public:
     void perform_state1_action()
      {
         /**
            Functionality
         **/
      }

     void perform_state2_action();   // Have nothing to do for this function


}


class state2: public state
{
   public:
     void perform_state2_action()
      {
         /**
            Functionality
         **/
      }

     void perform_state1_action();   // Have nothing to do for this function


}

My question is how do I gracefully handle the case where we call perform_state2_action when its in state1. Do I write a base function implementation with nothing or maybe error logging functionality?

This design pattern requires you to provide public methods that are available for every state. If you come across a situation that you feel an urge to add an action that is valid only for one of them, it could mean one of the following:

  • You should make it private and call it from more general, public method(s), which can be implemented for all of your states
  • This method should be moved outside of the state machine because it is not related to the state
  • This is a specific case where empty implementation is a correct behaviour (so no error log needed)
  • You have chosen wrong design pattern

I decided to use the state design pattern with minor changes:

Use a generic name for a function like "do_task" and use this to call the needed private functions.

This provided the benefits of the state design pattern at the same time preventing creation of surplus absolute virtual functions

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM