2009-04-30 101 views
1

我正在尋找重構一些非常複雜的代碼,這是我在工作中的一個項目的子系統。我對這段代碼的部分研究是它非常複雜,並且根據一些核心業務邏輯包含了大量的輸入,中間值和輸出。矩陣代數設計分解

我想重新設計這個代碼,以便更容易維護以及更快速地執行一個地獄,因此,我一直在試圖查看每個參數以及它們彼此之間的依賴關係。這導致了一個相當大和糾結的圖,我想要一個機制來簡化這個圖。

後來我在一本關於SOA設計的書中遇到了一種叫做「矩陣設計分解」的技術,它使用輸出矩陣和它們對輸入的依賴關係,應用某種形式的矩陣代數並可以生成業務流程這些依賴關係的圖表。

我知道有一個web工具可以在http://www.designdecomposition.com/但是它可以有輸入/輸出依賴關係的數量有限。我試圖尋找這個工具的算法源(所以我可以嘗試自己實現它沒有大小限制),但是我沒有運氣。

有沒有人知道我可以使用的類似技術?目前,我甚至考慮採取相關矩陣,並運用一些遺傳算法,看看是否能演變拿出一個簡單的工作流程...

乾杯,

Aidos

編輯:

我將解釋動機:

最初的代碼是爲系統編寫的,每次用戶執行操作(添加,刪除或修改某些屬性的值(約60)一個項目)。這個代碼是十年前編寫的,絕對顯示出年齡的跡象 - 其他人已經爲系統增加了更復雜的計算,現在我們得到完全不合理的性能(控制返回給用戶前2分鐘)。已決定從用戶操作中分離計算並提供一個按鈕來「重新計算」這些值。

我的問題出現了,因爲有太多的計算正在進行,它們基於所有必需數據都可用於計算的假設 - 現在,當我嘗試重新實現計算時,我一直遇到問題,因爲我沒有得到這個計算所依賴的不同計算結果。

這是我想使用矩陣分解方法的地方。 MD方法允許我指定所有的輸入和輸出,併爲我提供了可用於生成所有輸出的「最簡單」工作流程。

然後我可以使用這個「工作流」來了解我需要執行的計算的優先級,以獲得相同的結果而不會產生任何異常。它還向我展示了我可以並行化的計算系統的哪些部分以及分叉點和連接點的位置(我現在不擔心該部分)。目前,我所擁有的是一個瘋狂的大型矩陣,其中顯示出很多依賴關係,不知從哪裏開始。

我會闡述從我的評論多了幾分:

我不想使用來自EA過程中的解決方案在實際的項目。我想採用依賴矩陣並將其分解爲模塊,然後我將手動進行編碼 - 這純粹是一種設計輔助 - 我只是對這些模塊的輸入/輸出感興趣。基本上是這些計算之間複雜的相互依賴關係的表示,以及一些優先的概念。

說我有A要求B和C. D要求A和E. F要求B,A和E,我想要有效地將問題空間從一組複雜的依賴關係劃分爲一個「工作流程」,我可以檢查以獲得更好的理解。一旦我有了這個理解,我可以想出一個更好的設計/實現,仍然是人類可讀的,所以對於我所知道的例子,我需要計算A,然後C,然後D,然後F.計算出

-

我知道這似乎有點奇怪,如果你看看我鏈接到基於矩陣的分解之前的網站,應該給你一些理解我在想什麼...

回答

0

如果是這樣,as你說,「核心業務邏輯」,那麼你真的不想被那些花哨的分解和演化算法搞砸,這些算法產生了世界上沒有人理解或能夠修改的「黑盒子」解決方案。如果這些技術中的任何一種都能取得任何有用的結果,我會感到非常驚訝;人腦在解開復雜關係時仍然比任何機器都難以理解。

你想要做的是傳統的重構:清理各個過程,簡化它們並在可能的情況下合併它們。你的目標是使代碼清晰,所以你的繼任者不必經歷同樣的過程。

+0

我已經詳細闡述了一些內容,希望澄清一下我在做,爲什麼。 – Aidos 2009-04-30 07:03:56

2

kquinn,如果這是我認爲他指的是(我曾經在那裏工作)的代碼片段,它已經是一個黑盒解決方案,沒有人能理解。他並不想讓事情變得更加複雜,事實上並非如此。他試圖實現的是一整套相互關聯的計算。

當前發生的情況是,無論什麼時候發生什麼變化,都會引發大量計算髮生,從而導致更多的事件持續進行,直到最終達到平衡狀態。

我假設他想要做的是找到那些偏離計算的依賴關係,並從那裏開始工作,以便它們可以被重寫,並找到一種計算方法,而不是因爲它們需要。

我不能提供很多關於簡化圖的建議,不幸的是這不是我有很多經驗的東西。也就是說,我會開始尋找那些沒有依賴關係的外圍計算,並且只是遍歷圖從那裏。以最簡單的方式開始構建一個新的框架,其中包括每個計算的核心業務邏輯,並在整個過程中重新構建它。

+0

這絕對是你正在使用的代碼。 我想要做的是想出一個不同的方法來做到這一點。如果不瞭解究竟發生了什麼以及按什麼順序發生,我正試圖將這句諺語推上山。 – Aidos 2009-04-30 08:27:30

+0

思考,而不是在... – Aidos 2009-04-30 08:27:43

0

你在用什麼語言? 您的問題應該很容易使用Java執行程序和將來的任務進行建模,但是類似的框架也許可以在您選擇的平臺上使用。另外,如果我正確理解這一點,您希望爲大量相互依賴的計算生成一個關鍵路徑 - 是動態完成的,還是您「需要」需要靜態分析?

關於算法解決方案;拿起你的數字分析教科書的最接近的副本,並刷新你的記憶在奇異值分解和LU分解;我從頭頂上猜測,這是你鏈接到的工具背後的原因。

編輯:由於您使用的是Java,我給一個建議提案的簡要介紹:

- >使用線程池執行輕鬆parallellize所有的計算

- >解決的相互依存關係未來<的對象映射>或FutureTask <>:S,也就是說,如果你的變量是A,B和C,其中A = B + C,做這樣的事情:

static final Map<String, FutureTask<Integer>> mapping = ... 
static final ThreadPoolExecutor threadpool = ... 
FutureTask<Integer> a = new FutureTask<Integer>(new Callable<Integer>() { 
      public Integer call() { 
       Integer b = mapping.get("B").get(); 
       Integer c = mapping.get("C").get(); 
       return b + c; 
      } 
     } 
    ); 
FutureTask<Integer> b = new FutureTask<Integer>(...); 
FutureTask<Integer> c = new FutureTask<Integer>(...); 
map.put("A", a); 
map.put("B", a); 
map.put("C", a); 
for (FutureTask<Integer> task : map.values()) 
     threadpool.execute(task); 

現在,如果我不是完全關閉(我很可能是,它w因爲我在Java中工作了一段時間),您應該能夠通過調整線程池大小或使用不斷增長的線程池來解決明顯的死鎖問題。 (你仍然必須確保沒有相互依賴的任務,例如,如果A = B + C,B = A + 1 ...)