2013-03-09 19 views
1

我創建了一個遺傳算法框架,我有一個人口類,其中包括一個Tournament和一個EvolutionStrategy對象,這樣我就可以插入不同的錦標賽類型和進化策略。程序接口 - 如何有效地訪問調用類?

目前我已經將它設置,使我由Population對象傳遞從人口創建一個新的EvolutionStrategy對象 -

EvolutionStrategy strategy = new BasicStrategy(this); 

BasicStrategy構造我

Population pop; 
public BasicStrategy(Population pop) 
{ 
    this.pop = pop; 
} 

我有一個關於兩個問題這

1)這是否創建適當的引用變量,允許更新popu lation可以在EvolutionStrategy中即時訪問,還是應該使用某種形式的同步?

2)有沒有更好的方法來做到這一點?對我來說,在Population中爲戰略提供參考變量以及在Strategy中爲人口提供參考變量似乎很浪費。

+0

to 1)yes; java除了基本類型外都是通過引用傳遞的。 2)循環引用通常但不總是設計不好的標誌。事實上,在構造函數中傳遞'this'是非常糟糕的做法。但浪費?你在浪費什麼? – 2013-03-09 15:20:52

+0

嗯,我試圖專注於良好的設計,也許我誤解了它。你能否舉一個例子說明如何在不使用循環引用的情況下實現這種模塊化? – SMC 2013-03-09 15:23:32

+1

想想爲什麼'Population'需要了解'EvolutionStrategy',反之亦然 - 他們是否真的需要了解彼此?你能移動這些方法嗎?如果答案是「是」,然後是「否」,那麼考慮一個知道他們兩個的類,並將方法放在那裏。 – 2013-03-09 15:25:54

回答

2
  1. 它是好的
  2. 我認爲你應該有一個額外的類象EvolutionAlgorithm您在其中存儲人口(以對象的形式正在不斷髮展)和EvolutionStrategy分開。當你想發展你的種羣時,你只需將evolutionStrategy的方法與種羣作爲參數(策略模式)即可。我認爲evolutionStartegy不需要存儲人口。沒有進化策略,人口也是有意義的。
+1

謝謝,我認爲bmorris已經回答了這個問題,但是在評論中我剛剛開始重新設計這個建議。現在問題歸結爲邏輯分離職責,但這是OOP ^。^的樂趣 – SMC 2013-03-09 16:41:37