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

时间:2013-06-15 23:47:34

标签: java software-design

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

   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;
    }
}

在上面的代码中,Arraylist defination /声明多次出现,但是变量是本地化的。它的方式是好的OR应该在顶部声明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;
    }
}

由于

3 个答案:

答案 0 :(得分:2)

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

重命名也很好,可能表明这是您方法的最终结果(如returnArrayresultArray)。

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

答案 1 :(得分:1)

  

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

不同的人(包括备受好评的着名教科书作者)对于什么使代码可读具有不同的意见。问题在于可读性是一种主观的衡量标准:它取决于读者。

所以我认为由你来决定。您可能会成为代码的主要读者,至少从一开始就是这样。所以...

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

  • 如果您想要第二意见,请询问您的同事。

  • 如果您选择使用样式指南...请遵循它所说的内容。


FWIW,我个人认为,这实际上取决于具体情况。有时最好是本地化,有时不是。很大程度上取决于声明与使用的“距离”有多远,以及变量的含义是多么直观。 (例如,如果arr被命名为resresult,则您不需要查看变量声明...假设您知道当前方法的签名。)

答案 2 :(得分:0)

多次声明它并没有错,但是你有很多重复的代码:你可以通过重构来显着改进你的代码。

在您的情况下,JDK提供了一种方便的实用工具方法来在线创建ArrayLists:

而不是:

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

编码:

return Arrays.asList(slow.element, slow.next.element);

等等。


请注意,从asList()返回的列表不可修改。如果您需要可修改的列表,请将其传递给ArrayList's copy constructor

return new ArrayList(Arrays.<E>asList(slow.element, slow.next.element));