2013-04-09 3 views
3

Был основной вопрос, который я всегда имел в виду. Возможно, его слишком тривиально спросить - но я все равно решил получить мнение.Соглашение по методу Java

Heres код образца:

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

} 

Какой из приведенных выше вариантов является хорошей практикой программирования и почему Или это на самом деле не имеет значения? Был бы признателен, если бы кто-нибудь мог поделиться литературой вокруг основных хороших программных соглашений, подобных этому.

+1

Ваше имя класса должно начинаться с заглавной буквы (например, семнадцатым). Я бы назвал его getList() и appendToList (...) или просто добавил (...). В любом случае, найдите соглашение, которое подходит вам и придерживайтесь его! Таким образом, читать легче. – Burkhard

+1

@Burkhard Вопрос был о том, какой вариант 1 или вариант 2 является лучшим –

+0

@ZouZou: Вот почему я просто добавил его в качестве комментария, а не как ответ;) – Burkhard

ответ

0

IMO Я предпочел бы returnlist -kind, потому что я стараюсь избегать манипулирования параметров метода, так как эти изменения будут «скрытыми» из общего потока кода, который может привести к неожиданному поведению позже , Однако, поскольку имя метода appendtolist, это довольно ясно, что должно произойти, поэтому оба подхода подходят мне.

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

Я думаю, что гораздо лучше, если вы не хотите идти на добавление нескольких элементов в списке l.

+0

Это делает код в 'main' более удобным для обслуживания. –

+0

http://en.wikipedia.org/wiki/Factory_method_pattern Если это все, что вы пытаетесь достичь, то вариант 2 лучше. –

+0

Этот метод тесно связан с LinkedList. Он не будет возвращать реализацию Vector, ArrayList или других списков. Лучше использовать первый вариант, я думаю, потому что нам нужно просто передать ссылку «list» для реализованного объекта, например Vector, ArrayList. [См. Здесь мой ответ] (http://stackoverflow.com/a/15904540/1115584) – AmitG

3

Оба являются точными, если имена делают функцию прозрачной.

Версия «append to» немного более общая, так как ее можно вызвать несколько раз, чтобы добавить ее в тот же список. Использование версии «return» таким образом потребовало бы копирования всего дважды.

я бы, наверное, обобщают «добавить к» версии, чтобы принимать какие-либо Collection:

public static void addTo(Collection<Integer> coll) { 
    coll.add(random.nextInt(1000)); 
    coll.add(random.nextInt(1000)); 
    coll.add(random.nextInt(1000)); 
} 
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)); 

С помощью первого метода у вас есть более глава создания и сбор мусора двух случайных объектов, тогда как второй метод создает и мусор собирает один случайный объект.

0

Это зависит от значения функции, первая задача - изменить список, а другой - построить его.
Я хотел бы использовать метод перегрузки, чтобы либо вариант без кода repition:

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

Опять же, они не имеют тот же смысл, но если вы действительно хотите, чтобы сравнить два к сведению, что returnList заставляет реализацию из Список (LinkedList) и тот факт,

0

Использование ГорбатыйРегистра для имен методов и с использованием паскаль случая для имени класса является также хорошей практикой.
1> Оба ваших метода создают объект new Random() несколько раз. необходимо избегать.
2> Генерация цифр не должна быть жестко закодирована, как 1000. В будущем вам может потребоваться 2000.
3> В обратном методе возврата вы возвращаете LinkedList. Но в будущем вам может потребоваться вернуть Vector, ArrayList. Таким образом, существует ограниченная связь с кодом. Он не является гибким.

на вопрос, который один является хорошим

Я всегда предпочитаю appendToList, потому что я могу передать любой объект в этом методе, как, Вектор, 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); 
    } 

} 
0

Лучше НЕ ИЗМЕНИТЬ аргумент, поэтому я бы выбрал ВТОРОЙ вариант.

Ваш метод не должен ничего, кроме логики делать, и возвращая значение here

Подробнее о side effects

Смежные вопросы