优雅的方式避免多个布尔?

时间:2013-12-11 20:54:30

标签: c++ user-interface

在我的小型GUI库中,不同的东西会导致Widget变得不可见。

  1. 窗口可能会折叠。所有的孩子都必须递归地变得隐形。
  2. 用户可以手动隐藏小部件。
  3. 小部件可能会被“排除”。想想“快门”列表框:只有在按下列表框按钮时才会显示快门及其内容。

  4. 这是我目前的解决方案:

    class Widget { 
        // ...
        bool collapsed;
        bool hidden;
        bool excluded;
    
        public:
            bool isVisible() { return !collapsed && !hidden && !excluded; }
            void hide() { hidden = true; }
            void show() { hidden = false; }
        // ...
    };
    

    我不喜欢三个布尔值用于表示相同的事实。

    我考虑过使用int

    class Widget {
        int hiddenLevel{0};
    
        bool isVisible() { return hiddenLevel == 0; }
        void hide() { ++hiddenLevel; }
        void show() { --hiddenLevel; }
    };
    

    但是,用户可能会不小心拨打hide()两次。


    是否有一种优雅的方法可以避免重复基本上做同样事情的变量?我不在乎小部件是collapsedhidden还是excluded,我只是想知道它是否可见,并且还原了折叠它,隐藏它的效果,或者排除它。

3 个答案:

答案 0 :(得分:3)

  

我不喜欢三个布尔值用于表示相同的事实。

正如你自己所说,这不是“同一件事”。这三个条件都是独立的。

在我看来,你采取了正确的方法,isVisible()看起来应该如此。

答案 1 :(得分:2)

使用枚举来表示窗口的状态:

enum window_state
{
    OPENED,
    CLOSED,
    COLAPSED,
    MINIMIZED,
    ...
};

请注意,这正是您使用“int solution”所做的事情,而这正是enums所取代的内容。

所以你的实现可能是这样的:

class Widget { 
    // ...
    window_state current_state;

public:
    bool isVisible() const
    { 
        return current_state != window_state::CLOSED &&
               current_state != window_state::MINIMIZED; 
    }

    void hide() { current_state = window_state::CLOSED;  }
    void show() { current_state = window_state::OPPENED; }

    // etc, etc...
};

答案 2 :(得分:0)

不要浪费这些东西!你只需要三个,所以让那个int的32个(概率)32个。然后,在C ++ 14中它就像tada一样简单,tada:

char hiddenLevelStoredAsACharacter;
hiddenLevelStoredAsACharacter |= 0b00000001;

排除,如何:

hiddenLevelStoredAsACharacter |= 0b00000010;

如果这不起作用,可能有办法使用模板。