Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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

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_Data Structures_Ooad - Fatal编程技术网

C# 面向对象的数据结构建议

C# 面向对象的数据结构建议,c#,oop,data-structures,ooad,C#,Oop,Data Structures,Ooad,我正在写一个日志文件解码器,它应该能够读取许多不同结构的文件。我的问题是如何最好地表示这些数据。我正在使用C#,但我对OOP是新手 例如: 日志文件具有一系列传感器值。一个传感器读数可以称为A,另一个传感器读数可以称为B。显然,有两种以上的条目类型。 在不同的日志文件中,它们可以存储为abababab或aaaabbbbb 我正在考虑将其描述为条目块。因此,在第一种情况下,一个块将是'AB',有5个块。在第二种情况下,第一个块为“A”,读取5次。随后是一个“B”块,读取5次 这相当简单(实际上有4

我正在写一个日志文件解码器,它应该能够读取许多不同结构的文件。我的问题是如何最好地表示这些数据。我正在使用C#,但我对OOP是新手

例如: 日志文件具有一系列传感器值。一个传感器读数可以称为A,另一个传感器读数可以称为B。显然,有两种以上的条目类型。 在不同的日志文件中,它们可以存储为abababab或aaaabbbbb

我正在考虑将其描述为条目块。因此,在第一种情况下,一个块将是'AB',有5个块。在第二种情况下,第一个块为“A”,读取5次。随后是一个“B”块,读取5次

这相当简单(实际上有40种不同类型的日志文件,每个文件块中最多有40个传感器值)。没有日志的块数超过300个

目前,我将所有这些存储在一个数据表中。每个条目都有一列,属性为要读取多少。如果将其设置为-1,它将继续到块中的下一列。如果没有,它将假定它已到达块的末尾


这一切似乎都很笨拙。有人能提出更好的方法吗?

我认为您应该先开始,然后再了解一下什么是面向对象编程。在学习面向对象编程时,不要担心当前的问题

当您学习OO概念时,您应该开始理解代码不是数据,数据也不是代码。从面向对象的角度来看,如何表示数据并不重要。您可以编写OO代码来使用数据,也可以编写过程代码来使用数据,这一部分与数据的格式无关

那么回到你的问题上来

我的问题是如何最好地表示这些数据


这取决于你的需要。写日志文件是什么?你能控制作者和读者吗?如果我这样做了,我将依靠内置方法来减少需要编写的代码量。日志文件会很长吗?如果是这样,您描述的“数据表”方法通常更好。如果日志文件的文件大小不是很大,那么XML确实很容易使用

至于OOP,您需要学习

我建议您使用测试驱动开发来构建它

从一个简单的日志数据片段开始,编写一个测试,如(您将根据经验找到更好的方法,并将其应用于您的情况):

[测试]
public void ReadSequence\u FiveA\u returns属性列表()
{
//安排
string sequenceStub=“AAAAA”;
//表演
MyFileDecoder解码器=新的MyFileDecoder();
列表结果=解码器.ReadSequence(sequenceStub);
//断言
Assert.AreEqual(5,results.Count);
Assert.AreEqual(“A”,结果[0]);
}
该测试代码片段只是一个起点,我已经尝试在断言中相当详细。随着时间的推移,你可以想出更具创造性的方法。关键是从小事做起。一旦该测试通过,添加另一个测试,在其中混合“AB”,并更改解码器以正确处理该测试。最终,您将有一组处理不同格式的测试。使用TDD,您将走上正确使用SOLID的道路。无论何时发现无法测试的内容,都应该检查规则,看看是否无法简化并注入依赖项


最终你会被嘲笑的。例如,您可能会发现,您更愿意为
MyFileDecoder
类注入一种能够读取日志文件的依赖项的功能。在这种情况下,您将创建一个mock对象并将其传递到构造函数中,并将mock设置为在调用方法时返回
sequenceStub

除了Bob提供的内容之外,我强烈建议作为C#程序员对OO的温和而健壮的介绍。这些示例是用Java编写的,很容易翻译成C语言。

非常简单明了:

  • 使用
    string EntryBlock、int Count等属性为
    IEnrty
    定义一个接口
  • 定义一个表示
    条目的类
    ,并实现
    IEntry
  • 执行二进制序列化的代码应该知道接口,例如,它应该refferIEnumerable
  • Entry
    可以重写
    ToString()
    以返回类似[ABAB-2]的内容,如果这在序列化过程中有帮助的话
  • 接口
    IEntry
    可以提供方法void
    CreateFromRawString(string rawDataFromLog)
    如果有帮助,请自行决定

  • 如果您想了解更多信息,请共享用于序列化/反序列化的代码。

    是否易于用户阅读?日志文件为二进制格式。我需要读入它并在GUI中显示它。它需要在GUI中清晰显示,所以我已经尝试使用DataGridView。嗨,Bob,谢谢你的链接。我已经试着围绕这个主题读了不少书,但这只是让我的头脑进入了正确的思维方式,我正在努力解决这个问题!我相信这是有经验的,但目前似乎有100种方法可以做到这一点,我相信还有100种方法我还没有想到。正在其他地方以二进制格式生成日志文件。我只需要解码和显示它,但不能改变它的结构。我认为序列化会在原始数据周围添加额外的信息-我在这里是不是不正确?我该怎么做呢?当您需要使用多种日志文件格式时,为您的问题提供OO解决方案的优势就会开始显现出来。基类将定义如何使用所有常用方法(如打开文件、读取文件、关闭文件、返回显示结果等)对文件进行解码的过程。当您说日志文件是以二进制格式在别处生成的时,您的意思是
    [Test]
    public void ReadSequence_FiveA_ReturnsProperList()
    {
      // Arrange
        string sequenceStub = "AAAAA";
    
        // Act
        MyFileDecoder decoder = new MyFileDecoder();
        List<string> results = decoder.ReadSequence(sequenceStub);
    
        // Assert
        Assert.AreEqual(5, results.Count);
        Assert.AreEqual("A", results[0]);
    }