用时间序列数据设计表达树评估的建议

时间:2010-05-05 03:01:48

标签: c# design-patterns expression-trees

我有一个(C#)基因程序,它使用金融时间序列数据,目前正在运行,但我想重新设计架构,使其更加强大。我的主要目标是:

  • 按顺序将时间序列数据呈现给表达式树。
  • 允许表达式树在需要时访问以前的数据行。
  • 在评估表达式树时优化数据访问的性能。
  • 保留一个通用界面,以便可以使用各种类型的数据。

以下是我想到的可行方法:

  1. 我可以通过将数据行传入根节点并让每个子节点使用相同的数据行来评估表达式树。
  2. 我可以通过传入数据行索引并让每个节点从共享DataSet获取数据行来评估表达式树(当前我正在传递行索引并转到多个同步数组以获取数据)。
  3. 混合:所有表达式树都可以访问不可变数据集,并通过传入数据行来评估每个表达式树。
  4. 第一种方法的好处是数据行被传递到表达式树中,并且没有对数据集进行进一步查询(这应该可以提高多线程环境中的性能)。缺点是表达式树无法访问其余数据(如果某些函数需要使用以前的数据行进行计算)。

    第二种方法的好处是表达式树可以访问最新数据行的任何数据,但除非我指定该行是什么,否则我将不得不遍历行并找出哪一行是最后一个。

    混合的好处是它通常应该表现更好,并且仍然提供对早期数据的访问。它支持数据的两个基本“视图”:最新行和前一行。

    你们知道任何设计模式,或者你有什么技巧可以帮助我建立这种类型的系统?我应该使用DataSet来保存和显示数据,还是有更有效的方法来呈现数据行,同时保持简单的界面?

    仅供参考:我的所有代码都是用C#编写的。

1 个答案:

答案 0 :(得分:1)

你所说的主要是关于操作,这不应该是面向对象设计的第一个举措。我建议你创建RowObject,它映射到数据表的每一行,并创建另一个类RowObjectManager,它包含RowObject的集合和调用算法的相关操作。这与Facade模式非常相似,您可以将算法封装在另一个类中,并使用依赖注入方式调用算法,该方法可以与RowObjectManager类分离。

然后你应该将OBJECT而不是像index这样的对象的属性传递给算法,算法可以将结果返回给调用者。