関数の先頭ではなく、内部ブロックに宣言を置くことの不利な点は何ですか?


9

私が働いている場所には、変数の宣言の配置に関する明確なガイドラインがあります。それによると、内部ブロック(forループなど)ではなく、グローバルレベルまたは関数の最初にそれらを配置する必要があります。それらは私よりも経験豊富な人たちによって指定されているので、それには正当な理由があるに違いないと私は確信しているが、それが何であるかを理解することはできない。それらをより大きなスコープで宣言させることでコンパイル時/実行時の利点があるかどうかを知るのは良いことです。

回答:


8

主な利点は2つあります。

  • タイプが異なる変数名を再利用することはできません。
  • ルーチンをリファクタリングする必要があることが以前に明らかになった。上部の変数はかなりすぐに大きな混乱になり、この混乱は認識しやすくなります。

とにかく価値のあるコンパイラは、変数のスコープをとにかく最適化するので、純粋にフォーマットの問題です。

私の2セントについては、スコープの意図をコンパイラーに転送するために、変数の最も内側の宣言を好みます。変数をループ内でのみアクセスするつもりである場合は、ループで変数を宣言すると、コンパイル時に参照をキャッチできます。


3

これまでに見つけた唯一の利点は、コードの単純さです。変数宣言を探す場所はいつでも知っており、チームの全員が同じコーディングスタイルを採用しています。これらのことにより、コードのメンテナンスが容易になりますが、優れたコードを簡単に作成できるようになるかどうかはわかりません。私はあなたがより悪いコードを書くことだけを意味するのではありません。それにもかかわらず、開発チームが大規模であるか、そのメンバーがコード標準を使用して頻繁に変更する場合は、役に立ちます。


3

これは一貫性を維持する決定のように聞こえます。また、隣接するスコープの異なる変数に同じ名前を使用することを防ぎ、読みやすさを向上させます。Gusが指摘するように、変数を探す場所もわかります。最も狭いスコープの原則は、上部での変動の混乱を防ぐため、より優れていると思います。最も外側の宣言は、クラスのプライベートメンバーを最初にIMOで宣言するのとよく似ています。


3

すべての言語は、スタイルと実践の好みが異なる場合があります。以下はJSF-AV-rulesからのものであり、Stroustrupは彼が好むコーディング標準としてこれを指しています。

AVルール136
Declarations should be at the smallest feasible scope

この根拠は次のように記述されています

This rule attempts to minimize the number of live variables that must be simultaneously considered. Furthermore, variable declarations should be postponed until enough information is available for full initialization

C ++を使用している場合は、必要なときに変数を宣言することをお勧めします。


3

これをベストプラクティスと呼ぶことができるかどうかはわかりません。新しいCプロジェクトのガイドラインを設定するときは、変数が使用される場所の近くで変数を宣言することをお勧めします。2つの理由から、後で(つまり、メソッドを抽出するときに)コードをリファクタリングすることが容易になります。また、コンパイラーが最適化を行うのにも役立ちます。

私はこの意見だけではありません。同じ問題に対処するための質問を次に示し ます。 -them ここでの答えは、それらをどこで使用するかを宣言することです。同じことは、Robert C. Martin著の「Clean Code」にも説明されています。

ただし、古いC標準(C-89)を使用する場合は、関数の先頭でローカル変数を定義する必要があります。それでは、ガイドラインはC-89が使用されたときから残っているのでしょうか?ガイドラインを書いた人に、なぜルールがまだそこにあるのか尋ねるほうがいいでしょう。


2

宣言が実行されることがほとんどない(あるとしても)if節内にあるが、大量のメモリを必要とする場合、メモリフットプリントは、関数の先頭にすべてを割り当てる場合よりも(ほとんどの場合)小さくなります。

ループ内にある場合は、メモリを繰り返し再割り当てする必要があります。これは、パフォーマンスの点でコストがかかる可能性があります。

両方の方法で物事を行う理由があります。


1

1989年の古いC標準では、ブロックの先頭でのみ変数宣言が許可されています。

C99宣言がどこでも許可されているためです。多分あなたの場所はまだC99に切り替えていません。


私たちはC99を使用していますが、より重要なこととして、関数の開始時ではなく、最も内側のブロックでそれを宣言することの意味を探していました。多分、私は十分にはっきりしていませんでした...
TCSGrad

1

この決定を下した人たちは、宣言を最上位に置くことが当たり前であり、それが使用されている場所により近い場所で宣言するための設定に切り替えないことを選択したときのようです。

このレベルの一貫性がどれほど有益かはわかりません。一部のIDEはおそらく他のものよりも物事を見つけやすくしています。グローバル変数の場合、これは理にかなっていますが、関数が長すぎて変数の宣言を見つけることが難しくなる場合は、より大きな問題が発生します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.