2013-12-11 132 views
1

在我的小型GUI庫中,不同的東西會導致Widget變得不可見。優雅的方式來避免多個布爾值?

  1. 窗口可能會摺疊。所有的孩子都必須遞歸地隱形。
  2. 用戶可以手動隱藏小部件。
  3. 小部件可能會被「排除」。考慮一個「快門」列表框:快門及其內容僅在按下列表框按鈕時纔會顯示。

這是我目前的解決方案:

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,我只想知道它是否可見,並且還原摺疊它,隱藏它或排除它的效果。

+0

他們有什麼區別? –

+0

你可能會考慮檢查直接父母。 –

+0

這看起來像它可以被建模爲一個狀態機。 – juanchopanza

回答

3

我不喜歡三個布爾值用於表示同樣的事的事實。

正如你所說,這不是「同一件事」。所有三個條件都是獨立的。

在我看來,你採取了正確的做法,isVisible()看起來應該如此。

2

使用枚舉來表示窗口的狀態:

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

注意,這正是你與你的「INT解決方案」做什麼,那到底是什麼枚舉的dessigned了。

所以,你的實現可能是這樣的:

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... 
}; 
0

不要浪費那些東西!你只需要三,所以讓我們的這個int的32溝24(probly)那麼現在,在C++ 14它是作爲一個田田,田田簡單:

char hiddenLevelStoredAsACharacter; 
hiddenLevelStoredAsACharacter |= 0b00000001; 

排除,怎麼樣:

hiddenLevelStoredAsACharacter |= 0b00000010; 

如果這不起作用,可能有一種方法可以使用模板來實現。

+1

請人們,現在(智能編譯器和非常複雜的體系結構)bitsets不比布爾值更快。僅用於緊湊數據目的的位集(嵌入系統,驅動程序等)。否則這些技巧是毫無意義的。 – Manu343726