Java方法命名规范

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

}

上述选项中哪一个是好的编程实践,为什么?或者这并不重要吗?如果有人能分享基本的编程约定等相关文献,将不胜感激。

1
你的类名应该以大写字母开头(例如Seventeenth)。我会称之为getList()和appendToList(...)或者只是add(...)。无论如何,找到适合你的约定并坚持它!这样阅读起来更容易。 - Burkhard
1
@Burkhard 这个问题是关于选项1或选项2哪个更好。 - Alexis C.
@ZouZou:这就是为什么我只把它添加为评论而不是答案的原因 ;) - Burkhard
@Burkhard 好的 :) 我以为你误解了问题。 - Alexis C.
请始终在if、for、while等语句中使用花括号{ },即使您只编写一行语句。 - Sergii Shevchyk
两种方法都可以,取决于个人喜好。我有数学背景,因此喜欢返回单个结果且不改变参数的函数,所以我会选择第二个选项。 - Vincent van der Weele
7个回答

3

只要函数名清晰明了,两种方式都可以使用。

"append to" 版本稍微更加通用,因为它可以被多次调用来追加同一个列表。在这种情况下使用 "return" 版本需要复制所有内容两次。

我可能会将 "append to" 版本通用化,以接受任何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));

用第一种方法,您需要创建和垃圾回收两个 Random 对象的开销,而第二种方法只需要创建和垃圾回收一个 Random 对象。

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添加更多元素。


它使得main方法中的代码更易于维护。 - The Cat
如果你只是想实现这个,那么选项2更好。参见:http://en.wikipedia.org/wiki/Factory_method_pattern - The Cat
这个方法与LinkedList紧密绑定。它不会返回Vector、ArrayList或其他列表实现。我想最好使用第一种选项,因为我们只需要传递实现对象(如Vector、ArrayList)的list引用即可。请参见我的回答 - AmitG

0

这取决于函数的含义,第一个函数的作用是更改列表,而另一个函数的作用是构造一个列表。
我会使用方法重载来允许两种选项而不需要重复代码:

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会强制实现List(LinkedList)以及事实


0

在编程方面,使用驼峰命名法作为方法名称,使用帕斯卡命名法作为类名也是很好的实践。
1> 你的两个方法都多次创建了new Random()对象,应该避免。
2> 数字生成不应像1000这样硬编码。将来你可能需要2000。
3> 在returnList方法中,你只返回了LinkedList。但将来你可能需要它返回Vector、ArrayList。所以代码与之紧密绑定,不够灵活。

对于哪一个更好的问题

我总是更喜欢appendToList,因为我可以在这个方法中传递任何对象,比如Vector、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

在我看来,我更喜欢使用returnlist类型,因为我尽量避免操作方法的参数,因为这些更改将从代码的整体流程中“隐藏”,这可能会导致以后出现意外行为。然而,由于方法名是appendtolist,所以很清楚接下来会发生什么,所以这两种方法对我来说都可以。


0

最好不要更改参数,这就是为什么我会选择第二种方式。

你的方法除了逻辑和返回值这里之外,不应该做任何其他事情。

更多关于副作用的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接