【发布时间】:2018-08-22 18:08:02
【问题描述】:
为什么在一行上声明变量是不好的做法?
例如
private String var1, var2, var3
代替:
private String var1;
private String var2;
private String var3;
【问题讨论】:
标签: language-agnostic refactoring conventions
为什么在一行上声明变量是不好的做法?
例如
private String var1, var2, var3
代替:
private String var1;
private String var2;
private String var3;
【问题讨论】:
标签: language-agnostic refactoring conventions
在我看来,将每个变量放在单独的行上的主要目的是促进版本控制工具的工作。
如果多个变量位于同一行,则可能会因不同开发人员的不相关修改而发生冲突。
【讨论】:
在 C++ 中:
int * i, j;
i 是 int * 类型,j 是 int 类型。 这种区别太容易被忽略了。
除了将它们放在一行之外,以后添加一些 cmets 会更容易
【讨论】:
我认为有多种原因,但归结为第一个原因是可读性较差且更容易失败,因为一行代码在做不止一件事。
所有这些都没有真正的收获,难道你不告诉我你发现两行节省的空间是真正的收获。
这与你拥有时发生的事情类似
if ((foo = some_function()) == 0) {
//do something
}
当然,这个例子比你的要糟糕得多。
【讨论】:
在 C/C++ 中,您还有一个问题,即用于指示指针类型的 * 仅适用于紧随其后的标识符。因此,没有经验的开发人员的一个相当常见的错误是编写
int* var1, var2, var3;
并期望所有三个变量都是'int pointer'类型,而对于编译器,这读作
int* var1;
int var2;
int var3;
只使 var1 成为指针。
【讨论】:
使用单独的行,您可以在描述变量使用的每一行上添加注释(如果从名称中看不清楚的话)。
【讨论】:
因为在某些语言中,示例中的 var2 和 var3 不是字符串,它们将是变体(无类型)。
【讨论】:
为什么这是不好的做法?我不认为是,只要您的代码仍然可读。
//not much use
int i, j, k;
//better
int counter,
childCounter,
percentComplete;
【讨论】:
说实话,我并不反对。我认为将类似的变量分组在同一行上是完全可行的,例如
浮动 fMin, fMax;
但是当变量不相关时我会避开,例如
int iBalance, iColor;
【讨论】:
相关性。
仅仅因为两个变量是字符串类型并不意味着它们彼此密切相关。
如果两个(或更多)变量在函数上密切相关,而不是变量类型,那么也许它们可以一起声明。即只有当你的程序的读者看到这两个变量在一起才有意义时,它们才真正放在一起
【讨论】:
这是我的理由:
【讨论】:
案例如:
public static final int NORTH = 0,
EAST = 1,
SOUTH = 2,
WEST = 3;
这也被认为是不好的做法吗?我认为这可以,因为它反驳了之前提出的一些观点:
所以在一个(尽管代码很臭)的例子中,你有理由不这样做吗?
【讨论】:
同意edg,也因为将每个变量放在单独的行上更具可读性和易于维护。您会立即看到类型、范围和其他修饰符,并且当您更改修饰符时,它仅适用于您想要的变量 - 这样可以避免错误。
【讨论】:
【讨论】:
当您可以并且想要在减速时初始化变量时,这是一种不好的做法。这可能不是那么糟糕的一个例子是:
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; // 纹理坐标
恕我直言,通过缩短代码和明确说明这两个变量属于一起(当然有些人会主张在这种情况下使用单点类变量),增强了代码的可读性。
【讨论】:
在尝试这个问题时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;
}
【讨论】: