2010-06-25 458 views
9

有沒有人對我的GUI類保持邏輯沒有任何建議?我嘗試使用良好的類設計並保持儘可能多的分離,但是我的Form類通常會以比我想要的更多的非UI內容混合在一起,而且這往往會使維護變得非常痛苦。在C#中分離用戶界面和邏輯

(Visual Studio 2008 Professional,C#,Windows應用程序)。

非常感謝。

回答

6

把你的邏輯放在一個單獨的程序集中;並且在不引用任何GUI軟件包的情況下構建該程序集(例如System.Drawing,System.Windows.Forms等)。

+0

謝謝 - 我認爲這是一個很好的實際起點,可以幫助我以正確的方式思考。 – Andy 2010-06-26 19:17:19

3

你需要尋找到設計模式,如:

Model-View-Controller(MVC)經常使用的網站(ASP.NET)
Model-View-View Model(MVVM)經常使用WPF

通過保持到一個這些你應該能夠把應用程序的各個部分分開。

還有其他模式可以完成類似的工作。

此外,使用WPF進行開發可以提供幫助,因爲UI由XAML定義,並且工作的代碼是C#。這可以提供基本的分離度。如果您發現自己編寫的只是操縱UI的C#代碼,則可以退後一步並考慮「我應該在XAML中執行此操作嗎?」。很顯然,在後面的代碼中你可能需要做的事情,但這是一個開始。

1

3層架構就是您要找的。

你建造2個可重複使用的層:從數據庫

  • 業務邏輯層(BLL),這 消耗

    • 數據訪問層(DAL),這 包含只需要 讀碼/寫DAL,包含業務 規則,驗證,並提供了一個 門面的UI使用

    然後在你的UI項目您引用可重用的圖層並僅處理UI特定的內容。該UI項目談判只對BLL,沒有直接連接到DAL:

    UI < ---> BLL < ---> DAL

    你可以有多個消費層的用戶界面您可重用的組件以及多個可互換的DAL(如果您要支持多種數據庫類型)。

  • 4

    這實在只是一個練習和自律的問題。我的意思是,我們都做到了。而且我們都會在不合適的條件下不斷地做到這一點(經理/客戶大吼大叫「現在就完成」與「正確」等)。

    我在編寫代碼驅動UI時所做的一件事(在網頁上更多,但同樣的事情適用)是用代碼的每個單元(單行,條件,循環等)問自己。)這段代碼是否依賴於UI的存在。如果我正在寫一個文本框,這取決於用戶界面,所以它會去那裏。但是如果我計算將在該文本框中出現的結果,那可能是業務邏輯。

    另一種方法(正如ChrisW在我輸入時暗示的那樣)是在非UI類庫中首先開發邏輯。把儘可能多的邏輯放在那裏(儘管你的判斷是用來定義「邏輯」的,但不依賴於基於UI的庫)。然後構建UI以利用該邏輯。有兩種不同的方法來允許這兩部分的併發開發,比如將接口類後面的邏輯程序集樁掉,並將UI部分編碼到那些接口(然後使用依賴注入將程序集類插入接口)等等。

    0

    通常在這種情況下;我創建了一個輔助方法類,完成所有繁重的工作。

    至於保持邏輯分離;確定什麼是關鍵組件,並將這些重構到輔助方法類中。例如;如果我正在處理一個GridView來根據它們是否被選中來更新記錄;如果是,則在表單中更新ShipDate;如果該行被選中,我會先弄清楚;然後提取Id字段,然後提取ShipDate,然後將Id和ShipDate傳遞給我的幫助器類中的一個方法,該方法完成所有工作。

    單元測試可以成爲你的朋友,基本上,如果你有任何「邏輯」類型的東西的代碼;它應該有一個單元測試。如果它在GUI類中;很難測試;然而,一旦你重構它,單元測試應該是微不足道的。

    0

    你應該看看下面的模式:

    MVC(模型 - 視圖 - 控制器) MVVM(模型 - 視圖 - 視圖模型) - 大多在使用WPF與它的豐富的數據綁定支持。 MVP(Model-View-Presenter) - 常用於WinForms和web應用(因爲無狀態視圖)

    查看本博客文章,其中給出瞭如何使用MVP爲Web和WinForms視圖提供支持的示例一個主持人: http://www.cerquit.com/blogs/post/MVP-Part-I-e28093-Building-it-from-Scratch.aspx

    此外,進一步此處的博客文章介紹使用單元測試你的業務邏輯MVP模式: http://www.cerquit.com/blogs/post/Model-View-Presenter-Part-II---Unit-Testing.aspx

    1

    學習如何編寫能夠數據綁定到表單控件類和如何執行數據綁定。 在WinForms中,主要涉及控制器類上的INotifyPropertyChanged和IDataErrorInfo接口,以及表單類上的BindingSource實例。

    然後,您可以編寫一個控制器類,其中包含UI的所有數據和邏輯,並且UI類簡單地綁定到它。您的UI類變得非常簡單,並且您的UI邏輯(保存在控制器中)變得非常易於測試(在針對UI類運行時,單元測試非常棘手,但在針對控制器類運行時更容易)。

    這是所有MVC/MVVM設計的基礎。

    金龜

    1

    總之,它被稱爲重構

    只有幾個原因,把代碼放到UI:

    與窗體上的控件
    1. 互動
    2. 驗證,儘管這可能是 放在業務邏輯層,但 我通常在 用戶界面中添加輔助方法(更容易)

    所有其他「業務邏輯」代碼都會進入另一個稱爲業務邏輯類的類。所有的數據庫交互代碼進入一個不同的類,稱爲數據訪問類。

    當您在UI中編寫代碼時,只需問自己代碼是否與窗體上的控件進行交互。如果不是,它可能屬於另外兩類。

    查看Martin Fowler關於「重構:改進現有代碼設計」等重構的書籍。另一個流行詞是關注點分離。我知道你可以在一個類中完成所有這些工作,但是如上所述,當它被分爲類時,代碼變得更加可讀並且更易於調試。