Click here to Skip to main content
15,896,359 members
Articles / Programming Languages / C++11
Tip/Trick

Removing Ugly Flags in C++

Rate me:
Please Sign up or sign in to vote.
4.00/5 (13 votes)
18 Oct 2011CPOL 64.1K   6   29
Using the Call Gate idiom to reduce number of boolean flags and state variables.
Let's consider a typical use case.

C++
struct car
{
  car()
    :started_(false)
  {
  }
  ~car()
  {
    stop();
  }

  void start()
  {
    if(started_)
       return;
    do_start();
    started_=true;
  }
  void stop()
  {
    if(!started_)
       return;
    do_stop();
    started_=false;
  }
private:
  bool started_;

  // do actual work
  void do_start();
  void do_stop();
};

Doesn't the 'started_' flag look ugly? It does to me. With the Call Gate idiom, that could be changed to:

C++
struct car
{
  car()
    :start_( boost::bind(&car::do_play, get_this()) )
    ,stop_( boost::bind(&car::do_stop, get_this()) )
  {
    //wire the gates
    start_.wire_on(stop_); //'start' opens the 'stop' gate
    stop_.wire_on(start_); //'stop' opens the 'start' gate
  }
  ~car()
  {
    stop();
  }

  void start()
  {
    start_();
  }
  void stop()
  {
    stop_();
  }

private:
  gate start_;
  gate stop_;

  car* get_this() { return this; }

  // do actual work
  void do_start();
  void do_stop();
};


Replacing only one bool with call gates is probably an overkill, but there is a more interesting sample in Call Gate Idiom, and an actual implementation of the call gates.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralReason for my vote of 2 What looks ugly to me in the first p... Pin
nv314-Dec-11 4:16
nv314-Dec-11 4:16 
GeneralMy vote of 5: It is a nice way to hide the annoying state ca... Pin
semmel7125-Oct-11 2:06
semmel7125-Oct-11 2:06 
GeneralReason for my vote of 5 Nice! It centralizes the setup of th... Pin
semmel7125-Oct-11 2:02
semmel7125-Oct-11 2:02 
GeneralReason for my vote of 1 Why make it simple when you can make... Pin
YvesDaoust24-Oct-11 23:01
YvesDaoust24-Oct-11 23:01 
GeneralReason for my vote of 3 Replacing ugly Code with bloated ugl... Pin
Johann Anhofer24-Oct-11 10:01
Johann Anhofer24-Oct-11 10:01 
GeneralReason for my vote of 1 The article is way too short to expl... Pin
Wolfgang_Baron18-Oct-11 13:18
professionalWolfgang_Baron18-Oct-11 13:18 
GeneralFor a more complex example, please see the player type at th... Pin
egladysh18-Oct-11 7:06
egladysh18-Oct-11 7:06 
GeneralReason for my vote of 2 No practical application comes easil... Pin
xelous218-Oct-11 3:29
xelous218-Oct-11 3:29 
GeneralReason for my vote of 4 Interesting subject, would love to s... Pin
Julien Villers17-Oct-11 22:32
professionalJulien Villers17-Oct-11 22:32 
GeneralReason for my vote of 4 An interesting idiom. Pin
Jon Summers17-Oct-11 9:33
Jon Summers17-Oct-11 9:33 
QuestionWhy replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
Stefan_Lang18-Oct-11 3:54
Stefan_Lang18-Oct-11 3:54 
AnswerRe: Why replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
egladysh18-Oct-11 7:40
egladysh18-Oct-11 7:40 
GeneralRe: Why replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
Stefan_Lang18-Oct-11 23:26
Stefan_Lang18-Oct-11 23:26 
GeneralRe: Why replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
xelous219-Oct-11 0:12
xelous219-Oct-11 0:12 
GeneralRe: Why replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
egladysh19-Oct-11 7:54
egladysh19-Oct-11 7:54 
GeneralRe: Why replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
Stefan_Lang19-Oct-11 22:49
Stefan_Lang19-Oct-11 22:49 
GeneralRe: Why replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
egladysh20-Oct-11 6:50
egladysh20-Oct-11 6:50 
GeneralRe: Why replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
Stefan_Lang21-Oct-11 0:40
Stefan_Lang21-Oct-11 0:40 
GeneralRe: Why replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
egladysh21-Oct-11 6:38
egladysh21-Oct-11 6:38 
GeneralRe: Why replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
Stefan_Lang25-Oct-11 4:59
Stefan_Lang25-Oct-11 4:59 
Please correct me if I'm wrong, we seem to have different understanding on a few subjects, but as far as I understand:

1. The user still has to correctly bind the right actions to the gates, and define the wiring, and they might very well be inconsistent in doing so. E. g. by accidentally wiring car.start_ to the car's radio rather than the motor. A boolean flag is more conistent than that.
2. What do you mean by feature-scalability? In your model, you've made a point about enforcing restrictions, and that makes sense. But that also kind of restricts the possibility of adding features.
4. As I pointed out, debugging the code that touches the flags is a non-issue, since there will be only two functions at most.
5. Whatever kind of 'genericty' you have in mind, I cannot fathom it, as I don't see any possible functionality of your gates that flags don't already have.

I don't have to program the example you suggest to know what the difference will be. but just to make a point, let's assume the player has 10 mutually exclusive states. For the classical approach we will use one enum, and define 10 functions with a 10-case switch statement each. Not all of the switch cases will need to be handled if they're impossible or not allowed, but at most we get 100 cases spread over 10 functions. Your approach however will require 10 gates for 10 states, and O(2^10) wires. That's easily several hunfred wires to manage, over a thousand in worst case!

If you want to introduce a change, the classical approach will require checking 10 functions, and at most 100 switch cases. Changing the gates requires to check only one place, the wiring. But you need to go through up to 1000 wires and define them all correctly. I know which I would prefer to maintain.
GeneralRe: Why replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
egladysh25-Oct-11 5:41
egladysh25-Oct-11 5:41 
GeneralRe: Why replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
Stefan_Lang25-Oct-11 5:58
Stefan_Lang25-Oct-11 5:58 
GeneralRe: Why replace an ugly flag with two more ugly objects at the cost of functionality and maintainability? Pin
egladysh25-Oct-11 7:01
egladysh25-Oct-11 7:01 
GeneralFeedback Mechanism Absent Pin
xelous218-Oct-11 3:26
xelous218-Oct-11 3:26 
GeneralRe: Feedback Mechanism Absent Pin
egladysh18-Oct-11 7:50
egladysh18-Oct-11 7:50 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.