|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Есть несколько делегатов. Нужно собрать из них один, причем по условиям. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Этот код приведет к Stack Overflow, а как по-другому собрать, что-то не могу сообразить, хотя, кажется, лежит на поверхности. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2018, 16:55 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Shocker.Pro, похоже на бесконечную рекурсию. в твоём же коде ошибки нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2018, 19:01 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Ошибки компиляции нет. Будет рекурсия из-за конвейера, потому что я присваиваю вызов одной и той же переменной. А мне надо собрать несколько функций друг за другом, но не все, а некоторые по условию ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2018, 19:07 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Shocker.Pro, да, не заметил n => зачем этот JavaScript-style? у тебя уже функция выполняет сборку и выполнение, зачем собирать в делегат? может хочешь expression tree? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2018, 19:17 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Ну получилось так на входе в функцию есть делегат в процессе обработки добавляются (или не добавляются) еще несколько после чего вызывается еще одна функция, в которую этот результирующий делегат передается и которая в конце-концов применяется для запроса к БД. Впрочем, ты прав, выражение ж нужно ) Впрочем, вопрос-то все равно останется тем же... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2018, 19:33 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Shocker.Pro, для построения новых функций тебе нужны деревья выражений ну или emit )) если хочешь комбинировать, тебе нужны спецификации шаблон chain-of-responsibility а ты пытаешься делать как в JavaScript, да и там замыкание функции тоже приведёт к рекурсии если тебе просто надо исправить этот код, то так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
но это не выглядит как нормальное решение ) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2018, 19:48 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Согласен, не выглядит. Я попытался реализовать что-то типа того: Код: c# 1. 2. 3. 4. 5. 6.
Только в данном случае функционал оказался разнесен по методам, и вместо конкретного делегата, у меня появился асбстрактный. То есть, конечно, тут вообще должно быть выражение, а не делегат. Завтра на свежую голову еще раз попробую уже с выражением. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2018, 20:04 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Shocker.Pro, просто разные уровни - метаданные смещены с конечным кодом надо сгенерировать код и вызвать ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2018, 20:37 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Shocker.Pro, Выражения ты можешь строить благодаря тому, что IQueryable можно достраивать и прогонять через спецификации. Но ты почему-то собираешь делегаты. Это очень странно ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2018, 21:32 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
hVosttВыражения ты можешь строить благодаря тому, что IQueryable можно достраивать и прогонять через спецификации. Но ты почему-то собираешь делегаты. Это очень странно )))Я может немного переусложнил архитектуру. Но раз вопрос поднят, хочу его добить. Делегат взялся как раз из того, что мне нужно передавать запрос в "достраиватель" в виде коллбека. Попробую на примере: В самом низу стека вызова есть метод, который строит начало запроса, потом выполняет коллбэк для достройки запроса, а потом выполняет его, то есть примерно так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
А вот вышестоящий вызов как раз формирует этот "достраиватель" из нескольких условий, плюс у него на входе тоже есть аналогичный достраиватель в виде входного параметра, который тоже надо учесть. Но я, кажется понял, в вызывающем методе нужно сделать просто один большой делегат-достраиватель, а не пытаться накопить его в переменной В общем, перемудрил на несвежую голову, иногда нужно просто с тобой поболтать, чтобы понять самого себя Спасибо ЗЫ:hVosttпрогонять через спецификации что ты имел ввиду? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2018, 04:28 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Shocker.ProЭтот код приведет к Stack Overflow, а как по-другому собрать, что-то не могу сообразить, хотя, кажется, лежит на поверхности. Ну еще бы. Решарпер такой код сразу подчеркивает с предупреждением Access to modified closure для funcResult внутри func2, func3, func4. Причина очень проста: на каждом шаге комбинирования тот funcResult, который скармливается функции конвейера, и сам funcResult - одно и то же, т.к. выполнение происходит после присваивания. Отсюда и SOF. Стандартный выход - копировать замыкаемую переменную в отдельную локальную. Вырожденный пример, когда комбинируем всё: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Вывод: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2018, 06:20 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Не, ну причины-то понятны, я написал этот код как пример. Надо было просто сделать так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2018, 06:30 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Shocker.ProhVosttпрогонять через спецификации что ты имел ввиду? Походу шаблон Спецификация и в частности Composite Specification. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2018, 07:36 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
skyANAПоходу шаблон Спецификация и в частности Composite Specification.А, ну это оверкодинг для моей задачки. Я просто разнес несколько приватных методов, чтобы избежать повторения кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2018, 07:53 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Shocker.ProskyANAПоходу шаблон Спецификация и в частности Composite Specification.А, ну это оверкодинг для моей задачки. Я просто разнес несколько приватных методов, чтобы избежать повторения кода. Ну собственно ты и начал делать эти спецификации, только почему-то не захотел из грамотно оформить ) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2018, 11:40 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
hVosttНу собственно ты и начал делать эти спецификации, только почему-то не захотел из грамотно оформить )Эти промежуточные методы помимо операций над запросом выполняют и другую логику, для нормальной реализации паттерна, пришлось бы создавать веер классов, а все на самом деле происходит внутри всего лишь одного класса в приватных методах. Но на будущее посмотрю в сторону использования паттерна в подобных случаях )) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2018, 11:59 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Shocker.Pro, не оно? https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/delegates/how-to-combine-delegates-multicast-delegates ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2018, 12:41 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
Shocker.Proпришлось бы создавать веер классов Веер классов может содержать данные, которые применяют или нет спецификацию. Допустим, самый распространённый случай: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Это идеологический пример. На деле есть готовые решения, которые берёшь и используешь :) Чем лучше? Все спецификации можно тестировать. Их изменение и сопровождение не ломает ничего, они могут лежать в разных сборках. Они могут комбинироваться сколько угодно благодаря общему интерфейсу. И т.д. и т.п., этот на первый взгляд оверхед, очень даже оправдан по всем фронтам. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2018, 12:44 |
|
Собрать конвейер
|
|||
---|---|---|---|
#18+
SiemarglShocker.Pro, не оно? https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/delegates/how-to-combine-delegates-multicast-delegates Нет!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2018, 12:44 |
|
|
start [/forum/topic.php?fid=20&fpage=28&tid=1399265]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 290ms |
total: | 417ms |
0 / 0 |