0

有効な Java は、変数のスコープをローカライズすることを非常に強調しています。ただし、 if else がある場合、複数の宣言が発生する可能性があります。

   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 の定義/宣言が複数回発生しますが、変数はローカライズされています。そのままでよいですか、または 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;
    }
}

ありがとう

4

3 に答える 3

2

この場合、1 か所だけで宣言することをお勧めします。読みやすくなり、コードの行数が少なくなります。

名前の変更も良いでしょう。おそらく、それがメソッドの最終結果であることを示唆するものです(returnArray、 などresultArray)。

他の状況では、そのリストがいくつかの異なる意味を持つ場合、それを宣言する方が本当に良いでしょう。その場合、あなたも別の名前を持つことになります。

于 2013-06-15T23:50:20.450 に答える
1

複数の宣言を犠牲にしてスコープ変数をローカライズする必要があります

さまざまな人々 (有名な教科書の著名な著者を含む) は、何がコードを読みやすくするかについてさまざまな意見を持っています。問題は、読みやすさが主観的な尺度であることです。それは読み手に依存します。

だから、決めるのはあなた次第だと思います。少なくとも最初は、あなたがコードの主要なリーダーになる可能性があります。そう ...

  • コードが読みやすくなると思われるバージョンを使用してください

  • セカンドオピニオンが必要な場合は、同僚に尋ねてください。

  • スタイル ガイドを使用することを選択した場合は、その内容に従ってください。


FWIW、私の個人的な意見は、それは本当に文脈に依存するということです. ローカライズしたほうがよい場合もあれば、そうでない場合もあります。宣言が使用法からどれだけ「離れている」か、および変数の意味がどれほど直感的であるかに大きく依存します。(たとえば、orarrという名前が付けられた場合、現在のメソッドのシグネチャを知っていると仮定すると、変数宣言を調べる必要はありません。)resresult

于 2013-06-15T23:50:40.420 に答える
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のコピー コンストラクターに渡します。

return new ArrayList(Arrays.<E>asList(slow.element, slow.next.element));
于 2013-06-16T00:08:45.320 に答える