Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有fluent接口的方法名称_Java_Scala_Naming_Fluent Interface - Fatal编程技术网

Java 具有fluent接口的方法名称

Java 具有fluent接口的方法名称,java,scala,naming,fluent-interface,Java,Scala,Naming,Fluent Interface,我有一个Java中的Permissions类,它的方法是流畅的,如下所示: somePermissions.setRead(true).setWrite(false).setExecute(true) somePermissions.read(true).write(false).execute(true) 问题是,我应该将这些方法命名为set{Property},还是只命名为{Property}。后者将如下所示: somePermissions.setRead(true).setWrite

我有一个Java中的
Permissions
类,它的方法是流畅的,如下所示:

somePermissions.setRead(true).setWrite(false).setExecute(true)
somePermissions.read(true).write(false).execute(true)
问题是,我应该将这些方法命名为
set{Property}
,还是只命名为
{Property}
。后者将如下所示:

somePermissions.setRead(true).setWrite(false).setExecute(true)
somePermissions.read(true).write(false).execute(true)
如果我单独查看这些方法,我希望
read
读取一些内容,但另一方面,它更接近于在Scala中使用类似命名参数的内容:

Permission(read=true, write=false, execute=true)

明确地设置{Property}
。它告诉我们这个方法在做什么。假设您的属性名为
可见
编码
算法
。不使用
set
没有任何意义

可以使用与属性名称不同的更具描述性的操作名称。例如:

可见
->
显示(..)

编码
->
编码(..)

read
makeReadable(..)


name
->
giveName(…)
(“name”是动词,但不明确)

设置{Property}
在传达意图方面比只设置{Property}要好。但是,由于您的示例是简单的布尔属性,因此更流畅的干扰可能是:

somePermissions.AllowRead().DenyWrite().AllowExecute();

这是流畅接口的典型问题。虽然我同意@Bozho的观点,setRead()更容易解释,但fluent接口的目标是使整个“句子”可读,而不是使单个方法调用可读

因此,我会更进一步。那么:

somePermissions.readable().nonWritable().executable()

另请参见Martin Fowler关于此主题的文章。他说:“像这样构建一个流畅的API会导致一些不寻常的API习惯”

设置显然会干扰清晰度。它们不是真正的豆子式方法,所以我建议放弃它

我还建议将生成器与产品分开。喜欢产品的不变性


如果您有标志,我认为使用布尔值比使用成对的方法要好得多。Java库从1.0更改为1.1。然而,我还是不喜欢布尔人。
true
false
中没有更高层次的含义<代码>枚举s更好。更好的是,如果您谈论的是可以被视为集合的东西(如示例中所示),那么使用
set
(可能实现为
EnumSet
)。

愚蠢的问题,但为什么不使用命名和默认参数呢?至少对于您给出的示例来说,它是最简洁、可读性最强的。我应该说我使用的是Java,它不支持命名和默认参数。这很好,但您应该考虑处理有人无意义地链接的情况:
allowerad().DenyRead()
@oxbow\u为什么?如果你先允许吸烟,然后又禁止吸烟,对你来说可以吗?IMHO这一点非常清楚(尽管您可能希望防止此类情况发生,因为它们可能是由错误造成的)。