3

私が常に念頭に置いていた基本的な質問がありました。質問するのは些細なことかもしれませんが、とにかく意見を聞くことにしました。

サンプルコードは次のとおりです。

class seventeenth{

    public static void appendtolist(List<Integer> i){
        i.add(new Random().nextInt(1000));
        i.add(new Random().nextInt(1000));
        i.add(new Random().nextInt(1000));
    }
    public static List<Integer>  returnlist(){
        List<Integer> i=new LinkedList<Integer>();
        i.add(new Random().nextInt(1000));
        i.add(new Random().nextInt(1000));
        i.add(new Random().nextInt(1000));
        return i;
    }
    public static void main(String[] args){
        List<Integer> l=new LinkedList<Integer>();
        appendtolist(l);//Option 1
        l=returnlist();//Option 2
        for(Integer e:l)
        System.out.println(e);
    }

}

上記のオプションのうち、適切なプログラミング手法はどれですか?それはなぜですか?それとも、実際には問題ではないのでしょうか? このような基本的な優れたプログラミング規則に関する文献を誰かが共有できれば幸いです。

4

7 に答える 7

3

名前が機能を明確にする限り、どちらも問題ありません。

「追加先」バージョンは、同じリストに追加するために複数回呼び出すことができるため、もう少し一般的です。この方法で「リターン」バージョンを使用すると、すべてを 2 回コピーする必要があります。

おそらく、「追加先」バージョンを一般化して、次のいずれかを取得しますCollection

public static void addTo(Collection<Integer> coll) {
    coll.add(random.nextInt(1000));
    coll.add(random.nextInt(1000));
    coll.add(random.nextInt(1000));
}
于 2013-04-09T14:15:32.923 に答える
2

オブジェクトをできるだけ再利用することをお勧めします。

i.add(new Random().nextInt(1000));
i.add(new Random().nextInt(1000));

代わりに使用します

Random rand = new Random();
i.add(rand.nextInt(1000));
i.add(rand.nextInt(1000));

最初の方法では、2 つの Random オブジェクトの作成とガベージ コレクションのオーバーヘッドが発生しますが、2 番目の方法では 1 つの Random オブジェクトの作成とガベージ コレクションのみが行われます。

于 2013-04-09T14:16:02.213 に答える
0

オプション 2、

public static List<Integer>  returnlist(){
    List<Integer> i=new LinkedList<Integer>();
    i.add(new Random().nextInt(1000));
    i.add(new Random().nextInt(1000));
    i.add(new Random().nextInt(1000));
    return i;
}

list にさらに要素を追加したくない場合を除き、はるかに優れていると思いますl

于 2013-04-09T14:15:12.857 に答える
0

これは関数の意味に依存します。最初の仕事はリストを変更することであり、もう 1 つはリストを作成することです。
メソッドのオーバーロードを使用して、コードの繰り返しなしでいずれかのオプションを許可します。

public static List<Integer> addRandom(List<Integer> i){
    i.add(new Random().nextInt(1000));
    i.add(new Random().nextInt(1000));
    i.add(new Random().nextInt(1000));
    return i;
}
public static List<Integer> addRandom() {
    return addRandom(new LinkedList<Integer>());
}
public static void main(String[] args){
    List<Integer> l=new LinkedList<Integer>();
    addRandom(l);//Option 1
    l = addRandom();//Option 2
    for(Integer e:l)
    System.out.println(e);
}

繰り返しますが、意味は同じではありませんが、本当に 2 つを比較したい場合は、returnList が List (LinkedList) の実装を強制することに注意してください。

于 2013-04-09T14:20:08.023 に答える
0

IMO 私はreturnlist-kind を好みます。なぜなら、メソッドのパラメーターを操作することを避けようとするからです。これらの変更は、コードの全体的なフローから「隠され」、後で予期しない動作につながる可能性があるためです。ただし、メソッド名がappendtolistであるため、何が起きようとしているのかは明らかであるため、どちらのアプローチも私にとっては問題ありません。

于 2013-04-09T14:41:33.030 に答える
0

引数を変更しない方がよいため、2 番目のバリアントを選択します。

あなたのメソッドは、ロジックとここで値を返す以外に何もすべきではありません

副作用の詳細

于 2013-04-09T14:42:25.560 に答える
0

メソッド名にキャメルケースを使用し、クラス名に パスカルケースを使用することもお勧めです。
1>両方のメソッドがnew Random()オブジェクトを複数回作成しています。避けるべきです。
2> 数値の生成は 1000 のようにハードコードされるべきではありません。将来的には 2000 が必要になるかもしれませ
LinkedList。しかし、将来的には、Vector、ArrayList を返す必要があるかもしれません。そのため、コードにはタイトなバインドがあります。柔軟ではありません。

どっちがいい?という質問に対して

appendToListVector、ArrayList、LinkedList など、そのメソッドで任意のオブジェクトを渡すことができるため、常に優先します。

メソッドの次の変更は、優れた実践に役立ちます。

import java.util.LinkedList;
import java.util.List;
import java.util.Random;

class Seventeenth {

    public static void appendToList(Random random, List<Integer> list, int[] numbers) {
        for (int i : numbers) {
            list.add(random.nextInt(i));
        }
    }

    public static void main(String[] args) {
        List<Integer> list = new LinkedList<Integer>();
        Random random = new Random();
        appendToList(random, list, new int[] { 1, 2, 3, 1000, 2000 });// Option 1
        for (int e : list)
            System.out.println(e);
    }

}
于 2013-04-09T14:22:14.190 に答える