Astazi aveam de parcurs o structura arborescenta. Din punct de vedere a implementarii nu era cine stie si aveam doua optiuni:
Sa va spun sincer am renutat la ea, din cauza ca nu era tocmai usor de inteles. Dar conteaza ca se poate, iar daca ne folosim imaginatia putem sa facem unele chestii destul de interesante.
Problema care o vad nu este la modul de implementare, nu este complicat deloc sa folosim doar expresii lambda( daca ne ajutam si de Func,Action si delegates putem sa facem aproape orice). Probleme o sa apara in momentul in care vrem sa facem debug pe un cod care nu este scris de noi. Expresiile lambda nu sunt foarte usor de inteles cand se intind pe mai multe randuri, iar impreuna cu recursivitate o sa le dam batai de cap celor care vin dupa noi. Codul IL generat in spate daca folosim lambda expression o sa fie chiar mai complicat decat daca folosim mecanismul standard.
Iata un exemplu de program care foloseste lambda expression si recursivitatea:
Sursa: http://www.lostechies.com/blogs/jimmy_bogard/archive/2007/05/18/fun-with-recursive-lambda-functions.aspx
Eu cred ca as cobora un sfant daca ar trebuii sa fac debug pe codul de mai sus. Nu il poti intelege in 2 secunde, ai nevoie de cateva momente pana intelegi ce se face acolo.
Unde as folosii eu expresiila lambda si recusivitatea? Pe orice fel de grafe, dar nu as incerca sa implementez in expresii lambda tot mecanismul de recursivitate.
Ar fi mai interesant ca avem metode ajutatoare pe noduri, care sa ne ajute sa iteram noduriile fiu de exemplu pe baza unor conditii care le dam prin expresii lambda, iar cand ajungem la nodul dorit sa putem executa o actiun pe baza unui action.
Concluzie: Chiar daca e mai fancy sa implemetam o functie recursiva intr-o lambda expression, nu recomand acest lucru daca codul este de o complexitate mediu sa ridicata, deoarece o sa fie foarte greu de inteles apoi. Dar exista cazuri cand ne putem folosii de ele.
- o metoda care se apeleaza recursiv;
- un while care sa faca cautarea in interiorul la structura pe care o aveam;
Func<Tree, Tree> searchParent =
currentCategorie =>
!currentCategorie.Parent != null
? currentCategorie
: searchParent(PlainTree.First(parentTree => parentTree == currentTree.Parent));
Sa va spun sincer am renutat la ea, din cauza ca nu era tocmai usor de inteles. Dar conteaza ca se poate, iar daca ne folosim imaginatia putem sa facem unele chestii destul de interesante.
Problema care o vad nu este la modul de implementare, nu este complicat deloc sa folosim doar expresii lambda( daca ne ajutam si de Func,Action si delegates putem sa facem aproape orice). Probleme o sa apara in momentul in care vrem sa facem debug pe un cod care nu este scris de noi. Expresiile lambda nu sunt foarte usor de inteles cand se intind pe mai multe randuri, iar impreuna cu recursivitate o sa le dam batai de cap celor care vin dupa noi. Codul IL generat in spate daca folosim lambda expression o sa fie chiar mai complicat decat daca folosim mecanismul standard.
Iata un exemplu de program care foloseste lambda expression si recursivitatea:
public class Program
{
delegate T SelfApplicable<T>(SelfApplicable<T> self);
static void Main(string[] args)
{
// The Y combinator
SelfApplicable<
Func<Func<Func<int,int>,Func<int,int>>,Func<int,int>>
> Y = y => f => x => f(y(y)(f))(x);
// The fixed point generator
Func<Func<Func<int, int>, Func<int, int>>, Func<int, int>> Fix =
Y(Y);
// The higher order function describing factorial
Func<Func<int,int>,Func<int,int>> F =
fac => x => x == 0 ? 1 : x * fac(x-1);
// The factorial function itself
Func<int,int> factorial = Fix(F);
for (int i = 0; i < 12; i++) {
Console.WriteLine(factorial(i));
}
}
}
Sursa: http://www.lostechies.com/blogs/jimmy_bogard/archive/2007/05/18/fun-with-recursive-lambda-functions.aspx
Eu cred ca as cobora un sfant daca ar trebuii sa fac debug pe codul de mai sus. Nu il poti intelege in 2 secunde, ai nevoie de cateva momente pana intelegi ce se face acolo.
Unde as folosii eu expresiila lambda si recusivitatea? Pe orice fel de grafe, dar nu as incerca sa implementez in expresii lambda tot mecanismul de recursivitate.
Ar fi mai interesant ca avem metode ajutatoare pe noduri, care sa ne ajute sa iteram noduriile fiu de exemplu pe baza unor conditii care le dam prin expresii lambda, iar cand ajungem la nodul dorit sa putem executa o actiun pe baza unui action.
public void ProcessChildrens(Func<Node,bool> condition,Action<Node> action)
{
Childrens.ForEach(node => node.ProcessChildrens(condition, action));
if (condition(this))
{
action(this);
}
}
Concluzie: Chiar daca e mai fancy sa implemetam o functie recursiva intr-o lambda expression, nu recomand acest lucru daca codul este de o complexitate mediu sa ridicata, deoarece o sa fie foarte greu de inteles apoi. Dar exista cazuri cand ne putem folosii de ele.
Comments
Post a Comment