我主要对Java感兴趣,但我认为这是一个普遍的问题。最近,我一直在使用Arquillian (ShrinkWrap
),它使用了很多方法链接。方法链接的其他例子是StringBuilder
、StringBuffer
中的方法。使用这种方法有明显的好处:减少冗长是其中之一。
现在我在想,为什么不是所有具有void
返回参数的方法都实现为可链接的呢?链条一定有一些明显的、客观的缺点。因为如果所有的方法都是链式的,我仍然可以选择不使用它。
我并不是要求修改Java中现有的代码,这可能会在某个地方破坏一些东西,但是解释为什么不使用它也很好。我更多的是从未来的框架(用Java编写)设计的角度来问这个问题。
我发现了一个类似的问题,但是最初的提问者实际上想知道为什么它被认为是一个很好的实践:方法链接-为什么它是一个良好的实践,或不?
虽然有一些可用的答案,但我仍然不确定链接的所有优点和缺点,以及是否认为将所有的无效方法都链接起来是有用的。
发布于 2013-06-07 01:04:21
缺点
福利
tripleCrossProduct
实际上是第3行之前的谎言。但是,如果您有方法链接,则可以用正常的数学方法简洁地编写,而无需创建不必要的中间对象。
MyVector3d tripleCrossProduct=vector1.multiplyLocal(vector2).multiplyLocal(vector3);
所有这些都假设vector1是牺牲的,再也不需要使用了。NB MyVector3d
并不是作为Java的真实类使用,而是假设在调用.multiply()
方法时执行跨产品。不使用.cross()
是为了使那些不熟悉向量演算的人更清楚“意图”。
NB的解决方案是第一个使用多行方法链接的答案,我把它作为完整的第四个要点的一部分。
发布于 2013-06-13 04:53:58
方法链接是实现fluent接口的一种方法,而不管编程语言是什么。它的主要优点(可读的代码)告诉您什么时候使用它。如果对可读的代码没有特别的需求,最好避免使用它,除非API自然地设计为返回方法调用的结果的上下文/对象。
第1步: Fluent接口与命令查询API
对于命令查询API,必须考虑使用Fluent接口.为了更好地理解它,让我为下面的命令查询API编写一个项目列表定义。简单地说,这只是一种标准的面向对象的编码方法:
Command
。命令不返回值。Query
。查询不修改数据。遵循命令查询API将给您带来如下好处:
步骤2:基于命令查询API的Fluent接口
但是命令查询API由于某种原因而存在,而且它确实读起来更好。那么,我们如何同时使用fluent接口和命令查询API呢?
回答:必须在命令查询API之上实现fluent接口(而不是用fluent接口替换命令查询API )。将fluent接口看作是命令查询API上的外观。毕竟,它被称为fluent“接口”--在标准(命令查询) API之上的一个可读的或方便的接口。
通常,在命令查询API准备好之后(编写,可能是单元测试,抛光以便于调试),您可以在上面编写一个流畅的界面软件层。换句话说,fluent接口通过使用命令查询API来完成其功能.然后,在任何您想要方便和可读性的地方使用fluent接口(带有方法链接)。然而,一旦您想了解实际发生的事情(例如,调试异常时),就可以一直深入了解命令查询API --良好的旧的面向对象代码。
发布于 2013-06-06 21:57:20
我发现使用方法链接的缺点是在发生NullPointerException
或任何其他Exception
时调试代码。假设您有以下代码:
String test = "TestMethodChain"; test.substring(0,10).charAt(11); //This is just an example
然后,在执行上述代码时,您将得到超出范围的字符串索引:异常。当您进入实时情况时,这样的事情发生了,那么您就得到了发生了哪些行错误,而不是链式方法的哪个部分导致了这一错误。因此,在知道数据总是会出现或错误被正确处理的地方,需要谨慎地使用它。
它也有其优点,比如不需要编写多行代码并使用多个变量。
许多框架/工具都使用这种方法,比如Dozer,当我过去调试代码时,我必须仔细查看链的每个部分,以找出导致错误的原因。
希望这能有所帮助。
https://stackoverflow.com/questions/16976150
复制相似问题