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


12

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;

    }

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

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


19
このコードを公開する場合、これらの各テストを個別のメソッドに分離するように指示します...結果として、コードブロックを使用して個別にスコープする必要はありません。
Maybe_Factor

1
@Maybe_Factor-同意します。個別のメソッドの利点は、各ブロックに名前を付けて、より読みやすいコードを提供できることです。
-mouviciel

@mouviciel読みやすいコードだけでなく、読みやすいテストレポートも!
Maybe_Factor

@Maybe_Factor同意しない。物事を別々の機能に移動すると、再利用可能な機能がほとんどないように見えるという悪影響があります。関数のすべてのロジックを1か所に保持するのは良いことです。
マイルルーティング

1
@MilesRoutこれは1つの論理関数ではなく、1つの関数がすべて1つのテスト関数に詰め込まれた複数のユニットテストです。通常のコードのコードブロックと関数は、まったく別の議論です。
Maybe_Factor

回答:


22

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

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

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

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


10

このようなブロックを作成することは悪い習慣ではありません。それがスコープの仕組みです。

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

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

私の意見では、単に変数名を使用して変数名をリサイクルするのは得策ではありません。しかし、メモリが少ない場合に役立つことがわかります


ローカル変数名の再利用は、メモリの使用には影響しません。
ケビンクライン

1
スマートオプティマイザーは、2つの変数に対して1つのメモリ位置を使用できると思いませんか?
ロバートアンドジェジュク

3
はい。しかし、同じスコープ内にいる場合、デストラクタがない場合にも、それを行うことができます。
セバスチャンレッド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.