【问题标题】:Why do you not declare several variables of the same type on the same line?为什么不在同一行声明多个相同类型的变量?
【发布时间】:2018-08-22 18:08:02
【问题描述】:

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

例如

private String var1, var2, var3

代替:

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

【问题讨论】:

    标签: language-agnostic refactoring conventions


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      在 C++ 中:

      int * i, j;
      

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

      除了将它们放在一行之外,以后添加一些 cmets 会更容易

      【讨论】:

        【解决方案3】:

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

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

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

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

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

        【讨论】:

          【解决方案4】:

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

          int* var1, var2, var3;
          

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

          int* var1;
          int var2;
          int var3;
          

          只使 var1 成为指针。

          【讨论】:

            【解决方案5】:

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

            【讨论】:

            • 虽然在这种情况下重命名变量不是更好吗?
            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

              • 您的“更好”风格是我通常在需要变量声明的语言中使用的风格。它在保持可读性的同时更加干燥。
              【解决方案8】:

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

              浮动 fMin, fMax;

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

              int iBalance, iColor;

              【讨论】:

                【解决方案9】:

                相关性。

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

                如果两个(或更多)变量在函数上密切相关,而不是变量类型,那么也许它们可以一起声明。即只有当你的程序的读者看到这两个变量在一起才有意义时,它们才真正放在一起

                【讨论】:

                  【解决方案10】:

                  这是我的理由:

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

                  【讨论】:

                    【解决方案11】:

                    案例如:

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

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

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

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

                    【讨论】:

                    • 这有一个问题:如果您添加更多变量而忘记将分号更改为逗号。 ;)
                    【解决方案12】:

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

                    【讨论】:

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

                      【讨论】:

                        【解决方案14】:

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

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

                        【讨论】:

                          【解决方案15】:

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

                          int s, t; // 纹理坐标

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

                          【讨论】:

                            【解决方案16】:

                            在尝试这个问题时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;
                            }
                            

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2016-03-17
                              • 2017-01-04
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2020-05-31
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多