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

例如

private String var1, var2, var3

代替:

private String var1;
private String var2;
private String var3;
有帮助吗?

解决方案

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

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

这与当你有时发生的事情类似

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

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

其他提示

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

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

在 C++ 中:

int * i, j;

i 是 int * 类型,j 是 int 类型。这种区别很容易被忽视。

除了将它们各占一行之外,以后添加一些注释也变得更加容易

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

int* var1, var2, var3;

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

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;

关联。

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

如果两个(或多个)变量通过函数而不是变量类型密切相关,那么也许它们可以一起声明。IE。仅当程序的读者将两个变量放在一起有意义时,才应将它们实际放置在一起

这是我的理由:

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

比如说这样的情况呢:

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

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

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

那么在一个(尽管是臭代码)示例中,您是否有理由不这样做?

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

  1. 使用版本控制工具时对您来说更加明显(由 Michel 介绍)
  2. 当您遇到最简单的溢出/下溢或编译错误并且您的眼睛未能指出明显的错误时,对您来说更具可读性
  3. 捍卫相反的观点(即多变量单行声明)优点较少(“代码文本垂直可见性”是单例)

当您可以并且想要初始化减速变量时,这通常是不好的做法。这可能还不错的一个例子是:

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

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

整数 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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top