Java 我们是否应该以多个声明为代价来本地化范围变量

Java 我们是否应该以多个声明为代价来本地化范围变量,java,software-design,Java,Software Design,有效的java非常强调变量范围的本地化。但如果我们有一个if-else,它可能会导致多个degration,例如: public List<E> midPoint() { if (first == null) { throw new NullPointerException("Linked list is empty"); } if (first.next == null) { ArrayList

有效的java非常强调变量范围的本地化。但如果我们有一个if-else,它可能会导致多个degration,例如:

   public List<E> midPoint() {

        if (first == null) {
            throw new NullPointerException("Linked list is empty");
        }
    if (first.next == null) {
        ArrayList<E> arr = new ArrayList<E>();
        arr.add(first.element);
        return arr;
    }

    Node<E> fast = first.next;
    Node<E> slow = first;

    while (fast != null && fast.next != null) {
        slow = slow.next;
        fast = fast.next.next;
    }

    // even count for number of nodes in linkedlist.
    if (fast != null) {
        ArrayList<E> arr = new ArrayList<E>();
        arr.add(slow.element);
        arr.add(slow.next.element);
        return arr;
    } else {
        ArrayList<E> arr = new ArrayList<E>();
        arr.add(slow.element);
        return arr;
    }
}
公共列表中点(){
if(first==null){
抛出新的NullPointerException(“链表为空”);
}
if(first.next==null){
ArrayList arr=新的ArrayList();
arr.add(第一个元素);
返回arr;
}
Node fast=first.next;
节点慢=第一;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
//linkedlist中节点数的偶数计数。
如果(快速!=null){
ArrayList arr=新的ArrayList();
arr.add(慢元素);
arr.add(slow.next.element);
返回arr;
}否则{
ArrayList arr=新的ArrayList();
arr.add(慢元素);
返回arr;
}
}
在上面的代码中,Arraylist定义/声明多次出现,但变量是本地化的。。arrayList应该在顶部声明,并在匹配条件的地方返回:例如:

public List<E> midPoint() {

    if (first == null) {
        throw new NullPointerException("Linked list is empty");
    }

    ArrayList<E> arr = new ArrayList<E>(); // NOTE - JUST A SINGLE DECLARATION.
    if (first.next == null) {
        arr.add(first.element);
        return arr;
    }

    Node<E> fast = first.next;
    Node<E> slow = first;

    while (fast != null && fast.next != null) {
        slow = slow.next;
        fast = fast.next.next;
    }

    // even count for number of nodes in linkedlist.
    if (fast != null) {
        arr.add(slow.element);
        arr.add(slow.next.element);
        return arr;
    } else {
        arr.add(slow.element);
        return arr;
    }
}
公共列表中点(){
if(first==null){
抛出新的NullPointerException(“链表为空”);
}
ArrayList arr=new ArrayList();//注意-只有一个声明。
if(first.next==null){
arr.add(第一个元素);
返回arr;
}
Node fast=first.next;
节点慢=第一;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
//linkedlist中节点数的偶数计数。
如果(快速!=null){
arr.add(慢元素);
arr.add(slow.next.element);
返回arr;
}否则{
arr.add(慢元素);
返回arr;
}
}

谢谢

在这种情况下,建议您只在一个地方申报。它将更具可读性,并节省一些代码行

重命名也会很好,也许这是您方法的最终结果(如
returnArray
resultArray


在其他情况下,当该列表意味着几个不同的东西时,最好声明它,在这种情况下,您也会有不同的名称。

在这种情况下,建议您只在一个地方声明它。它将更具可读性,并节省一些代码行

重命名也会很好,也许这是您方法的最终结果(如
returnArray
resultArray

在其他情况下,当这个列表意味着几个不同的东西时,最好声明它,在这种情况下,你也会有不同的名字

我们是否应该以多个声明为代价来本地化范围变量

不同的人(包括著名教科书的受人尊敬的作者)会对代码的可读性有不同的看法。问题在于可读性是一个主观的衡量标准:它取决于读者

所以我认为这取决于你来决定。很可能您将成为代码的主要读者,至少从一开始是这样。所以

  • 使用您认为使代码更具可读性的版本

  • 如果你想要第二种意见,问问你的同事

  • 如果您选择使用样式指南。。。以它所说的为指导


FWIW,我个人的观点是,这真的取决于上下文。有时最好本地化,有时则不然。很大程度上取决于声明与用法的“距离”以及变量含义的直观程度。(例如,如果
arr
被命名为
res
result
,则无需查看变量声明……假设您知道当前方法的签名。)

我们是否应该以多个声明为代价来本地化范围变量

不同的人(包括著名教科书的受人尊敬的作者)会对代码的可读性有不同的看法。问题在于可读性是一个主观的衡量标准:它取决于读者

所以我认为这取决于你来决定。很可能您将成为代码的主要读者,至少从一开始是这样。所以

  • 使用您认为使代码更具可读性的版本

  • 如果你想要第二种意见,问问你的同事

  • 如果您选择使用样式指南。。。以它所说的为指导



FWIW,我个人的观点是,这真的取决于上下文。有时最好本地化,有时则不然。很大程度上取决于声明与用法的“距离”以及变量含义的直观程度。(例如,如果
arr
被命名为
res
result
,则无需查看变量声明……假设您知道当前方法的签名。)

多次声明它没有错,但是您有很多重复的代码:通过重构,您可以显著改进代码

在您的案例中,JDK提供了一种方便实用的方法来在线创建ArrayList:

而不是:

ArrayList<E> arr = new ArrayList<E>();
arr.add(slow.element);
arr.add(slow.next.element);
return arr;
等等


请注意,从
asList()
返回的列表不可修改。如果需要可修改列表,请将其传递给:

返回新的ArrayList(Arrays.asList(slow.element,slow.next.element));

多次声明没有错,但是您有很多重复的代码:通过重构,您可以显著改进代码

在您的案例中,JDK提供了一种方便实用的方法来在线创建ArrayList:

而不是:

ArrayList<E> arr = new ArrayList<E>();
arr.add(slow.element);
arr.add(slow.next.element);
return arr;
等等


请注意,从
asList()返回的列表
return new ArrayList(Arrays.<E>asList(slow.element, slow.next.element));