我正在编写一个日志文件解码器,它应该能够读取许多不同的文件结构。我的问题是如何最好地表示这些数据。我正在使用C#,但我是OOP的新手。
一个例子: 日志文件具有一系列传感器值。一个传感器读数可以称为 A ,另一个 B 。显然,有超过2种条目类型。 在不同的日志文件中,它们可以存储为ABABABABAB或AAAAABBBBB。
我在考虑将其描述为条目块。所以在第一种情况下,一个块是'AB',有5个块。在第二种情况下,第一个块是'A',读取5次。接下来是一个'B'块,读5次。
这是一个非常简化(实际上有40种不同类型的日志文件,每个文件在一个块中最多有40个传感器值)。没有日志超过300个块。
目前,我将所有这些存储在数据表中。我为每个条目都有一个列,其中包含要读取的数量的属性。如果将其设置为-1,则它将继续到块中的下一列。如果没有,它将假定它已到达块的末尾。
这一切看起来都很笨拙。谁能建议一个更好的方法呢?
答案 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)
非常基本和直截了当:
IEnrty
string EntryBlock, int Count
定义界面
Entry
并实现IEntry
IEnumerable<IEntry>
Entry
可以覆盖ToString()
以返回类似[ABAB-2]的内容,当然,如果在序列化时这会有所帮助IEntry
可以提供方法无效CreateFromRawString(string rawDataFromLog)
如果它有用,请自行决定如果您想了解更多信息,请分享您用于序列化/反序列化的代码