Dużo programowałem kiedyś w javascript i po przesiadce na C# łapię się że często ułatwiam sobie życie pisząc funkcje wewnątrz funkcji
Przykładowy, prosty kod:
int start = 7;
int end = a * b;
Console.WriteLine(start + " - " + end);
skomplikowaneOperacje(start, end);
for (int b = 0; b < 10; b ++)
{
start = end;
end = b * 5 + a;
Console.WriteLine(start + " - " + end);
skomplikowaneOperacje(start, end);
}
if (c)
{
start = end;
end = a * 9 - b;
Console.WriteLine(start + " - " + end);
skomplikowaneOperacje(start, end);
}
żeby się nie powtarzać mógłbym to zapisać w postaci pomocniczej klasy:
class Helper
{
int start;
int end;
Action<int, int> operacja;
public Helper(int start, Action<int, int> operacja)
{
this.operacja = operacja;
this.start = start;
}
public void To(int end)
{
Console.WriteLine(start + " - " + end);
start = end;
operacja(start, end);
}
}
której można używać potem w ten sposób:
var h = new Helper(7, skomplikowaneOperacje);
h.To(a * b);
for (int b = 0; b < 10; b ++)
{
h.To(b * 5 + a);
}
if (c)
{
h.To(a * 9 - b);
}
i byłoby to zgodne z ideą programowania obiektowego.
Ale często łapię się na naleciałościach z javascript i z lenistwa nie piszę nowej klasy, a wolę sobie to uprościć zapisując to jako:
int start = 7;
Action<int> f = end =>
{
ConsoleWrite(start + " - " + end);
start = end;
skomplikowaneOperacje(start, end);
}
f(a * b);
for (int b = 0; b < 10; b ++)
{
f(b * 5 + a);
}
if (c)
{
f(a * 9 - b);
}
Pytanie brzmi - czy widząc taki kod byście mnie rozstrzelali, czy jest to dla innych równie czytelne co dla mnie? Czy wystrzegać się tego typu konstrukcji równie mocno co używania goto
?