2011-06-15 41 views
-2

我公司開發的Windows應用程序,其中一個按鈕是有一個表上的按鈕被點擊時,然後幾個系列的功能將後運行一個一個像下面一個需要概念在C#中的特定類型的應用程序

Button_Click() 

{ 

function1(); 

function2(); 

function3(); 

function4(); 

function5(); 

function6(); 

function7(); 

function8(); 

function9(); 

function101(); 

function1(); 

function12(); 

function13(); 

} 

每個功能都可以完成一些工作。所以我的應用程序運行良好,但我需要知道如何以更多結構的方式設計這種工作。所以請指導我如何結構的方式,我可以一個接一個地調用所有函數。一位經驗豐富的專家開發人員將如何處理這項工作或他們如何一個接一個地調用函數。感謝

回答

2

這一切,如果該功能需要以特定的順序或不被調用取決於。

如果不是:使用發佈/訂閱模式。

如果需要以特定的順序:

不要使用功能,添加功能類和使用管道像下面。

public interface IPipeline 
{ 
    void AddLast(IPipelineHandler handler); 
    void AddFirst(IPipelineHandler handler); 

    void Invoke(IPipelineContext context); 
} 

public interface IPipelineContext 
{ 
    Form SourceForm {get; } 

    // The result that the pipeline should produce. (change from object to a specific type) 
    object Result {get; } 

    //and other properties that each handler will need. 
} 

public interface IPipelineHandler 
{ 
    string Name {get; } 
    void Process(IPipelineContext context); 
} 

在管道實現,調用與相同情況下每個處理程序:

public void Invoke(IPipelineContext context) 
{ 
    foreach (handler in _handlers) 
    { 
     try 
     { 
      handler.Process(context); 
     } 
     catch (Exception err) 
     { 
      //abort or continue with the next handler? 
     } 
    } 
} 
+0

你的代碼是好的,但我無法理解我如何在我的場景中使用它。基本上我不是很先進的用戶。這將是更好的,如果你請給我充分的代碼,所有我的function1(),function2()等等將被稱爲一個接一個與你的上述代碼。謝謝。我只需要看看我的函數如何在你的實現中被調用。 plzz幫助我。謝謝 – Mou 2011-06-15 08:33:14

3
  • 給你entitiess有意義的名稱
  • 給你entitiess有意義的名稱
  • 給你entitiess有意義的名稱
  • 給你entitiess有意義的名稱
  • 的通用代碼
  • 可能信號/解壓縮功能插槽/偵聽器/觀察者的概念適合你。

編輯:重構例子:

假設你的代碼是:

void Button1_Click() { 
    function1(); 
    function2(); 
    function3(); 
    function4(); 
    function5(); 
}  
void Button2_Checked(int variable0) { 
    if (variable0) { 
     function1(); 
     function2(); 
    } else { 
     function1(); 
     function2(); 
     function3();  
     function4(); 
     function5(); 
    } 
} 

步驟0-10是找到所有有意義的名稱,按鈕,功能, 變量中,參數(一次只重命名一個實體;爲避免發帖,我跳過了這個):

void orderPizzaButton_Click() { 
    requestSalamis(); 
    requestAnchovis();   
    requestShitake();   
    requestCheese(); 
    requestGroundMeat(); 
}  
void lasagnePervesityLevel_Changed(int newValue) { 
    if (newValue <= 0) { 
     requestCheese(); 
     requestGroundMeat(); 
    } else { 
     requestSalamis(); 
     requestAnchovis();   
     requestShitake(); 
     requestCheese(); 
     requestGroundMeat(); 
    } 
} 

第11步是找到commons在這些功能,並從中提取新的,可重複使用的功能 :

void orderPizzaButton_Click() { 
    requestStrangeIngredientCombination(); 
}  
void lasagnePervesityLevel_Changed(int newValue) { 
    if (newValue <= 0) { 
     requestCheese(); 
     requestGroundMeat(); 
    } else { 
     requestStrangeIngredientCombination(); 
    } 
} 

void requestStrangeIngredientCombination() { 
    requestSalamis(); 
    requestAnchovis();   
    requestShitake(); 
    requestCheese(); 
    requestGroundMeat(); 
} 

第12步是優化您的常用代碼搜索(認爲它作爲一種標準化的):

void orderPizzaButton_Click() { 
    requestStrangeIngredientCombination(); 
} 
void lasagnePervesityLevel_Changed(int newValue) { 
    if (newValue <= 0) { 
     requestStandardComponents(); 
    } else { 
     requestStrangeIngredientCombination(); 
    } 
} 

