1

コードを読みやすい方法で構成しようとしています。私はそれを行う1つの方法が次のようであることを読みました:

if(Init1() == TRUE)
{
    if(Init2() == TRUE)
    {
        if(Init3() == TRUE)
        {
            ...
            Free3();
        }
        Free2();
    }
    Free1();
}

私はこの方法が好きです。なぜなら、それぞれFreeXが一致するInitXループ内に保持されるからです。ただし、ネストが 3 レベルを超えると、すぐに読み取り不能になり、80 列をはるかに超えます。多くの関数は、これが起こらないように複数の関数に分割できますが、あまりにも多くのレベルのネストを避けるためだけに関数を分割するのはばかげているようです。特に、クラス全体の初期化を行う関数を考えてみましょう。その初期化には 10 回以上の関数呼び出しが必要です。これは、10 レベル以上のネストです。

私はこれを考えすぎていると確信していますが、上記に欠けている基本的なものはありますか? 読みやすい方法で深いネスティングを行うことはできますか? または、それぞれFreeXを独自のInitXループ内に保持しながら、何らかの方法で再構築しますか?

ところで、上記のコードは に圧縮できることを認識していますif(Init1() && Init2()...が、コードは単なる例です。InitX各呼び出しの間に、このような圧縮を防ぐ他のコードがあります。

4

5 に答える 5

4

C++ タグを含めたので、RAII - Resource Acquisition Is Initialization を使用する必要があります。この概念を説明する優れたオンライン リソースがたくさんあり、リソース管理に関する多くのことが簡単になります。

于 2013-09-30T11:23:09.077 に答える
2

私はこれを考えすぎていると確信していますが、上記に欠けている基本的なものはありますか? [...] または、各 FreeX を独自の InitX ループ内に保持しながら、何らかの方法で再構築しますか?

はい。これは、RAII コードから多大な恩恵を受けるコードの典型例です。

コンストラクトの代わりに:

if(init(3) == TRUE)
{
    free3();
}

このことを考慮:

raii_resource3 r3 = init3(); // throws exception if init3 fails
                             // free3 called internally
                             // by raii_resource3::~raii_resource3

完全なコードは次のようになります。

raii_resource1 r1 = init1();
raii_resource2 r2 = init2();
raii_resource3 r3 = init3();

ネストされた if はなく、コードは明確で単純です (そして、正のケースに焦点を当てます)。

リソース 1、2、3 の RAII ラッパーを作成するだけです。

于 2013-09-30T11:27:18.053 に答える
2

他の人が指摘したように、明らかな答えは RAII です。しかし、過度に深いネスティングの問題が RAII なしで発生した場合は、関数を複雑にしすぎていないかどうかを自問する必要があります。関数が約 10 行を超えることはめったにありません (そのようなチェックを含む)。実際のケースを見ると、ほとんどの場合、関数を分割する方が理にかなっていることがわかります。RAII を使用する場合でも、通常、関数ごとに RAII クラスのインスタンスを 1 つだけ持つ必要があります。(もちろん例外はあります。間違いなく、次のようなものstd::lock_guardは数えるべきではありません。)

于 2013-09-30T11:52:16.500 に答える
0

私がお勧めするのは、switch ステートメントを使用することです。このようなコードになると、私は switch ステートメントの大ファンです

お役に立てれば。

switch (i) {
    case 1:
        // action 1
        break;
    case 2:
        // action 2
        break;
    case 3:
        // action 3
        break;
    default:
        // action 4
        break;
}
于 2013-09-30T11:27:11.600 に答える