Я часто встречал аргументы в пользу того, что сильно вложенные вызовы функций не следует использовать, потому что они нечитаемы. Однако вместо этого использование временных переменных создает много ненужного многословия и заставляет читателя мысленно связать каждую временную переменную с тем, что она представляет. Глядя на то, как обычно форматируется код Lisp, мне пришло в голову, что вложенные вызовы функций можно сделать вполне читабельными, если вы отформатируете их так, чтобы отразить вложенность. Например:
// 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);
Написание чего-то вроде первого примера в форме вложенной функции, ИМХО, эквивалентно выполнению следующего кода в более процедурном стиле:
for(i = 0; i < 10; i++) { for(j = 0; j < 10; j++) { if(x < 2) { z++; } else { y++; }}}
В обоих случаях реальная проблема заключается в плохом форматировании, а не в чрезмерной вложенности. Как бы вы оценили удобочитаемость/понятность версии с хорошо отформатированной вложенной функцией по сравнению с версией с временной переменной? Считаете ли вы, что тяжелая вложенность вызовов функций — это плохой стиль, даже если она отформатирована для максимальной удобочитаемости? Если да, то почему?
auto
и лямбды, закодированные как строки, выглядят так. И если да, то это D1 или D2 (или оба разрешены)? - person Jörg W Mittag   schedule 02.02.2010