C #, шаблон дизайна класса контейнера? - PullRequest
2 голосов
/ 01 ноября 2011

Я углубился в C #, но столкнулся с проблемой, которую, похоже, не могу решить:

Я разработал финансовый бэк-тест и движок для трейдинга, и в рамках этого мне нравится реализовывать «Контейнер стратегии». Этот контейнер стратегии должен служить двум целям. (1) содержат экземпляры различных стратегий, которые выполняют математические вычисления, и (2) предоставляют средства доступа для передачи новых тиковых данных в экземпляры стратегии и получения определенной информации обратно из экземпляров стратегии.

Различные стратегии, которые я упоминал выше, должны быть уникальными классами, которые, однако, являются производными от базового класса. Я хочу выполнять совершенно разные операции в рамках этих стратегий, поэтому я подумал, что их реализация в виде отдельных классов, производных от одного базового класса, будет возможной. Одна сложность заключается в том, что мне нужно несколько экземпляров каждого класса стратегии, который содержится в контейнере стратегий. Каждый класс стратегии также содержит список биржевых символов, и каждый символ должен иметь свой экземпляр стратегии.

Другим важным моментом контейнера Strategy является то, что он может создавать, создавать экземпляры, а затем также вызывать каждый экземпляр стратегии.

Я хотел бы спросить некоторых из вас, какие у вас есть идеи, как я мог бы разработать и реализовать это:

  • Каким будет лучший шаблон дизайна?
  • как описано, если я создам разные классы для каждой стратегии, тогда я, очевидно, также получу разные типы, как я могу хранить все эти элементы в одном контейнере / коллекции в контейнере стратегии?
  • Как я могу либо с помощью рефлексии, либо с помощью других средств создавать, создавать и вызывать методы каждого отдельного экземпляра стратегии, не зная, сколько у меня будет в итоге. Я знаю названия и типы стратегий, и я знаю названия биржевых символов.
  • Я просто хочу указать, какие стратегии я хочу подключить (я даю названия стратегий = имена классов?) И для каждой стратегии список биржевых символов. Контейнер стратегий будет создавать экземпляры для каждого символа в каждой стратегии типа стратегии, для которого был предоставлен список, и впоследствии будет вызывать метод «RunStrategy (Quote quote)», который подает новые цитаты в каждый экземпляр, чтобы можно было выполнять вычисления.
  • Одна из целей состояла бы в том, чтобы поддерживать интерфейс каждого класса стратегии как можно более чистым, при этом большая часть стандартной (повторяющейся) функциональности реализована в базовом классе производного от.

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

Edit: Graymatter, я немного поиграл и, кажется, вы предоставили именно то, что я искал. Большое спасибо.

class Program
{
    static void Main(string[] args)
    {
        List<IStrategy> container = new List<IStrategy>();

        container.Add(new StrategyOne());

        container[0].AddValue(50);

        Console.ReadLine();
    }




}

public interface IStrategy
{
    void AddValue(int value);  
}


public class StrategyOne : StrategyBase
{
    public override void Calculates()
    {
        Console.WriteLine("This is my value: " + myValue);
    }

}

public class StrategyBase : IStrategy
{
    protected int myValue;

    public void AddValue(int value)
    {
        Console.WriteLine("Run Strategy in Base");

        myValue = value;

        Calculates();
    }

    public virtual void Calculates()
    {

    }  
}

Ответы [ 2 ]

5 голосов
/ 01 ноября 2011

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

Что-то вроде:

public interface IStrategy
{
  void RunStrategy(Quote quote);
}

Тогда ваши реализации будут выглядеть примерно так:

public class StrategyOne : IStrategy
{
  void RunStrategy(Quote quote)
  {
  }
}

Контейнер может быть:

List<IStrategy> container = new List<IStrategy>();
1 голос
/ 01 ноября 2011

Ну, проект должен появиться из анализа требований / анализа. Я бы не просто решил использовать тот или иной шаблон, а затем попытаться выяснить, как он подходит к домену.

производный от базового класса

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

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

...