Zdaję sobie sprawę, że jest to częściowo subiektywne, ale ogólnie jestem ciekawy opinii społeczności i nie udało mi się znaleźć istniejącego problemu, który rozwiązuje ten problem.Kiedy lambda w metodzie rozszerzenia robi zbyt wiele?
Jestem w nieco religijnej debacie z innym współpracownikiem o konkretnej instrukcji Select w zapytaniu L2EF.
.Select(r =>
{
r.foo.Bar = r.bar;
r.foo.Bar.BarType = r.Alpha;
if (r.barAddress != null)
{
r.foo.Bar.Address = r.barAddress;
r.foo.Bar.Address.State = r.BarState;
}
if (r.baz != null)
{
r.foo.Bar.Baz = r.baz;
if (r.bazAddress != null)
{
r.foo.Bar.Baz.Address = r.bazAddress;
r.foo.Bar.Baz.Address.State = r.BazState;
}
}
return r.foo;
})
Ostrzeżenia:
- Jest Linq-Podmiotów
- To po praca w DB jak zostały wykonane i powrócił
- Parametr wejściowy
r
jest anonimowa
Osobiście jestem zdania, że w (a) klauzula wyboru nie powinna zmieniać wartości, powinna jedynie projektować. Jego argumentem jest to, że niczego nie zmienia, po prostu upewnia się, że wszystko zostało poprawnie zainicjowane w wyniku zapytania DB. Po drugie, myślę, że gdy zaczyna on przechodzić do pełnych bloków kodu i instrukcji zwrotnych, nadszedł czas, aby zdefiniować metodę lub nawet Func<T, U>
i nie robić tego wszystkiego w linii. Tutaj komplikatorem jest, że dane wejściowe są anonimowe, więc trzeba zdefiniować typ. Niemniej jednak wciąż debatujemy nad punktem ogólnym, jeśli nie konkretnym.
Kiedy więc wyrażenie lambda robi zbyt wiele? Gdzie narysujesz rozmytą linię w piasku?
Wydaje się, że złożoność kodu wynika ze złożoności anonimowego typu; czy taki złożony anonimowy typ jest naprawdę potrzebny? –
@Dan, rzeczywiste zapytanie dotyczy lewych złączeń przechodzących przez 8 różnych jednostek, przy czym typ anonimowy zawiera po prostu obiekty tych elementów. nie jest to złożony typ anonimowy, per se, jest po prostu nieokreślony. to jest jak 'select new {foo, bar, baz,/* itd. * /}' –
To jest oczywiście Select z efektami ubocznymi. Zupełnie nie w zamyśle. W tym celu istnieje "foreach();". – Dykam