Предложение по дизайну для оценки дерева выражений с данными временных рядов

У меня есть генетическая программа (C#), которая использует данные финансовых временных рядов, и в настоящее время она работает, но я хочу перепроектировать архитектуру, чтобы сделать ее более надежной. Мои основные цели:

  • последовательно представлять данные временных рядов деревьям выражений.
  • разрешить деревьям выражений доступ к предыдущим строкам данных, когда это необходимо.
  • для оптимизации производительности доступа к данным при оценке деревьев выражений.
  • сохраняйте общий интерфейс, чтобы можно было использовать различные типы данных.

Вот возможные подходы, о которых я думал:

  1. Я могу оценить дерево выражения, передав строку данных в корневой узел и позволив каждому дочернему узлу использовать одну и ту же строку данных.
  2. Я могу оценить дерево выражения, передав индекс строки данных и позволив каждому узлу получить строку данных из общего DataSet (в настоящее время я передаю индекс строки и перехожу к нескольким синхронизированным массивам для получения данных).
  3. Гибрид: неизменяемый набор данных доступен для всех деревьев выражений, и каждое дерево выражений оценивается путем передачи строки данных.

Преимущество первого подхода заключается в том, что строка данных передается в дерево выражений, и дальнейшие запросы к набору данных не выполняются (что должно повысить производительность в многопоточной среде). Недостатком является то, что дерево выражений не имеет доступа к остальным данным (на тот случай, если некоторым функциям потребуется выполнить вычисления с использованием предыдущих строк данных).

Преимущество второго подхода заключается в том, что деревья выражений могут получить доступ к любым данным до последней строки данных, но если я не укажу, что это за строка, мне придется перебирать строки и выяснять, какая из них является последней.

Преимущество гибрида заключается в том, что он обычно должен работать лучше и по-прежнему обеспечивать доступ к более ранним данным. Он поддерживает два основных «представления» данных: последнюю строку и предыдущие строки.

Знаете ли вы, ребята, какие-либо шаблоны проектирования или у вас есть какие-либо советы, которые могут помочь мне построить систему такого типа? Должен ли я использовать DataSet для хранения и представления данных, или есть более эффективные способы представления строк данных при сохранении простого интерфейса?

К вашему сведению: весь мой код написан на C#.


person Kiril    schedule 05.05.2010    source источник


Ответы (1)


То, что вы сказали, в основном относится к операциям, которые не должны быть первой инициативой для объектно-ориентированного проектирования. Я предлагаю вам создать RowObject, который сопоставляется с каждой строкой таблицы данных, и создать еще один класс RowObjectManager, который содержит коллекцию RowObject и связанные операции, такие как вызов алгоритма. Это очень похоже на шаблон Facade, и вы можете инкапсулировать алгоритм в другой класс и вызывать алгоритм, используя способ внедрения зависимостей, который можно отделить от класса RowObjectManager.

Затем вы должны передать OBJECT, а не свойства объекта, такие как index, алгоритму, и алгоритм может вернуть результат вызывающей стороне.

person zs2020    schedule 05.05.2010
comment
Итак, я должен передать RowObjectManager в функцию оценки дерева выражений, и он должен вызвать соответствующий метод, чтобы получить либо последний RowObject, либо любой из предыдущих RowObject(s)? - person Kiril; 05.05.2010
comment
да. Вы можете использовать статический метод в RowObjectManager для поддержания текущего индекса и создания next() и pre() для возврата RowObject рядом с текущим или перед ним. И вы передаете объект, который вы получили, в алгоритм и вызываете метод в классе алгоритма для обработки, а затем возвращаете результат. - person zs2020; 05.05.2010