为什么不在同一行上声明几个相同类型的变量?

时间:2008-09-19 09:06:17

标签: language-agnostic refactoring conventions

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

e.g。

private String var1, var2, var3

而不是:

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

16 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:18)

在C ++中:

int * i, j;

我的类型为int *,j的类型为int。 很容易错过这种区别。

除了将它们放在一行之外,每个都可以让以后更容易添加一些注释

答案 2 :(得分:9)

我认为有各种各样的原因,但它们都归结为第一种只是可读性较差,更容易失败,因为单行不止一件事。

所有这一切都没有真正的好处,你不告诉我你找到两行节省空间是真正的收获。

与你有

时发生的情况类似
if ((foo = some_function()) == 0) {
    //do something
}

当然这个例子比你的更糟糕。

答案 3 :(得分:9)

在C / C ++中,您还遇到以下问题:用于指示指针类型的*仅适用于直接跟随的标识符。因此,缺乏经验的开发人员的一个相当常见的错误是编写

int* var1, var2, var3;

并期望所有三个变量都是'int pointer'类型,而对于编译器,它读为

int* var1;
int var2;
int var3;

只使var1成为指针。

答案 4 :(得分:6)

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

答案 5 :(得分:5)

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

答案 6 :(得分:5)

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

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

//better
int counter, 
    childCounter, 
    percentComplete;

答案 7 :(得分:4)

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

float fMin,fMax;

但是,当变量不相关时,我会明确指出,例如

int iBalance,iColor;

答案 8 :(得分:4)

相关性。

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

如果两个(或更多)变量通过函数紧密相关,而不是变量类型,则可能它们可以一起声明。也就是说,只有当你的程序的读者将这两个变量放在一起时才能将它们放在一起才有意义

答案 9 :(得分:3)

这是我的理由:

  • 可读性,如果您知道每行只有一个,则更容易发现
  • 版本控制,更少的行内更改,更多单行添加,更改或删除,更容易从一个分支合并到另一个分支

答案 10 :(得分:2)

例如:

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

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

  • 他们肯定都是同一类型(在我的静态类型的Java世界中)
  • 可以为每个
  • 添加评论
  • 如果您必须更改一个类型,您可能必须为所有人更改,并且所有四个都可以在一次更改中完成

所以在一个(虽然有臭味的代码)例子中,有没有理由你不这样做?

答案 11 :(得分:0)

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

答案 12 :(得分:0)

  1. 在使用版本控制工具(Michel所涵盖)时更加明显
  2. 当你遇到最简单的溢出/下溢或编译错误并且你的眼睛没有指出明显的
  3. 时,你会更容易阅读
  4. 保卫相反(即多变量单行声明)的专业性较低(“代码文本垂直可见性”为单身)

答案 13 :(得分:0)

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

string a,b;
if (Foo())
{
  a = "Something";
  b = "Something else";
}
else
{
  a = "Some other thing";
  b = "Out of examples";
}

答案 14 :(得分:0)

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

int s,t; //纹理坐标

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

答案 15 :(得分: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;
}