软件结构建议

时间:2011-04-08 14:45:47

标签: c# oop

我之前在这里发过一个问题,提出了类似的建议,但是这个项目已经有了很大的发展,所以我想就专家如何解决这个问题寻求建议。

首先,我将描述问题所在,然后我目前如何看待它。拜托,我想学习 - 所以批评我的方法/告诉我我能做什么/应该做得更好!

要求: 我有一个日志文件解码器。我有三个不同的系统生成日志文件。每个系统略有不同。有七种不同类型的日志文件。每个日志文件可以是ASCII格式(人类可读)或二进制格式(非人类可读)。所以有很多不同的日志 - 但很多都是相似的。例如,对于 most ,二进制和ascii是不同形式的相同信息。 还有一种日志类型是完全不同的结构,即,如果a,b和c是不同的值 - 每个存储6次,大多数日志是类型1.一个日志是类型2。 类型1:abcabcabcabcabcabc 类型2:aaaaaabbbbbbcccccc

除此之外,每个系统都有一个状态寄存器。在这方面,这三个系统都是不同的。即7 * 8位寄存器,3 * 32位寄存器......这些需要在解码日志后处理(对于包含信息的日志),然后需要为其他信息(如果需要)绘制图表。

所以,到目前为止我的解决方案:

我有一个LogFile结构。它包含一个DataTable来包含所有数据。还包含一些字符串,例如从日志文件和一些枚举中读取的序列号(日志类型,系统类型,编码格式)

我有一个Parser类。这有一些静态方法:识别日志文件中包含的日志(ASCII文件可以包含几个不同的日志 - GUI将找出其中的内容,询问用户他们想要哪个,然后解码它。另一个静态作为工厂的方法,并给出Parser类的实例化 - 有3种类型。一种是泛型的。一种是二进制的(类型2,上面),另一种是ascii(上面的类型2)。

我有一个SystemType类。这包含诸如状态寄存器含义,每种类型的日志结构之类的信息。即在解码类型时,GUI将调用'GetTable,它将返回一个DataTable,其中包含要从文件中读取的字段列。然后,Parser可以循环遍历列,这将允许它知道从文件中读取的变量类型(Int,Single,String等)。

我有一个Reader课程。这是抽象的,有两个子类 - 一个用于ascii,一个用于二进制。所以,我可以调用reader.ReadInt,它会适当处理。

还有一个类可以生成图表并解码状态寄存器。状态寄存器只是一个字符串数组的数组,给出每个位的名称和描述。也许这可能是一个结构 - 但它有所作为吗?还有一个类在一个特定日志中分析3个值,如果它们存在,将插入一个列,其中包含从它们计算的值(它们是字符串)。

整件事情不是很灵活,但我不想为每个(3 * 7 * 2 =)42种日志类型写一个不同的类!它们太相似,但又不同,所以我认为它们会导致很多重复的代码。这就是为什么我想出了DataTable和通用Parser的想法。


所以,抱歉长篇文章!

我还有其他一些问题 - 我使用DataTable作为数据,因为我在GUI中使用DataGridView向用户显示所有这些。我认为这会简化这一点,但是有更好的方法吗?当我将DataTable绑定到DataGridView时,我必须遍历每个要查找特定行以突出显示,添加工具提示和设置各种列宽,这实际上需要整个解码过程。因此,如果有更有效的方法,那就太棒了!

感谢任何反馈!!拜托,我不能在这里有太多的建议,因为我一直在玩,重新排列多年来试图以一种我认为是一个很好的解决方案的方式来获得它,但它总是看起来很笨拙和紧密耦合,特别是与GUI。

2 个答案:

答案 0 :(得分:0)

唯一突然出现在我身上的是

  

我有一个LogFile结构

你真的从中获得了一个好处,这个结构可以解决潜在的陷阱吗?

来自guidelines

  

CONSIDER 如果类型的实例,则定义结构而不是类   很小,通常是短暂的或   通常嵌入其他   对象。

     

不要定义结构,除非该类型具有以下所有内容   特性:

     
      
  • 它逻辑上表示单个值,类似于原始类型   (int,double等)。
  •   
  • 实例大小小于16个字节。
  •   
  • 这是不可改变的。
  •   
  • 不必频繁装箱。
  •   

答案 1 :(得分:0)

您可能需要一个类而不是结构。

除非必须,否则我不会使用DataTable。我会使用List或类似的东西,你仍然可以将它绑定到您的DataGridView。对于格式化网格,如果这是一个选项,请购买一个UI控件库,它将为您提供比DataGridView更多的选项。我最喜欢的是Telerik,但其中有一堆。如果这不是一个选项,那么你将拥有一些自定义UI逻辑(后面是JavaScript或行绑定代码),它将查看你的绑定记录并根据类的属性做出决定。

至于42个不同的类,都具有相似的代码,使用可重用的代码创建一个抽象基类,并从不同的logtype类中的此类派生,在需要的地方覆盖基本功能。

使用接口分隔必须由logtype实现的功能,并实现这些接口。这样,当您遍历这些类的列表时,您就知道将基于接口实现哪些功能。

听起来您可以从使用接口将合同与实现分开,并将代码转换为合同来分离您的类,从而大大受益。

希望这有帮助。