5

頻繁にネストされた関数呼び出しは読み取り不能であるため、使用すべきではないと主張しているのをよく見ました。ただし、代わりに一時変数を使用すると、多くの不必要な冗長性が作成され、読者は各一時変数をそれが表すものに精神的にリンクする必要があります。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++; }}}

どちらの場合も、本当の問題は不適切なフォーマットであり、過度のネストではありません。適切にフォーマットされたネストされた関数バージョンと一時変数バージョンの読みやすさ/わかりやすさをどのように評価しますか? 最大の読みやすさのためにフォーマットされていても、重い関数呼び出しの入れ子は悪いスタイルだと思いますか? もしそうなら、なぜですか?

4

5 に答える 5

2

「代わりに一時変数を使用すると、多くの不必要な冗長性が作成され、読者は各一時変数をそれが表すものに精神的にリンクする必要があります」と言いますが、IMO は、物事をステップに分割したことを示す別の方法です。読者は一度に 1 つずつ理解できます。つまり、より読みやすくなっています。

長い行を別々のステップに分割するための変数を追加できて非常に満足しています(例3)が、私にとって重要なことは、物事を純粋なステップにきれいに分割できるかどうかです。良い指標の 1 つは、適切な変数名を見つけることができるかどうかです。できない場合は、分割する必要がある本物の別のステップではない可能性があります。

あなたの例2には大きな問題はありませんが、それよりもはるかに長く、私は確かにそれを分割します. デバッグに関しては、自分に感謝します...

于 2010-02-04T23:23:12.297 に答える
2

フォーマットを使用している方法で、ネストされた大きな関数呼び出しを壊しても問題はないと思います。それは読みやすいです、それが意図でした。

一時変数では、それらを回避しようとします。そして、これの唯一の理由は非常に単純です、私は彼らに良い名前を付けることが全くできません. 私はそれらが絶対に必要なときに試してみて、「cor blimey を行う何とか何とかするのに適した名前は何だろうか」と考えて 5 ~ 10 分を無駄にしてしまいます。bufferそして、ほとんどの場合、それが配列であるtemp場合、またはスカラーである場合などは、 あきらめて使用することになります。

つまり、ネストされた構造では、関数は動詞を表し、一時変数で得られる動詞のアクションの結果ではありません。一時変数を使用すると、その製品に名前を付けることができます。しかし、それが動詞と直接目的語自体 ( verb(directObject)) によってより適切に記述されるものである場合は、それが取るべきルートです。

于 2011-03-07T05:27:37.077 に答える
1

IMHO、オブジェクトと名前は慎重に選択して、最初の例のようにすべてを 1 行にまとめる関数スタイルのコーディングを行うときに読みやすいようにする必要があります。まったく判読できない場合は、誰かが悪い名前を付けています。あなたの目標は、何かが間違っているように見える場合多くの場合、バグがあることを意味することです。

現実の世界では、これらの不適切な名前に対処しなければならない場合、適切な名前で一時的な定数 (またはルーチン) を作成して、物事を少し整理することには何の問題もありません。コンパイルされ、変更が容易なため、コメントよりも優れています。

于 2010-02-04T23:34:14.070 に答える
0

個人的には、パフォーマンスのペナルティがなければ、読みやすさの方が重要だと思います。私はLisp構文について何も知りませんが、あなたの例は同じ数の呼び出しを行うように見えますか? その場合は、読みやすい方法で実行してください。ただし、負荷の高い関数 (ファイルを開いて何度も読み取るなど) をループ内で何度も呼び出す場合は、それを避ける必要があります。この回答がお役に立てば幸いです。

于 2010-02-02T16:50:17.797 に答える