Oop数据结构建议

时间:2011-07-20 14:22:27

标签: c# oop data-structures ooad

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

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

我在考虑将其描述为条目块。所以在第一种情况下,一个块是'AB',有5个块。在第二种情况下,第一个块是'A',读取5次。接下来是一个'B'块,读5次。

这是一个非常简化(实际上有40种不同类型的日志文件,每个文件在一个块中最多有40个传感器值)。没有日志超过300个块。

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

这一切看起来都很笨拙。谁能建议一个更好的方法呢?

4 个答案:

答案 0 :(得分:1)

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

当您了解OO概念时,您应该开始理解代码不是数据,而数据不是代码。如何从OOP立场表示您的数据并不重要。您可以编写OO代码来使用您的数据,或者您可以编写程序代码来使用您的数据,该部分与数据格式无关。

然后回到你的问题

  

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

这取决于您的需求。什么是写日志文件?你有控制作家和读者吗?如果我这样做,我将依赖于构建内置的serialization方法来最小化我需要编写的代码量。日志文件真的很长吗?如果是这样,您描述的“数据表”方法通常会更好。如果日志文件的文件大小不是很大,那么XML非常容易使用。

答案 1 :(得分:0)

至于OOP,你想学习SOLID

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

从一个简单的日志数据片段开始,然后编写一个类似的测试(您将找到一种更好的方法来实现经验并将其应用到您的情况中):

[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]);
}

该测试代码片段只是一个起点,我试图在断言中相当冗长。随着时间的推移,你可以提出更多创造性的方法。重点是从小做起。一旦此测试通过,添加另一个测试,在其中混合“AB”并更改解码器以正确处理此问题。最终,您将拥有一组可处理不同格式的大量测试。使用TDD,您将正确使用SOLID。每当您发现无法测试的内容时,您应该查看规则并查看是否无法使其更简单并注入依赖项。

最终你会陷入嘲弄。例如,您可能会发现您宁愿注意MyFileDecoder类具有读取日志文件的依赖项的能力。在这种情况下,您将创建一个模拟对象并将其传递给构造函数,并设置模拟以在调用方法时返回sequenceStub

答案 2 :(得分:0)

除了Bob提供的内容之外,我强烈建议Head First Design Patterns作为C#程序员的OO温和而强大的介绍。样本使用Java,可以轻松转换为C#。

答案 3 :(得分:0)

非常基本和直截了当:

  1. 使用IEnrty
  2. 等属性为string EntryBlock, int Count定义界面
  3. 定义一个代表Entry并实现IEntry
  4. 的类
  5. 执行二进制序列化的代码应该知道接口,例如它应该提供IEnumerable<IEntry>
  6. 班级Entry可以覆盖ToString()以返回类似[ABAB-2]的内容,当然,如果在序列化时这会有所帮助
  7. 界面IEntry可以提供方法无效CreateFromRawString(string rawDataFromLog)如果它有用,请自行决定
  8. 如果您想了解更多信息,请分享您用于序列化/反序列化的代码