2009-04-30 104 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 ...)