頻繁にネストされた関数呼び出しは読み取り不能であるため、使用すべきではないと主張しているのをよく見ました。ただし、代わりに一時変数を使用すると、多くの不必要な冗長性が作成され、読者は各一時変数をそれが表すものに精神的にリンクする必要があります。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++; }}}
どちらの場合も、本当の問題は不適切なフォーマットであり、過度のネストではありません。適切にフォーマットされたネストされた関数バージョンと一時変数バージョンの読みやすさ/わかりやすさをどのように評価しますか? 最大の読みやすさのためにフォーマットされていても、重い関数呼び出しの入れ子は悪いスタイルだと思いますか? もしそうなら、なぜですか?