16

为什么在一行上声明变量是不好的做法?

例如

private String var1, var2, var3

代替:

private String var1;
private String var2;
private String var3;
4

16 回答 16

20

在我看来,将每个变量放在单独的行上的主要目标是促进版本控制工具的工作。

如果多个变量在同一行,则可能会因不同开发人员的不相关修改而发生冲突。

于 2008-09-19T09:09:31.983 回答
19

在 C++ 中:

int * i, j;

i 是 int * 类型,j 是 int 类型。这种区别太容易被忽略了。

除了将它们放在一行之外,以后可以更轻松地添加一些评论

于 2008-09-19T09:13:15.313 回答
10

我认为有多种原因,但都归结为第一个原因是可读性较差且更容易失败,因为一行代码在做不止一件事。

所有这一切都没有真正的收获,难道你不告诉我你发现两行节省的空间是真正的收获。

这与您拥有时发生的事情类似

if ((foo = some_function()) == 0) {
    //do something
}

当然,这个例子比你的要糟糕得多。

于 2008-09-19T09:13:28.747 回答
9

在 C/C++ 中,您还有一个问题,即用于指示指针类型的 * 仅适用于紧随其后的标识符。因此,没有经验的开发人员的一个相当常见的错误是编写

int* var1, var2, var3;

并期望所有三个变量都是“int指针”类型,而对于编译器来说,这读作

int* var1;
int var2;
int var3;

仅使 var1 成为指针。

于 2008-09-19T09:16:34.043 回答
6

使用单独的行,您有机会在描述变量使用的每一行上添加注释(如果从名称中不清楚)。

于 2008-09-19T09:11:50.840 回答
5

因为在某些语言中,示例中的 var2 和 var3不是字符串,它们将是变体(无类型)。

于 2008-09-19T09:06:59.417 回答
5

为什么这是不好的做法?只要您的代码仍然可读,我认为不是。

//not much use
int i, j, k;

//better
int counter, 
    childCounter, 
    percentComplete;
于 2008-09-19T09:23:56.350 回答
4

老实说,我并不反对。我认为将类似的变量分组在同一行上是完全可行的,例如

浮动 fMin, fMax;

但是,当变量不相关时,我会避开,例如

int iBalance, iColor;

于 2008-09-19T09:15:57.397 回答
4

关联。

仅仅因为两个变量是 String 类型并不意味着它们彼此密切相关。

如果两个(或更多)变量通过函数而不是变量类型密切相关,那么也许它们可以一起声明。即,只有当您的程序的读者可以同时看到这两个变量时,才应该将它们实际放在一起

于 2008-09-19T10:00:14.437 回答
3

以下是我的理由:

  • 可读性,如果您知道每行只有一个,则更容易发现
  • 版本控制,更少的行内更改,更多的单行添加、更改或删除,更容易从一个分支合并到另一个分支
于 2008-09-19T09:12:19.090 回答
2

情况如何,例如:

public static final int NORTH = 0,
                        EAST = 1,
                        SOUTH = 2,
                        WEST = 3;

这也被认为是不好的做法吗?我认为这可以,因为它反驳了之前提出的一些观点:

  • 它们肯定都是相同的类型(在我的静态类型 Java 世界中)
  • 可以为每个添加评论
  • 如果你必须改变一个的类型,你可能必须为所有的,所有四个都可以在一个变化中完成

所以在一个(尽管代码很臭)的例子中,你有理由不这样做吗?

于 2008-09-19T09:18:15.210 回答
0

同意 edg,也因为将每个变量放在单独的行上更具可读性和易于维护。您会立即看到类型、范围和其他修饰符,并且当您更改修饰符时,它仅适用于您想要的变量 - 这样可以避免错误。

于 2008-09-19T09:10:38.330 回答
0
  1. 在使用版本控制工具时对您更加明显(由 Michel 介绍)
  2. 当您遇到最简单的上溢/下溢或编译错误并且您的眼睛无法指出明显的错误时,让您更具可读性
  3. 捍卫相反(即多变量单行声明)的优点较少(“代码文本垂直可见性”是单例)
于 2008-09-19T09:16:22.857 回答
0

当您可以并且想要在减速时初始化变量时,这是一种不好的做法。这可能不是那么糟糕的一个例子是:

string a,b;
if (Foo())
{
  a = "Something";
  b = "Something else";
}
else
{
  a = "Some other thing";
  b = "Out of examples";
}
于 2008-09-19T09:18:19.437 回答
0

一般来说,出于其他人讨论的版本控制和评论原因,我会在 95% 的情况下应用它。但是在某些情况下它确实有意义,例如,如果我正在编写图形并且我想要几个变量来表示纹理坐标(通常按约定引用为 s 和 t),那么将它们声明为

整数 s, t; // 纹理坐标

恕我直言,通过缩短代码和明确这两个变量属于一起来增强代码的可读性(当然有些人会主张在这种情况下使用单点类变量)。

于 2008-09-19T09:43:45.677 回答
0

在尝试这个问题时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;
}
于 2018-08-22T09:59:29.430 回答