2009-04-30 9 views
1

私は仕事中のプロジェクトのサブシステムである非常に複雑なコードをリファクタリングしています。このコードの私の調査の一部は、それが信じられないほど複雑で、いくつかのコアビジネスロジックに応じて多くの入力、中間値、および出力を含んでいます。行列代数設計分解

私は、このコードをもっと簡単に保守するだけでなく、より速く実行するために、このコードを再設計したいので、まず始めに、それぞれのパラメータとそれぞれの依存関係を見てみようとしています。これは非常に大きくて絡み合ったグラフにつながり、このグラフを単純化するための仕組みが必要です。

私はSOAデザインに関する「Matrix Design Decomposition」というテクニックに出くわしました。これは、出力マトリクスと入力に依存するものを使用し、行列代数の何らかの形を適用し、ビジネスプロセスを生成することができますこれらの依存関係の図。

私は、http://www.designdecomposition.com/で利用できるWebツールがあることを知っていますが、入力/出力の依存関係の数には限りがあります。私はこのツールのアルゴリズムのソースを探してみました(サイズ制限なしで自分で実装しようと試みることができました)。しかし、私は運がなかった。

誰も私が使用できる同様の技術を知っていますか?現在、私も...依存関係行列を取り、進化はシンプルなワークフローを考え出すことができるかどうかを確認するために、いくつかの遺伝的アルゴリズムを適用する

乾杯、

Aidosを検討しています

EDIT:

I

元のコードは、ユーザーが操作を実行するたびにすべての値(約60)を計算するシステム用に作成されました(特定のプロパティの追加、削除または変更)。アイテム)。このコードは10年以上前に書かれたものであり、時代の兆しをはっきりと示しています。他のものはシステムに複雑な計算を追加しましたが、現在は完全に不合理なパフォーマンスを得ています。ユーザーの操作から計算を切り離し、値を「再計算」するためのボタンを提供することが決定されました。

問題は非常に多く計算が行われており、必要なデータがすべて計算に使用できるという前提に基づいています。私が直面している計算を再実装しようとするとこの計算に依存する計算とは異なる計算結果が得られていないため、問題が発生します。

ここでは、マトリックス分解アプローチを使用したいと考えています。 MDアプローチでは、すべての入力と出力を指定でき、すべての出力を生成するために使用できる「最も単純な」ワークフローが得られます。

この「ワークフロー」を使用して、例外を生成せずに同じ結果を得るために実行する必要のある計算の優先順位を知ることができます。また、計算システムのどの部分を並列化できるのか、そしてフォークとジョインポイントがどこになるのかがわかります(私はその部分についてまだ心配しません)。現時点で私が持っているのは、どこに始めるべきか分かりませんが、そこにはたくさんの依存関係がある非常に大きな行列です。

私はもう少し私のコメントから詳しく説明します:私は、実際のプログラムでは、EAプロセスからソリューションを使用したくない

。依存行列を取り出し、それを手動でコード化するモジュールに分解したい - これは単なる設計支援であり、これらのモジュールの入出力が何であるかに興味があります。基本的には、これらの計算の間の複雑な相互依存関係、および優先順位の考え方を表します。

私はAにBとCが必要です。DにはAとEが必要です。FにはB、A​​とEが必要です。問題空間を複雑な依存関係のセットから効果的に "ワークフロー"より良い理解を得るために。私がこの理解を得たら、私は人間が読めるより優れた設計/実装を考え出すことができるので、A、C、D、そしてFを計算する必要があることが分かります。

-

私は、マトリックスベースの分解の前にリンクしているウェブサイトを見れば、私は何を考えているのか理解できるはずです。

答えて

0

「コア・ビジネス・ロジック」と言えば、世界の誰も理解できない、または変更することのできない「ブラック・ボックス」ソリューションを生む、巧妙な分解と進化的アルゴリズムを使いこなすことは本当にありません。これらの技術のいずれかが実際に有用な結果をもたらした場合、私は非常に驚くだろう。人間の脳は複雑な人間関係を解きほぐしても、どんな機械よりも理解できないほど優れています。

