2011-03-10 93 views
3

我總是有一個問題需要設計一個類,其中正確的方法調用對程序員來說是清楚的,並且在數據之前沒有執行某種方法的危險,變量是通過其他方法設置的。所以我通常使用標誌和if語句是安全的:如何確保方法按正確的順序執行?

class foo { 
    boolean isInitialised = FALSE; 
    boolean isSthDone = FALSE; 
    float importantData; 

    public void initialise { 

     ... 

     isInitialised = TRUE; 
    } 

    public void doSth1 { 

     if (isInitialised) { 

     importantData = 2134234; 

     } ... 

      isSthDone = TRUE; 

    } 

    public void doSth2 { 

     if (isInitialised && isSthDone1) { 

      ... 

      } 
    } 
} 

這種設計不會給任何線索,怎麼算法應該使用 - 這方法應該是先執行,沒有任何設計模式的這種問題?

+0

這是在Java嗎? C#? – Crisfole 2011-03-10 17:54:38

+1

它被稱爲「設計你的對象在施工後處於有效狀態」模式。 – ChaosPandion 2011-03-10 17:55:52

+0

@featon - 這是什麼混亂的代碼?如果您希望任何人尊重您,至少讓您的示例始終遵循相同的基本語法。另外它也不會傷害檢查你的拼寫。 – ChaosPandion 2011-03-10 18:00:15

回答

2

您應該考慮在這裏使用。對我來說,代碼如下:

  • 「我的狀態,讓我只初始化我」,「我在初始化狀態,所以我可以做必要的邏輯 - Sth1時
  • 最後:「我在過去的狀態,所以我現在可以做Sth2時

http://sourcemaking.com/design_patterns/state

無論如何,像喲你之前被告知,最簡單的選擇是使這些方法保密,並用一種​​新的公共方法將它們全部按順序調用。

+0

@Rob Hruska,謝謝:) – dantuch 2011-05-28 18:38:10

6

您應該在構造函數中進行所需的初始化 - 初始化正是構造函數的用途。根據您使用的語言,它可能如下所示:

Class foo{ 

    public: 
    foo(){ 
    a = 1; 
    b = "something"; 
    } 

    int a; 
    string b; 

} 
+0

有時不適合在構造函數中初始化。 – Crisfole 2011-03-10 17:53:41

+6

有些時候任何標準方法都不合適。在他的問題(也就是「幾乎總是」)的背景下,構造函數就是他應該進行初始化的地方。 – David 2011-03-10 17:55:23

8

請思考一下,是否獨立執行這些步驟是否真的有意義。如果該類的消費者確實必須按照該順序執行步驟1,步驟2和步驟3,那麼只需將它們摺疊成一個公共方法並將這些步驟封裝在您的類中。

另一方面,如果真的有消費者按照什麼順序做的選擇,那麼你就會遇到狀態轉換問題,並且你需要了解步驟的合法順序。

4

@D。 Lambert和@David正在給出很好的建議。

如果你想要一個強制執行一系列調用的設計模式,請看Template Method。這可能不是你想要的,我過去一直很後悔選擇這種模式,所以小心使用它。它執行一個命令,不管你喜不喜歡。

相關問題