Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Архитектурная задачка на C#


Автор: Competitor 7.7.2011, 15:53
Всем привет,
Значит есть такая архитектурная задачка:
Постановка: 
Есть около сотни разных алгоритмов, т.е. действий или операций, связанных с определенной предметной областью, которые принимают на вход какие-то параметры, и соответственно возвращают результат. На данный момент у меня есть базовый класс Algorithm, от него наследуются все остальные. Таким образом все алгоритмы у меня лежат в одной dll.

Теперь добавилось такое условие:
Появилась потребность в составных алгоритмах, которые будут работать по конвейерному типу, т.е. результат работы одного алгоритма будет являться входным параметром для следующего.
Например: A1 -> A2 -> A7 - выполнить первый алгоритм, результат отдать на вход второго, результат второго отдать на вход седьмого, результат седьмого вернуть.
И таких комбинаций довольно  много.

В идеале было бы круто в клиентском коде юзать это так: 
Код

var outputparameter = MegaConveyer<InputData, OutputData>(inputParameter, new A1(), new A2(), new A7())


Что думаете по этому поводу, как бы вы это реализовывали?

Автор: wester 7.7.2011, 15:57
о F# не думали ? там такое можно реализовать http://msdn.microsoft.com/ru-ru/library/dd233229.aspx#Y570.

Автор: Экскалупатор 7.7.2011, 17:14
Competitor, если решать в лоб, то что мешает передавать в метод массив экземпляров классов алгоритмов(можно использовать аргументы) и потом просто в цикле кидать между ними результат?

Автор: Competitor 8.7.2011, 09:34
Цитата

Competitor, если решать в лоб, то что мешает передавать в метод массив экземпляров классов алгоритмов(можно использовать аргументы) и потом просто в цикле кидать между ними результат?

1. Типы входных и выходных параметров у всех алгоритмов могут быть разные.
2. Это придется создавать такой цикл для каждой комбинации алгоритмов. Т.е. по сути получится по отдельному алгоритму на каждую такую комбинацию. А хочется какой-то обобщенный типизированный инструмент, который мог бы выполнять нужную комбинацию алгоритмов по цепочке

Добавлено через 6 минут и 12 секунд
Цитата

о F# не думали ? там такое можно реализовать http://msdn.microsoft.com/ru-ru/library/dd233229.aspx#Y570.

почитал я про F#,
А как это прикрутить можно?
например, если я сделаю таким образом, что в одной DLL будут все алгоритмы, в другой будет код на F#. И дальше из клиентского кода (C#) можно будет вызывать функцию на F# передавая ей конкретные алгоритмы на выполнение? Или как еще?

Автор: Экскалупатор 8.7.2011, 11:54
Competitor, ты же сказал что все алгоритмы наследуются от одного класса? ну так сделай нормальную архитектуру. и на вход принимай классы реализующие базовый класс алгоритма. или ты про какие то другие параметры говоришь? тогда расскажи более подробно...

Автор: wester 8.7.2011, 16:00
Competitor, 
Все алгоритмы реализованы в отдельной DLL на C#. Далее реализуем отдельную либу на F#
Код

let result = A1 |> A2 |> A7

более того , можно самому выбирать алгоритм, например
Код

let resultUser x y z = x |> y |> z

при условии что x y z возвращает значения, что бы передавать их дальше.
Код будет очень простой и наглядный. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)