2

是否有最佳实践或普遍接受的模式来命名方法,这些方法将某些东西“添加”到具有 Java API 流利风格的不可变对象的集合中?

这是一个代码示例:

public class GivenUUIDGenerator {
    private final ImmutableList<String> playbackUUIDs;

    public GivenUUIDGenerator(List<String> playbackUUIDs) {
        this.playbackUUIDs = ImmutableList.copyOf(playbackUUIDs);
    }

    public GivenUUIDGenerator howShouldINameThisMethod(String uuid){
        return new GivenUUIDGenerator(ImmutableList.<String>builder().addAll(playbackUUIDs).add(uuid).build());
    }
}

这是来自我正在开发的一个项目的一个拉取请求,我们已经讨论过这个方法的最佳命名选项,但是两个法国人都无助于选择一个好名字。

我试图找到现有技术或最佳实践,这是我迄今为止发现的:

我得到的其他建议:

  • 原公关主张:withAddedXXX
  • 另一个提议:withAdditionalXXX
4

3 回答 3

2

我会建议and,而不是修改原始列表。因此,你可以有类似的东西:

GivenUUIDGenerator.with(originalList).and(a).and(b).and(c).generate();

这就是类的样子:

public class GivenUUIDGenerator {
    public static GivenUUIDGenerator with(List<String> playbackUUIDs) {
        return new GivenUUIDGenerator(playbackUUIDs);
    }

    private final ImmutableList<String> playbackUUIDs;

    private GivenUUIDGenerator(List<String> playbackUUIDs) {
        this.playbackUUIDs = ImmutableList.copyOf(playbackUUIDs);
    }

    public GivenUUIDGenerator and(String uuid){
        return new GivenUUIDGenerator(ImmutableList.<String>builder().addAll(playbackUUIDs).add(uuid).build());
    }

    public ... generate() {
        // ... do here whatever it is you want to do with your list
    }
}
于 2013-08-27T20:33:48.930 回答
0

我认为将动词addappend放在方法名称的开头是不错的选择。我不喜欢它,with因为它传达的信息不如addor多append。我的介绍 CS 教授总是强调我们在开头用动词命名我们的方法名称,作为人们理解它是一种方法(而不是变量,例如)的快速提示。

大多数看到String类型的人也应该知道字符串是不可变的,所以你应该没问题。但万一他们不这样做,您可能想要评论它并在 Javadoc 中添加该注释/** insert comments here */

于 2013-08-27T20:40:49.767 回答
0

append是一个不错的选择,尽管有反例。例如,Java 的StringBuilder是可变的,并定义了几个append改变实例的方法。

流行的日期和时间库JodaTime在它with的一些不可变类(例如DateTime)中使用,其中该方法返回一个修改了某些字段的副本。虽然我敢肯定也有反例。

也许您可能想要使用注释来代替命名约定,或者与命名约定一样。(尽管已失效)JSR 305 为这个用例定义了一些注释。您可以使用注解GivenUUIDGenerator@Immutable方法append/with使用注解@CheckReturnValue

@Immutable实例一旦创建就无法修改的文档。

@CheckReturnValue更微妙的是,它记录了一个方法没有副作用,所以如果你在没有将结果分配给某物的情况下调用它,你可能会误解它的工作原理。例如myString.substring(5)vs String result = myString.substring(5),这里创建了一个新的 String 实例并立即丢弃,没有任何改变myString。FindBugs 可以检测到这一点并在发生错误时标记错误。有关此有用博客文章的更多信息。

于 2013-08-28T10:42:15.753 回答