Я часто видел, как утверждается, что вызовы вложенных функций не должны использоваться, потому что они нечитаемы. Однако использование временных переменных вместо этого создает много ненужного многословия и заставляет читателя мысленно связывать каждую временную переменную с тем, что она представляет. Когда я смотрел на то, как обычно форматируется код на Лиспе, мне пришло в голову, что вызовы вложенных функций действительно можно сделать вполне читабельными, если вы отформатируете их так, чтобы они отражали вложенность. Например:
// Totally unreadable:
auto linesIter = filter!"a.length > 0"(map!strip(File(filename).byLine())))
// Perfectly readable. The only difference is formatting.
auto linesIter = filter!"a.length > 0"(
map!strip(
File(filename).byLine()
)
);
// Readable, but unnecessarily verbose:
auto rawLines = File(filename).byLine();
auto stripped = map!strip(rawLines);
auto filtered = filter!"a.length > 0"(stripped);
Написание чего-то похожего на первый пример в форме вложенных функций, IMHO, эквивалентно выполнению следующего в более процедурном коде:
for(i = 0; i < 10; i++) { for(j = 0; j < 10; j++) { if(x < 2) { z++; } else { y++; }}}
В обоих случаях настоящей проблемой является плохое форматирование, а не чрезмерное вложение. Как бы вы оценили читаемость / понятность хорошо отформатированной версии вложенной функции по сравнению с версией временной переменной? Считаете ли вы, что вложенность вызовов тяжелых функций - это плохой стиль, даже если он отформатирован для максимальной читабельности? Если так, то почему?