web-dev-qa-db-ja.com

コードのブロックを作成することは悪い習慣ですか?

C++では、次のような一部の関数内にコードのブロックを作成することは悪い習慣です。

    bool f()
    {
       {
           double test = 0;

           test = // some other variable outside this function, for example.

           if (test == // some value)
             return true;
       }

       {
           double test = 0;

           test = // some variable outside this function, different from the last one.

           if (test == // some value)
             return true;
       }

       return false;

    }

これを行うポイントは、同じタイプのプロシージャに対して、「test」という同じ変数名を複数回使用することです。実際のプロジェクトでは、複数の変数があり、複数のテストを実行しています。テストが非常に似ていることを考慮して、テストごとに異なる名前で新しい変数を作成し続けたくありません。

コードのブロックを挿入して、各テスト後に変数がスコープから外れ、その名前を再び使用できるようにするのは悪い習慣ですか?それとも別の解決策を模索すべきですか?すべてのテストで同じ変数のセットを使用することを検討しました(各テストが終了した後、変数をすべて0に設定するだけです)が、これは悪い習慣である可能性があるという印象を受けました。

12

ブロックを使用してリソースのスコープを設定している場合、ブロックは完全に妥当です。ファイル、ネットワーク接続、メモリ割り当て、データベーストランザクションなど。これらの場合、ブロックは実際にはコードの論理構造の一部です。リソースを生成し、一定期間存在し、指定された時間に消えます。

しかし、あなたがしているすべてがnameのスコープである場合、私はそれらが悪い習慣であると言います。一般的に言えば、もちろんです。特別な状況が適用される場合があります。

たとえば、この関数がコード生成システムやテストフレームワークなどによって生成された場合、名前のスコープを指定するためのブロックは妥当なものです。しかし、あなたは人間ではなく、機械の目的のために書かれたコードについて話しているでしょう。

人間が同じ関数内で名前を再利用する必要があるコードを書いている場合、それらのブロックはおそらく別の関数である必要があると私は言うでしょう。 特にそれらの名前が、それらのブロック内で異なるタイプや意味で使用されている場合。

22
Nicol Bolas

このようなブロックを作成することは悪い習慣ではありません。スコープが機能する方法です。

通常、これはRAII(Resource Acquisition is Initialization)を使用しているときに行われ、デストラクタが呼び出されるタイミングを制御します。

長くなる場合は、そのコードを独自の関数に移動することを検討します。

私の意見では、変数名をリサイクルするためだけに使用することは良い考えではありません。しかし、私はそれがメモリが少ない場合に役立つことがわかります

10