void requestStandardComponents() { 
    requestCheese(); 
    requestGroundMeat(); 
} 
void requestStrangeIngredientCombination() { 
    requestSalamis(); 
    requestAnchovis();   
    requestShitake(); 
    requestStandardComponents(); 
} 

雖然在這個例子中似乎沒有保存代碼,但實際上它往往是。此外,保存代碼行並不重要,關鍵在於減少冗餘,因爲一旦你決定你的異端烤寬麪條和奇怪的披薩也應該保留chilis和Sylvester Stallone的圖像,你不僅會有代碼複製,但是工作重複;最重要的是,有可能忘記代碼中某些地方的新功能。當然,這非常糟糕,甚至是關鍵業務。假設你的客戶希望他們的烤寬麪條上有一個西爾維斯特·史泰龍的形象,就像你的營銷活動承諾的一樣,然後沒有誰訂購比薩餅就得到了這個形象,而只有那些訂購了千層麪的人。

還有更多的重構和設計,取決於實際的代碼。我真的推薦 以獲得以下書籍。另外,最重要的經驗法則是:一次一步。做一個小的重構,編譯,測試。

  • 重構 - 改善既有代碼的由Martin Fowler Addison-Wesley出版社
  • C中的設計++編碼標準:101分的規則,準則和最佳做法C++由Herb薩特,安德烈Alexandrescu的(C++在 - 深度系列)Addison-Wesley出版社
  • 設計模式:通過伽馬,頭盔,約翰遜,Vlissides(俗稱四人幫,爲四人幫)可複用面向對象軟件的元素,再次Addison-Wesley出版社
+0

我應該遵循哪種設計模式來處理這種情況。你可以請示例代碼來處理這種情況。 – Mou 2011-06-15 08:14:16

+0

我不確定這是否真的值得設計模式。對於有意義地命名事物並將重複的東西放入單獨的,可重用的實體應該是常見的程序員意義上的。我會舉一個例子。 – 2011-06-15 08:21:33

0

如果您正在創建的功能需要按照該順序執行這些功能,那麼爲什麼不將這些調用封裝在方法中?這將爲您提供更高級別的封裝,並且意味着可以在其他地方(從菜單工具欄中調用)調用此函數,而不必擔心如果所有函數都按正確的順序調用。

爲你的函數分配更多有意義的名字也是值得的,但我相信你只是將它們命名爲functionX()來作爲例子。

因此,舉例來說:

Button_Click() 
{ 
    Print() 
} 

private void Print() 
{ 
    function1(); 
    function2(); 
    function3(); 
    function4(); 
    function5(); 
    function6(); 
    function7(); 
    function8(); 
    function9(); 
    function10(); 
    function11(); 
    function12(); 
    function13(); 
} 
+0

和更高層次的抽象,可以提高代碼的可讀性。如果這個功能是在其他地方執行的,那麼你正在進行一個呼叫,而不是14.這也可以通過嘲弄進行更好的單元測試。 ---編輯---嗯,似乎我回應的人刪除了他們的評論。 – 2011-06-15 08:05:47

+0

可能是Button_Click已經封裝了這些函數?所以你寫了同樣的東西。 – Reniuz 2011-06-15 08:09:25

+0

當然,這是事實。有了這樣的示例代碼,很難知道完整的域。 Button_Click()向我表明了一個.NET的點擊處理模式,因此也就是響應。所以如果Button_Click()是一個封裝級別,那麼我對更有意義的函數名稱的評論就有更多的相關性。感謝您指出了這一點! – 2011-06-15 08:10:52

0

你期望的答案?不知道這些功能如何相互關聯,沒有人能夠回答這個問題。

這些功能是否相互依賴?下一個功能是否必須在先前的功能完成之前等待?或者他們可能平行運行?這些功能是否總是相同或可以改變?也許你想配置它們,從而使按鈕執行動態調用。甚至可能在運行時?

如果您沒有任何要求,我認爲您的當前代碼沒有問題。

你應該看看設計模式,如命令模式或管道&過濾模式,也許這可以幫助你。

+0

我只想知道我的情況如何處理正確的設計模式。功能不依賴於對方。是的,下一個函數將在prev完成之前等待。功能將始終相同。所以現在告訴我用小代碼來實現正確設計模式的情況。謝謝 – Mou 2011-06-15 08:28:20

+0

在這種情況下,您當前的代碼很好。你的代碼有什麼問題嗎,是什麼讓你認爲你的代碼錯了? – codymanix 2011-06-15 08:31:40