あなたがしたいことは、従来のリファクタリングです。個々の手順を整理し、合理化し、可能であればマージします。あなたの目標はコードを明確にすることで、後継者は同じプロセスを経る必要はありません。

+0

私はこのテキストをもう少し詳しく解説しました私はやっているし、なぜ。 – Aidos

2

kquinn私は彼が(私はそこで働いていた)と言いますが、それはすでに人間が理解できないブラックボックスソリューションです。彼はそれをもっと複雑にしようとは考えていません。彼が達成しようとしているのは、相互リンクされた計算の全体的なヒープです。

現在何が起こっているのかは、何かが変化したときにはいつも計算の集まりが発火してしまい、最終的に平衡状態に達するまで、 。

私が彼がやりたがっていることは、それらの外側の計算の依存関係を見つけてそこから作業するので、計算が必要であるからではなく、書き直すことができるからです。

残念ながら、私は多くの経験を持っているわけではないので、グラフを単純化することに関して多くの助言をすることはできません。それは、依存関係のない外在する計算を探し始め、そこから。各計算の中核となるビジネスロジックを可能な限り単純に含む新しいフレームワークを構築し、途中でそれをリファクタリングします。

+0

あなたが作業しているコードは間違いありません。 私がしようとしていることは、それを行うための別のアプローチを考え出すことです。実際に何が起きているのかを理解することなく、どんな順番でそれが起こる必要があるのか​​、私は諺を丘の上に押し込もうとしています。 – Aidos

+0

考えている、働いていない... – Aidos

+0

+1私は対処しようとしていることを理解し、うまくいけば私がこれをやろうとしている理由について詳しく説明することができるので... – Aidos

0

あなたはどの言語を使用していますか? あなたの問題は、Java ExecutorとFuture <>タスクを使用してモデル化するのはかなり簡単なはずですが、選択したプラットフォームでも同様のフレームワークが使用可能でしょうか?

また、私はこれを正しく理解すれば、相互依存関係の大きな一連の計算にクリティカルなパスを生成したいと思っています。つまり、何かが動的に行われたのですか?

アルゴリズムソリューションについては、数値解析の教科書に最も近いコピーを取り出し、特異値分解とLU分解であなたの記憶をリフレッシュしてください。私はあなたがリンクしているツールの背後にあるものであると私の頭の上から推測しています。

EDIT:あなたは、Javaを使っているので、私は提案の提案の簡単な概要をあげる:

- >すべての計算をparallellizeするスレッドプールエグゼキュータを使用して簡単に

- > ANとの相互依存性を解決今後<のオブジェクトマップ>またはFutureTask <>:私はありません場合は、今すぐ

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); 

:S、すなわちあなたの変数は、A = B + Cは、このような何かをA、BとC、であれば完全にオフ(そして私は非常によく、それかもしれない私がJavaで作業して以来ずっと)、あなたはスレッドプールのサイズをチューニングすることによって明らかなデッドロックの問題を解決することができます。 (ただし、A = B + C、B = A + 1などのような相互依存関係のないタスクが存在することを確認する必要があります)

+0

私はjavjavを使用しています。 私はそれを並列化するのが大好きですが、私の問題はそれより基本的だと思います。私は依存関係が何であるかも知らない(私はそれを並列化したい場合、フォーク/マージポイントを特定する必要がある)。 – Aidos

+0

1.5より新しいJDKを使用できると仮定すると、java.util.concurrentパッケージを調べます。システムについてあまり知っている必要はありません。私は素早く汚い提案を与えるために私の答えを編集します:) – Christoffer

+0

確かに興味深いアプローチです!私はそれを試してみましょう、私はそれが1つの計算ではないことを記述していない問題の一部として動作するかどうかはわかりません。これらの計算のリンクリストを想像すると、リンクリストの前後の要素に依存するものもあります。これが問題をさらに複雑にします。 このアプローチは、私がどのようなことができるのか、どの順番で解決するのかを確かに可能にするはずです! – Aidos