2012-07-11 36 views
0

我的應用程序用於離心泵葉輪設計。用戶可以通過winform gui實時更改某些屬性(流速,尺寸等),並且他應該實時提供大部分結果。「實時」可變級設計

有13個用戶可更改參數和約70計算的參數。

大部分計算都是數學上非常複雜的,其中一個參數需要迭代(不超過10次迭代)。

我給它包含並計算所有參數到目前爲止類溶液是:使用描述用戶可改變參數和方法計算所得的參數屬性

  1. 類。
  2. 類是不可變的,並在創建時計算所有內容。使用懶惰類從.NET 4.0

  • 懶惰的解決方案,我已請CR this問題就是從那裏我有懶惰的解決方案。

    所以我的問題是哪種方法最適合「實時」解決方案?還有其他更好的解決方案嗎?

  • +0

    性能是一個問題嗎?也就是說,只要需要瓶頸,就重新計算這70個參數。 – 2012-07-11 19:27:21

    +0

    @ChrisSinclair到目前爲止,第一種解決方案工作得相當不錯,但是在用戶更改一個參數之後,某些方法會被調用超過100次。 – Archibald 2012-07-11 19:37:58

    +0

    也許選項#2是最好的。讓用戶輸入他們想要的新驅動參數,用這些參數創建一個新對象,讓它預先計算70個其他參數,然後將該對象送入系統。至少這樣你就不會陷入在用戶更新其他值的同時計算值的情況。編輯:也許嘗試拆分對象到2.第一類作爲輸入參數_only_,它有一個'Calculate'方法,它返回第二個不可變類,其中包含所有輸入參數_and_ 70驅動值。 – 2012-07-11 19:40:05

    回答

    2

    我會解決方案1,我懷疑每個泵都具有相同的屬性,只是屬性的不同值。

    public class Pump 
    { 
        public double Speed { get; set; } 
        public double Size { get; set; } 
        public void GetCFM() { return Speed * Size; } 
    } 
    

    GetCFM的任何調用將始終返回最新的計算結果。

    如果您不想手動撥打GetCFM,則可以改爲實現Observer Pattern。使用觀察者模式您將觸發一個處理程序,在任何時候任何屬性發生更改時都會收到通知。

    此外,我懷疑你對real time computation的理解與文章中解釋的不同。

    +0

    這是我的第一種方法,但是當我注意到那些不必要地多次調用的方法,例如:public void GetABC(){return GetCFM()* GetDEF(); }也textBox.Text = GetABC()。ToString()我開始尋找的東西,將保存值,直到下一次重新計算。我仍然在使用這個解決方案,但它似乎不正確:)。 – Archibald 2012-07-11 19:29:31

    +1

    您可以調用一個私有/受保護方法來獲取計算結果,並且當您更改屬性時(在屬性'set'方法中),您可以調用此方法,該方法在內部保存該值,然後顯示其他屬性。我建議你不要*這樣做,但是,因爲它會導致很難理解的代碼。計算機在計算數字方面速度非常快,除非實際觀察到瓶頸,否則您可能只是在不必要地編寫更復雜(且難以維護)的代碼。 – Matthew 2012-07-11 19:33:29

    +0

    實時意味着用戶不需要按提交按鈕或類似的東西,並在每次更改後提供重新計算的值。 – Archibald 2012-07-11 19:44:24