1

我正在开发处理测试的软件,使用 Visual Studio 2008、C#3.5 进行开发。这些测试被保存到 SQLite 数据库中,我的软件旨在处理结果。

好吧,有一个信息表收集有关测试的一般信息,其中包含以下列:

  • 图层名称
  • 图层 ID
  • 图层名称
  • 层BId
  • 图层名称
  • 层CId
  • 图层名称
  • 层DId
  • 开始:一个日期时间,用于指示结果表的创建时间。
  • 停止:一个日期时间,指示最后一次修改结果表的时间。
  • ResultTableName:此表名用于使用 VirtualMode 在 DataGridView 中显示结果。

使用它们的 Id 和 btw 来区分这些层,从 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 属性使用相同类型的逻辑,如下所示:如果 childLayer.Stop > childLayer.Parent.Stop => childLayer.Parent.Stop = childLayer.Stop。

无论如何,事实是我已经根据上面的设计成功地创建了所有对象,但主要是通过使用一个巨大的循环来运行前面描述的信息表中的所有 DataRows 呈现。我还使用 linq 和 DataTable 作为 Enumerable() 制作了一个版本,但是我的代码的两个版本对我来说都非常肮脏且难以维护。困难显然主要来自从一个Table / DataTable到这组图层对象的转换

所以我现在想知道如何改进这个......

  • 有什么解决方案可以改进这个设计吗?
  • 有什么好的模式可以用来帮助吗?
  • 是否有任何适当的 linqs 用于过滤和创建包含具有当前信息表模式的子层的字典。

谢谢。

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 回答