web-dev-qa-db-ja.com

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

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

9
TCSGrad

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

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

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

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

8
thiton

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

3
Gus

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

3
perreal

すべての言語は、スタイルと実践の好みが異なる場合があります。以下は 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
Clark Gable

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

私はこの意見だけではありません。同じ問題に取り組む質問は次のとおりです。 https://softwareengineering.stackexchange.com/questions/56585/where-do-you-declare-variables-the-top-of-a-method-or-when -you-need-them ここでの答えは、それらをどこで使用するかを宣言することです。同じことは、Robert C. Martin著の「Clean Code」にも説明されています。

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

3
Johan

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

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

物事を双方向で行うには理由があります。

2
NWS

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

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

1
Patrick

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

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

1
JeffO