C #, шаблон проектирования класса контейнера?

#c# #class #reflection #containers #base

#c# #класс #отражение #контейнеры #База

Вопрос:

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

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

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

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

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

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

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

Редактировать: 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()
    {

    }  
}
 

Ответ №1:

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

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

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

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

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

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

 List<IStrategy> container = new List<IStrategy>();
 

Комментарии:

1. Позвольте мне немного поиграть с этими идеями, я отчитываюсь после экспериментов, спасибо за ваш вклад, действительно ценится!!!

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

Ответ №2:

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

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

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

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

Комментарии:

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

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

3. Все это полностью реализовано и выполнено. Что мне нужно, как уже было сказано, так это дизайн, который содержит и повторяет различные классы стратегий. Данные Tick хранятся в структуре Tick. База данных в памяти предоставляет доступные временные ряды, к которым некоторым стратегиям может потребоваться доступ. Все это сделано и работает хорошо. Теперь мне нужно создать контейнер, который содержит все экземпляры стратегии и может вызывать их.

4. @Matt это выходит за рамки вопроса SO — требования неясны. Возможно, если вы ответите на этот вопрос или у вас возникнет другой вопрос, на него можно будет ответить. Мой ответ, возможно, был не столько ответом, сколько просто дружеским советом.