Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 软件结构建议_C#_Oop - Fatal编程技术网

C# 软件结构建议

C# 软件结构建议,c#,oop,C#,Oop,我之前在这里发布了一个问题,询问类似的建议,但是这个项目已经有了很大的发展,所以我想询问专家们如何解决这个问题的建议 首先,我将描述问题是什么,然后是我目前如何看待它的。请,我想学习-所以请批评我的方法/告诉我我可以/应该做得更好 要求: 我有一个日志文件解码器。我有三个不同的系统生成日志文件。每个系统略有不同。有七种不同类型的日志文件。每个日志文件可以是ASCII格式(人类可读)或二进制格式(非人类可读)。所以有很多不同的日志,但很多都是相似的。例如,对于大多数人来说,二进制和ascii是不同

我之前在这里发布了一个问题,询问类似的建议,但是这个项目已经有了很大的发展,所以我想询问专家们如何解决这个问题的建议

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

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

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

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

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

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

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

我有一个Reader类。这是抽象的,有两个子类-一个用于ascii,一个用于二进制。因此,我可以调用Reader.ReadInt,它将进行适当的处理

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

所有这些都不是很灵活,但我不想为(3*7*2=)42个日志类型中的每一个都编写不同的类!它们太相似了,但又不同,所以我认为它们会导致大量重复代码。这就是为什么我想到了DataTable和通用解析器的想法


所以,很抱歉这么长的文字

我还有一些其他问题-我使用DataTable作为数据,因为我在GUI中使用DataGridView来向用户显示所有这些。我认为这会简化这一过程,但有更好的方法吗?当我将DataTable绑定到DataGridView时,我必须遍历每一个表,寻找要突出显示的特定行,adding工具提示和设置不同的列宽,这实际上需要整个解码过程的时间。因此,如果有更有效的方法,这将是伟大的


谢谢你的反馈!!请告诉我,我在这里没有太多的建议,因为我一直在玩,多年来一直在重新安排,试图以一种我认为是一个很好的解决方案的方式获得它,但是它看起来总是很笨重而且非常紧密地结合在一起,特别是与GUI。

我唯一想到的是这个

我有一个日志文件结构

作为一个能够克服潜在陷阱的结构,您是否真的从中受益

如果类型为 体积小,通常寿命短或 通常嵌入到其他 对象

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

  • 它在逻辑上表示单个值,类似于基元类型 (整数、双精度等)
  • 它的实例大小小于16字节
  • 它是不变的
  • 它不必经常装箱

您可能需要类而不是结构

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

对于42个不同的类,所有这些类都具有相似的代码,使用可重用代码创建一个抽象基类,并在不同的日志类型类中从该类派生,在需要时覆盖基类功能

使用接口分离必须由logtype实现的功能,并实现这些接口