#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 — требования неясны. Возможно, если вы ответите на этот вопрос или у вас возникнет другой вопрос, на него можно будет ответить. Мой ответ, возможно, был не столько ответом, сколько просто дружеским советом.