Java 具有fluent接口的方法名称
我有一个Java中的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
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这一点非常清楚(尽管您可能希望防止此类情况发生,因为它们可能是由错误造成的)。