同じ型の複数の変数を同じ行で宣言しないのはなぜですか?
-
01-07-2019 - |
質問
変数を 1 行で宣言するのはなぜ悪い習慣なのでしょうか?
例えば
private String var1, var2, var3
の代わりに:
private String var1;
private String var2;
private String var3;
解決
さまざまな理由があると思いますが、要約すると、最初の理由は、単一の行で複数の処理を行うため、読みにくく、失敗しやすいということです。
それはすべて本当の利益ではありません。2 行のスペースが節約されたことが本当の利益だとは思いませんか。
それはあなたが持っているときに起こることと同じようなことです
if ((foo = some_function()) == 0) {
//do something
}
もちろん、この例はあなたの例よりもはるかに悪いです。
他のヒント
私の意見では、各変数を個別の行に配置する主な目的は、バージョン管理ツールの作業を容易にすることです。
複数の変数が同じ行にある場合、異なる開発者による無関係な変更により競合が発生する危険性があります。
C++ の場合:
int * i, j;
i は int * 型、j は int 型です。その区別はあまりにも簡単に見落とされます。
それぞれを 1 行にすると、後でコメントを追加しやすくなります。
C/C++ では、ポインター型を示すために使用される * が、直後の識別子にのみ適用されるという問題もあります。したがって、経験の浅い開発者によくある間違いは、次のように書くことです。
int* var1, var2, var3;
3 つの変数すべてが 'int pointer' 型であることが期待されますが、コンパイラの場合、これは次のように読み取られます。
int* var1;
int var2;
int var3;
var1 のみをポインタにします。
別々の行を使用すると、変数の使用法を説明するコメントを各行に追加できます (名前からは明らかでない場合)。
一部の言語では、例の var2 と var3 は ない 文字列の場合は、バリアント (型なし) になります。
なぜそれが悪い習慣なのでしょうか?コードがまだ読み取れる限り、そうではないと思います。
//not much use
int i, j, k;
//better
int counter,
childCounter,
percentComplete;
正直に言うと、私はそれに反対ではありません。同様の変数を同じ行にグループ化することは完全に実現可能だと思います。
float fMin、fMax;
ただし、変数が無関係である場合は避けます。
int iBalance、iColor;
関連性。
2 つの変数が String 型であるからといって、それらが互いに密接に関連しているとは限りません。
2 つ (またはそれ以上) の変数が変数の型ではなく関数によって密接に関連している場合は、それらを一緒に宣言できる可能性があります。つまりプログラムの読者にとって 2 つの変数を一緒に見ることが意味がある場合にのみ、実際に一緒に配置する必要があります。
私の理由は次のとおりです。
- 読みやすさ、各行に 1 つしかないことがわかっていれば見つけやすくなります
- バージョン管理、行内の変更が少なく、単一行の追加、変更、または削除が増え、あるブランチから別のブランチへのマージが容易
次のような場合はどうでしょうか。
public static final int NORTH = 0,
EAST = 1,
SOUTH = 2,
WEST = 3;
それも悪い習慣とみなされますか?以前に述べたいくつかの点に反するため、これは問題ないと思います。
- それらは間違いなくすべて同じ型になります (私の静的に型付けされた Java の世界では)
- それぞれにコメントを追加できます
- 1 つのタイプを変更する必要がある場合は、おそらくすべてのタイプを変更する必要があり、4 つすべてを 1 回の変更で行うことができます。
それでは、(臭いコードではありますが) 例で、そうしない理由はありますか?
edg の意見に同意します。また、各変数を別の行に配置する方が読みやすく、メンテナンスが容易であるためです。タイプ、スコープ、その他の修飾子がすぐに表示され、修飾子を変更すると、必要な変数にのみ適用されるため、エラーが回避されます。
- バージョン管理ツールを使用するときにわかりやすくするため (Michel がカバー)
- 最も単純なオーバーフロー/アンダーフローまたはコンパイル エラーが発生し、目には明らかな問題が指摘されなかった場合に、より読みやすくなります。
- 反対のことを擁護する(つまり、複数変数の単一行宣言)の長所はあまりありません(「コードテキストの垂直方向の可視性」はシングルトンです)
これは、減速時に変数を初期化できる場合や、初期化したい場合によくある悪い習慣です。これがそれほど悪くない例は次のとおりです。
string a,b;
if (Foo())
{
a = "Something";
b = "Something else";
}
else
{
a = "Some other thing";
b = "Out of examples";
}
一般的には、他の人が議論したバージョン管理とコメントの理由からそうなりますが、私はすべてのケースの 95% にそれを適用すると思います。ただし、これが意味のある状況もあります。たとえば、グラフィックスをコーディングしていて、いくつかの変数でテクスチャ座標 (規約により常に s と t として参照される) を表現したい場合、それらを次のように宣言します。
int s、t;// テクスチャ座標
IMHO は、コードを短縮することと、これら 2 つの変数が一緒に属していることを明示することによって、コードの可読性を向上させます (もちろん、この場合に単一ポイント クラス変数を使用することを主張する人もいるでしょう)。
この質問を試みているときに https://www.interviewbit.com/problems/remove-element-from-array/
方法 1 では、このコードでメモリ制限を超えています。
タイプ 1:
int i,j;
タイプ 2:
int i;
int j;
タイプ 1:メモリ制限を超えました
int removeElement (int* A, int n1, int B)
{
int k=0, i;
for(i=0;i<n1;i++)
if(A[i]!=B)
{
A[k]=A[i];
k++;
}
return k;
}
一方、タイプ 2 は完全に正常に動作します
int removeElement (int* A, int n1, int B)
{
int k=0;
int i;
for(i=0;i<n1;i++)
if(A[i]!=B)
{
A[k]=A[i];
k++;
}
return k;
}