1

テストを扱うソフトウェアに取り組んでおり、Visual Studio 2008、C#3.5 を使用して開発しています。これらのテストは SQLite データベースに保存され、私のソフトウェアは結果を処理することを目的としています。

さて、次の列を持つテストに関する一般的な情報を収集する情報テーブルがあります。

  • LayerAName
  • LayerAId
  • LayerBName
  • LayerBId
  • LayerCName
  • LayerCId
  • LayerDName
  • LayerDId
  • Start: 結果テーブルがいつ作成されたかを示す DateTime。
  • Stop: 結果テーブルが最後にいつ変更されたかを示す DateTime。
  • ResultTableName: このテーブル名は、VirtualMode を使用して DataGridView に結果を表示するために使用されます。

レイヤーはIDを使用して識別され、レイヤーAからCまで、レイヤーは子レイヤーを収集するためのコンテナのように動作しています。最後のレイヤー「layerD」のみがデータベース内のテーブルにリンクされています。

public abstract class Layer
{
    public String Name { get; set; }
    public Int32 Id { get; set; }
    public DateTime Start { get; set; }
    public DateTime Stop { get; set; }
}

public class Project: Layer
{
    private Int32 Id { get; set; }
    public Dictionary<Int32, LayerB> As { get; set; }
}

public class LayerA : Layer
{
    public Project Parent { get; set; }
    public Dictionary<Int32, LayerB> Bs { get; set; }
}

public class LayerB : Layer
{
    public LayerA Parent { get; set; }
    public Dictionary<Int32, LayerC> Cs { get; set; }
}

public class LayerC : Layer
{
    public LayerB Parent { get; set; }
    public Dictionary<Int32, LayerB> Ds { get; set; }
}

public class LayerD : Layer
{
    public LayerC Parent { get; set; }
    public String ResultTableName { get; set; }
}
  • 明らかに、childLayer.Start < childLayer.Parent.Start => childLayer.Parent.Start = childLayer.Start.
  • 次のように、同じ種類のロジックが Stop 属性に使用されます。

とにかく、実際には、上記の設計に従ってすべてのオブジェクトを作成することにすでに成功していますが、主に、前述の情報テーブルに存在するすべての DataRows を実行する巨大なループを使用しています。Enumerable() として linq と DataTable を使用するバージョンも作成しましたが、私のコードの両方のバージョンは、私にとって非常に汚れていて、保守が困難です。困難は明らかに、主に Table / DataTable からこのレイヤー オブジェクトのセットへの変換に起因します。

では、どうすればこれを改善できるのか、今悩んでいます。

  • このデザインを改善する解決策はありますか?
  • 支援に使用する良いパターンはありますか?
  • 情報テーブルの現在のスキーマを持つ子レイヤーを含む辞書をフィルタリングおよび作成するための適切なリンクはありますか。

ありがとう。

4

1 に答える 1

0

では、なぜ

public class ConcreteLayer: Layer
{
    public Layer Parent { get; set; }
    public Dictionary<Int32, Layer> Children{ get; set; }
}

public class FinalLayer: Layer
{
    public Layer Parent { get; set; }
    public String ResultTableName { get; set; }
}
于 2013-05-13T03:41:24.443 に答える