Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 为什么不在同一行上声明几个相同类型的变量?_Language Agnostic_Refactoring_Conventions - Fatal编程技术网

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

Language agnostic 为什么不在同一行上声明几个相同类型的变量?,language-agnostic,refactoring,conventions,Language Agnostic,Refactoring,Conventions,为什么在一行上声明变量是不好的做法 e、 g 而不是: private String var1; private String var2; private String var3; 因为在某些语言中,示例中的var2和var3不是字符串,而是变体(非类型化)。在我看来,将每个变量放在单独一行的主要目标是方便版本控制工具的工作 如果多个变量在同一行上,您可能会因不同开发人员的不相关修改而发生冲突。同意edg的观点,并且因为将每个变量放在单独的行上更易于阅读和维护。您会立即看到类型、范围和其他修饰

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

e、 g

而不是:

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

因为在某些语言中,示例中的var2和var3不是字符串,而是变体(非类型化)。

在我看来,将每个变量放在单独一行的主要目标是方便版本控制工具的工作


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

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

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

以下是我的理由:

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

int * i, j;
i为int*型,j为int型。 这种区别太容易被忽略


除了将它们分别放在一行上可以更容易地在以后添加一些评论之外,我认为有各种原因,但它们都归结为第一行可读性较差,更容易失败,因为一行可以做不止一件事

所有这些都没有真正的好处,你不要告诉我你发现两行节省的空间是真正的好处

这和当你有

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

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

老实说,我并不反对。我认为把相似的变量组合在同一条线上是完全可行的

浮动fMin,fMax

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

iBlance,iColor

  • 在使用版本控制工具时对您更加明显(由Michel提供)
  • 当您有最简单的溢出/下溢或编译错误,并且您的眼睛无法指出明显的错误时,您可以更容易地阅读
  • 相反(即多变量单行声明)的优点较少(“代码文本垂直可见性”为单例)

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

    int* var1, var2, var3;
    
    并期望所有三个变量都是“int-pointer”类型,而对于编译器,这是

    int* var1;
    int var2;
    int var3;
    

    仅将var1设为指针。

    这种情况如何,例如:

    public static final int NORTH = 0,
                            EAST = 1,
                            SOUTH = 2,
                            WEST = 3;
    
    这也被认为是不好的做法吗?我会认为这是好的,因为它反驳了前面的一些观点:

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

    因此,在一个(虽然代码很臭)示例中,有没有不这样做的原因?

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

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

    为什么会有这种坏习惯?我不认为是这样,只要你的代码仍然可读

    //not much use
    int i, j, k;
    
    //better
    int counter, 
        childCounter, 
        percentComplete;
    

    通常情况下,对于其他人讨论的版本控制和评论原因,我会在95%的情况下应用这一点。然而,在某些情况下,它确实是有意义的,例如,如果我正在编码图形,并且我想要两个变量来表示纹理坐标(通常由约定引用为s和t),那么

    int s,t;//纹理坐标

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

    相关性

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


    如果两个(或更多)变量通过函数而不是变量类型紧密相关,那么它们可能可以一起声明。i、 e.只有当程序的读者能够同时看到这两个变量时,才应该在尝试这个问题时将它们放在一起

    方法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;
    }
    
    int-removeElement(int*A、int-n1、int-B)
    {
    int k=0,i;
    
    对于(i=0;i尽管在这种情况下重命名变量不是更好吗?您的“更好”样式是我在需要变量声明的语言中通常使用的样式。在保持可读性的同时,这种样式更为枯燥。一个问题是:如果您添加更多变量,而忘记将分号更改为逗号。;)
    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;
    }
    
    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;
    }