2009-02-11 95 views
0

我正在編寫一個iPhone應用程序,我發現隨着我添加功能,可以預見,狀態的排列會顯着增加。在GUI應用程序中存儲和使用狀態

然後我發現自己不得不遍形式的地方添加代碼:

If this and that and not the other then do x and y and set state z 

是否有人有系統的方法建議,面對呢?

即使我的應用程序是iPhone,我認爲這適用於許多GUI情況。

+0

你能舉個例子嗎?目前還不清楚您是指邏輯,輸入處理,選項等。 – 2009-02-11 23:34:49

回答

2

通常,用戶界面應用程序始終在等待事件發生。該事件可以是用戶的操作(點擊,搖動iPhone,在虛擬鍵盤上鍵入字母)或另一個進程(網絡數據包可用,電池用完)或時間事件(計時器到期)。每當一個事件發生(「如果這個」),你查詢你的應用程序的當前狀態(「......而不是其他」),然後做一些事情(「做x和y」),這很可能會改變應用程序狀態(「set state z」)。這是你在你的問題中描述的。這是一個普遍的模式。

沒有單一的系統的方法,使之正確,但你要求的方法的建議,這裏有些建議:

提示1:使用盡可能少的和什麼真正的數據結構和變量來表示的內部狀態儘可能避免重複狀態(直到遇到性能問題)。這使得「do x和y和set state z」的東西縮短了,因爲狀態被隱式設置。簡單的例子:代替具有(++用C的例子)

if (namelen < 20) { name.append(c); namelen++; } 

使用

if (name.size() < 20) { name.append(c); } 

第二個例子正確避免了複製的狀態變量「namelen」,使得作用部短。

HINT 2:每當一個化合物的條件(X和Y或Z)多次出現在程序中,抽象它扔掉成一個程序,所以不是

if ((x && y) || z) { ... } 

寫入

bool my_condition() { return (x && y) || z; } 
if (my_condition()) { ... } 

提示3:如果您的用戶界面具有少量明確定義的狀態,並且狀態影響事件的處理方式,則可以將狀態表示爲從接口繼承的用於處理這些事件的類的單例實例。例如:

每衍生物類的
class UIState { 
public: 
    virtual void HandleShake() = 0; 
} 

class MainScreen : public UIState { 
public: 
    void HandleShake() { ... } 
} 

class HelpScreen : public UIState { 
public: 
    void HandleShake() { ... } 
} 

實例化一個實例,並再指向當前狀態對象的指針:

UIState *current; 
UIState *mainscreen = new MainScreen(); 
UIState *helpscreen = new HelpScreen(); 
current = mainscreen; 

爲了處理動搖那麼,請致電:

current->HandleShake(); 

稍後更改UI狀態:

current = helpscreen; 

通過這種方式,您可以將與狀態相關的過程收集到類中,並將它們封裝並抽象出來。當然,你可以將各種有趣的東西添加到這些特定於狀態的(單例)類中。提示4:一般來說,如果您有N個布爾狀態變量和T個可觸發的不同事件,則在所有可能的條件下,所有可能事件的「矩陣」中都有T * 2 ** N個條目。它要求您的架構視圖和領域專業知識能夠正確識別矩陣中那些最符合邏輯和自然的封裝到對象中的維度和區域,以及如何。這就是軟件工程的意義所在。但是,如果您嘗試在沒有適當的封裝和抽象的情況下執行您的項目,則無法對其進行擴展。