Делегат как параметр, что не так с кодом.
От: #John Европа https://github.com/ichensky
Дата: 20.04.21 15:51
Оценка: 2 (1)
Здравствуйте,

почему передавать так делегат в функцию плохой тон?


class BaseClass
{
    protected virtual async Task<Foo> Bar(int x, Func<Foo, Task<int>> func)
    {        
        ...
        using(var context = new AmbientContext(x))
        {
            var foo = context.Foo;
            var result= await func(foo);
            
            context.Save(smth);
            
            return foo;
        }
    }


Если `func` вынести в отдельный виртуальный метод, код станет лучше?
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re: Делегат как параметр, что не так с кодом.
От: Sharov Россия  
Дата: 20.04.21 16:03
Оценка:
Здравствуйте, #John, Вы писали:

J>Здравствуйте,


J>почему передавать так делегат в функцию плохой тон?



J>
J>class BaseClass
J>{
J>    protected virtual async Task<Foo> Bar(int x, Func<Foo, Task<int>> func)
J>    {        
J>        ...
J>        using(var context = new AmbientContext(x))
J>        {
J>            var foo = context.Foo;
J>            var result= await func(foo);
            
J>            context.Save(smth);
            
J>            return foo;
J>        }
J>    }

J>


Потому что это может быть что угодно, что при открытом контексте с бд не очень здорово. Т.е. какой-то сложный алгоритм,
Thread.Sleep, task.delay и т.д. Т.е. лучше передавать результат работы делегата\задачи, а не саму задачу.
Кодом людям нужно помогать!
Re[2]: Делегат как параметр, что не так с кодом.
От: #John Европа https://github.com/ichensky
Дата: 20.04.21 16:15
Оценка:
Здравствуйте, Sharov, Вы писали:

J>>
J>>class BaseClass
J>>{
J>>    protected virtual async Task<Foo> Bar(int x, Func<Foo, Task<int>> func)
J>>    {        
J>>        ...
J>>        using(var context = new AmbientContext(x))
J>>        {
J>>            var foo = context.Foo;
J>>            var result= await func(foo);
            
J>>            context.Save(smth);
            
J>>            return foo;
J>>        }
J>>    }

J>>


S>Т.е. лучше передавать результат работы делегата\задачи, а не саму задачу.

Внутри метода Bar используется AmbientContext, передать результат работы `func` не получится.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[3]: Делегат как параметр, что не так с кодом.
От: Sharov Россия  
Дата: 20.04.21 16:19
Оценка:
Здравствуйте, #John, Вы писали:

J>Внутри метода Bar используется AmbientContext, передать результат работы `func` не получится.


Не увидел. Тогда с виртуальным методом было бы лучше -- больше надо сделать, чтобы сделать что-то не то.
Как минимум наследоваться.
Кодом людям нужно помогать!
Re[4]: Делегат как параметр, что не так с кодом.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 20.04.21 17:05
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, #John, Вы писали:


J>>Внутри метода Bar используется AmbientContext, передать результат работы `func` не получится.


S>Не увидел. Тогда с виртуальным методом было бы лучше -- больше надо сделать, чтобы сделать что-то не то.

S>Как минимум наследоваться.
Можно же создать наследника, принимающего делегат. Получится то же самое, но чуть страньше.
Re[5]: Делегат как параметр, что не так с кодом.
От: Sharov Россия  
Дата: 20.04.21 17:25
Оценка:
Здравствуйте, samius, Вы писали:

S>>Не увидел. Тогда с виртуальным методом было бы лучше -- больше надо сделать, чтобы сделать что-то не то.

S>>Как минимум наследоваться.
S>Можно же создать наследника, принимающего делегат. Получится то же самое, но чуть страньше.

Речь о том, что никакого параметра делегата у наследника не будет, только контекст.
Кодом людям нужно помогать!
Re[6]: Делегат как параметр, что не так с кодом.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 20.04.21 17:32
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, samius, Вы писали:


S>>>Не увидел. Тогда с виртуальным методом было бы лучше -- больше надо сделать, чтобы сделать что-то не то.

S>>>Как минимум наследоваться.
S>>Можно же создать наследника, принимающего делегат. Получится то же самое, но чуть страньше.

S>Речь о том, что никакого параметра делегата у наследника не будет, только контекст.

Что помешает создать наследника, принимающего делегат? Как с IDisposable и Action, который только ленивый не обернул?
Re[7]: Делегат как параметр, что не так с кодом.
От: Sharov Россия  
Дата: 20.04.21 17:43
Оценка:
Здравствуйте, samius, Вы писали:

S>>Речь о том, что никакого параметра делегата у наследника не будет, только контекст.

S>Что помешает создать наследника, принимающего делегат? Как с IDisposable и Action, который только ленивый не обернул?

Так func(foo) будет виртуальным методом класса, без каких-либо делегатов.
Кодом людям нужно помогать!
Re: Делегат как параметр, что не так с кодом.
От: WolfHound  
Дата: 20.04.21 19:57
Оценка: 1 (1) +2
Здравствуйте, #John, Вы писали:

J>почему передавать так делегат в функцию плохой тон?

Нормальный тон.

J>Если `func` вынести в отдельный виртуальный метод, код станет лучше?

Станет хуже. Ибо в коде станет больше грязи.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Делегат как параметр, что не так с кодом.
От: #John Европа https://github.com/ichensky
Дата: 21.04.21 08:36
Оценка:
Здравствуйте, WolfHound, Вы писали:

J>>Если `func` вынести в отдельный виртуальный метод, код станет лучше?

WH>Станет хуже. Ибо в коде станет больше грязи.

Получается так, потому что будет два отдельных метода, которые будут нарушать soLid.
С другой стороны когда мы передаем делегат как параметр — мы всего навсего передает "интерфейс" к коду который скрыт за делегатом, потому с solid тут все ок.
Думаю в варианте с делегатом не хватает только хороших xml комментариев.
Вместо делегата можно передавать интерфейс с каким-то методом, но в этом случае придется реализовывать этот интерфейс, но зато будут описаны более строгие правила по передачи правильного объекта.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[3]: Делегат как параметр, что не так с кодом.
От: Sharov Россия  
Дата: 21.04.21 09:53
Оценка:
Здравствуйте, #John, Вы писали:


J>Думаю в варианте с делегатом не хватает только хороших xml комментариев.

J>Вместо делегата можно передавать интерфейс с каким-то методом, но в этом случае придется реализовывать этот интерфейс, но зато будут описаны более строгие правила по передачи правильного объекта.

Интерфейс тоже неплохой вариант.
Кодом людям нужно помогать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.