2011-10-05 138 views
4

我在考慮一個對象結構,它將執行復雜的計算。基於用戶的GUI上的條目完成計算。複雜計算器的對象模型

的表現公式是這樣的:

A = B+C; 
B = D*E; 
C = C; (simply value insert by the user) 
D = C/E; 
E = C*C; 

用戶可以對所有的值輸入值(A至E /在實際項目中,大約有210變量)。如果不可能開發一個數學公式來計算其他值,它將通過迭代值完成,直到找到一個「工作設置」。

我現在在考慮以下結構: 每個變量都是數據類的對象。每個數據類可以在其他數據類上註冊一個偵聽器來獲取值更改事件。如果數據類獲取值更改事件,它會重新計算自身,並通知所有偵聽器關於它自己的數據更改。

現在的問題如下: 如果此鏈中的最後一次計算得到結果,輸入的值不可能(例如「除以零」),它會將其值設置爲最接近的可能值(在這種情況下是1)。然後,鏈中的所有計算必須以相反的順序再次完成。

在你的眼中,是否有比這個基於聆聽者的結構更好的結構,每個人都重新計算,如果他檢測到觀察變量發生變化事件(有210個可變參數,我將放棄概述計算什麼,何時和爲什麼;中央計算結構似乎對我更可維持,但我無法想象中央計算單元的良好結構)。

歡迎任何意見和建議! 乾杯, 瓊

回答

2

你正在實施的是所謂的reactive programming。該文章還提到,直接使用觀察者模式可能會導致性能問題。

有幾個庫實現了對這種編程模型的支持,你可以看看其中的一些並找出他們在做什麼。據我所知,其中許多人使用依賴關係的圖形視圖,並且只有在新值達到所有可達輸入時才重新計算表達式的值。

+1

感謝您的回答:我正在讀Java中的RP,但到現在爲止我沒有找到具體的實現。也許我會在這裏獲得更多信息 - 無論如何,我會回到你身邊。謝謝這麼久。 –

+0

@Patrick我也對這個感興趣,並且搜索了一段時間。不幸的是,我找不到一個正在實施響應式編程的活動/工作項目。你能在答案中提供一個或兩個例子嗎? – Erik

3

很多谷歌的時間支出後,我發現在谷歌代碼進行無Java的一個有趣的項目:reactive4java

我沒有嘗試過這個項目還沒有,但不像其他項目,我發現(FrappéJuniorSugarCubes),它似乎仍然活躍,正在開發中。其他提到的項目要麼不再可用,要麼在幾年前有過最後一次更改。

更新: 玩過reactive4java之後,我得出結論,這個項目不能用在oop上下文中來做計算。我不可能(直到現在)將項目中的任何對象或值與Reactive-kernel綁定,反之亦然。如果我對此有更多瞭解,我會再次發佈。

更新2:談論該項目的維護者後,我指出瞭如何結合對reactive4java框架的數據對象,所以框架做了計算,當一個數據對象的變化。玩過框架之後,我會發佈一個詳細的工作示例。

+0

嗨!以下是我扔在一起的示例應用程序:http://code.google.com/p/reactive4java/wiki/Examples – akarnokd

1

幾年前,我已經看到了反應式編程 - 但我認爲您不會用這種編碼來更好地瞭解您的項目。它只是讓你擺脫處理觀察員和事件。