2009-07-08 103 views
0

有時,您只需要按設定順序執行一系列操作,例如執行順序圖時。執行代碼執行順序的最佳方法是什麼,以防止重構通過序列更改引入細微的錯誤?執行代碼執行順序

讓我們假設現有的單元測試不會發現由於改變foo()和bar()在下面的執行順序而導致的任何問題。

幾個我見過和使用的方法:

  1. 評論(依賴的人閱讀&理解它們):

    // do this
    foo();
    // then this
    bar();

  2. 流利的語法(使代碼更像英文,並勸阻肆意重構):

    obj
    .Do
    .foo()
    .Then
    .bar();

  3. 狀態變量&猶豫不決(太複雜):

    foo_done=false;
    if(foo()) foo_done=true;
    if(foo_done) bar(); else throw_an_exception;

  4. 分組邏輯塊到功能:

    void foo_bar()
    {
    foo();
    bar();
    }

...等等太醜陋來形容(嵌套,事件,函數指針數組,命名功能開始(),中()和end()...) 。

有沒有更好的工程模式來做這種事情?

+1

我認爲一個更具體的例子可能會得出更好的答案。事情需要完成的順序有多嚴格?如果您總是需要按照確切的順序調用某些方法,而不是這樣做,那麼錯誤是什麼?void doEverything()會按正確的順序調用所有方法。如果您確實需要以臨時命令調用操作,那麼有什麼限制?爲什麼他們需要按特定順序調用?他們是否在一些共同的國家運作?他們有沒有單元測試的副作用? – 2009-07-08 14:59:04

回答

1

我很困惑,爲什麼順序是重要的,如果單元測試不會捕獲它們,並且依賴項在代碼中不明確;這意味着副作用是foo()和bar()的操作的關鍵部分。 在這種情況下,最好的設計策略是明確這些副作用!

+0

那麼你如何明確依賴關係?我們唯一的方法是確保將測試外部傳遞給代碼體,還是有方法使序列顯式化? – lotsoffreetime 2009-07-09 21:46:33

0

你編寫單元測試來檢查在調用過程後發生了什麼(狀態,屬性改變),所以我認爲你不需要檢查是否調用某個方法。另外,如果你將測試與某種方法聯繫起來,那麼如果你改變你的系統使用另一種具有foo()相同效果的方法,即使你的系統做了正確的事情,你的測試也會失敗。