2016-07-21 6 views
-1

私が書いているアプリケーションで使っていた古いコード行とクラスのいくつかを書き直していますが、今私はこれに触れるかどうかを決めようとしていますそれをそのまま残してください。大きなスイッチ文または仮想ボイドを持つ散布図

現在のところ、基本的に1つのスレッドで実行されているクラスがあり、常に異なる結果を返すよう呼び出されています。このクラスは基本的にswitch文に依存しており、与えられた情報を考慮して何をすべきかを選択します。

ここで私は決定が難しいです。 switch文には300以上のケースがあり、クラス自体には約25,000行のコードがあります。これは複雑であるため、保守や読み込みが困難なことは明らかです。

私が気にしていたことは、基本的に仮想ボイドを持つ基本クラスハンドラであり、目的のクラス(以前のswitch文の場合と同じ)からデータを取り出し、コードを実行するためにオーバーライドします。

だから私はこれについて意見を求めたかったのです。何が望ましいですか? 25,000行以上のコードを読み書きするのが難しいswitch文ですが、私が正しいと速く、呼び出されたときにベースハンドラをオーバーライドする300の異なるクラスがありますか?

+1

人間は、どの世界で25000行のコードを維持するのが望ましいでしょうか?特に1つの方法の中で。それは明らかです。 –

+0

これらの25000行に繰り返しがありますか?そうであれば、それがリファクタリングの対象になります。繰り返しがない場合は、複数のクラスでケースを分割し、それぞれがスイッチのブランチを処理します(「戦略」)。その後、戦略を辞書にロードします。ディクショナリアクセスはswitch文よりもわずかに遅く、残りのコードと比べると無視できるほどの影響があります。あなたはいくつかの例を提供することができますか(多分25000全体ではないかもしれませんが、おそらく1000のような行ですか?)。 –

+0

25,000行に繰り返しはありません。すべてが違っていて、ユニークな動作を指しています。 私はどのクラスを選択するかを辞書を使用していません...これは私がやっている方法です: var id = Type.GetType( "MyApp.SubFolder.ID_" + _identifier); var identifier = Activator.CreateInstance(id、_myparam)as MyClass; – NyoPHP

答えて

1

99%のシナリオでは、効率性を維持することをお勧めします。これがC#であることを考えれば、ハード・デッドライン・ベースのループ時間や、通常は低レベル言語やリアルタイム組み込みシステムに関連する他のミッション・クリティカルな要件はないと想定します。

私は25,000行のファイルは保守不能で、分解する必要があると言います。それは、それを仮想クラスのセットに分解したり、継承で抽象的な断片を作成しようとするなどの従来の分解を使用することを意味するものではありません。

は(ただし、私は通常、抽象クラスを継承を使用して傾く。私は、生成されたコードを拡張する外部の仮想化のために良いユースケースをめったに見つからない)

仮想無効に散乱、最初の質問に答えるためにはより良いソリューションです1つの大きなswitch文

運が良かった!

+0

ありがとうございました。それは理にかなっており、私も心に留めていたことです。 – NyoPHP