![]() |
1
71
我同意这是主观的。在很大程度上,我避免了方法链接,但最近我也发现了一种情况,在这种情况下,这是正确的事情——我有一种方法,它接受了类似10个参数的东西,并且需要更多的参数,但在大多数情况下,您只需要指定一些参数。有了覆盖,这变得非常麻烦,非常快。相反,我选择了链式方法:
这有点像工厂模式。方法链接方法是可选的,但它使编写代码更容易(尤其是使用IntelliSense)。不过请注意,这是一个孤立的案例,在我的代码中并不是一般的做法。 关键是-在99%的情况下,没有方法链接,您可能也可以做得更好或者更好。但是有1%的人认为这是最好的方法。 |
![]() |
2
72
只有我的2美分; 方法链接使调试变得困难: -你不能把断点放在一个简洁的点上,这样你就可以把程序停在你想要的地方。 -如果这些方法中有一个抛出了异常,并且您得到了一个行号,那么您就不知道“链”中的哪个方法导致了这个问题。 我认为写一些简短的句子通常是个好习惯。每行只应进行一个方法调用。比起长线,更喜欢多线。 编辑:注释提到方法链接和换行是分开的。那是真的。不过,根据调试器的不同,在语句中间可能会放置断点,也可能不会放置断点。即使可以,使用带有中间变量的单独行也会给您带来更多的灵活性和一大堆可以在监视窗口中检查的值,这些值有助于调试过程。 |
![]() |
3
36
就个人而言,我更喜欢仅对原始对象起作用的链接方法,例如设置多个属性或调用实用程序类型方法。
在我的示例中,当一个或多个链接方法返回foo以外的任何对象时,我不会使用它。在语法上,只要对链中的对象使用正确的API,就可以链接任何对象,而更改对象imho会降低可读性,并且如果不同对象的API有任何相似之处,则会造成真正的混淆。如果在末尾执行一些真正常见的方法调用(
链接不同的对象也可能导致意外的空错误。在我的例子中,假设 福 有效,所有方法调用都是“安全的”(例如,对foo有效)。在OP的例子中:
…不能保证(作为外部开发人员查看代码)getschedule实际上会返回有效的非空计划对象。此外,调试这种类型的代码通常要困难得多,因为许多IDE不会在调试时将方法调用作为可以检查的对象进行评估。IMO,任何时候为了调试的目的,您可能需要一个对象来检查,我宁愿将它放在一个显式变量中。 |
![]() |
4
22
马丁·福勒在这里有一个很好的讨论:
|
![]() |
5
20
在我看来,方法链接有点新颖。当然,它看起来很酷,但我看不出它有什么真正的优势。 如何:
比以下更好:
当addObject()返回一个新对象时,可能会出现异常,在这种情况下,无约束的代码可能会有点麻烦,比如:
|
![]() |
6
8
这很危险,因为您依赖的对象可能比预期的多,例如,您的调用会返回另一个类的实例: 我举个例子: 食品店是一个由你拥有的许多食品店组成的对象。 getLocalStore()返回一个对象,该对象保存参数最近存储区的信息。getPriceForProduct(anything)是该对象的一个方法。 所以当你调用foodstore.getlocalstore(parameters.getPriceForProduct(anything)时 你不仅像你一样依赖于食品店,而且还依赖于本地商店。 如果getPriceForProduct(anything)发生任何变化,您不仅需要更改foodstore,还需要更改调用链接方法的类。 您应该始终以类之间的松散耦合为目标。 也就是说,我个人喜欢在编程Ruby时将它们链接起来。 |
![]() |
7
6
这似乎有点主观。 方法链接不是固有的坏的或好的IMO。 可读性是最重要的。 (还要考虑,如果有变化,大量的方法会使事物变得非常脆弱) |
![]() |
8
6
许多人使用方法链接作为一种方便的形式,而不是考虑到任何可读性问题。如果方法链接涉及对同一对象执行相同的操作,那么它是可以接受的——但前提是它实际上提高了可读性,而不仅仅是为了减少代码的编写。 不幸的是,根据问题中给出的示例,许多人使用方法链接。而他们 可以 仍然是可读的,但不幸的是,它们导致了多个类之间的高度耦合,所以这是不可取的。 |
![]() |
9
6
链接的好处
链接的一个好处,我没有看到提到,是在变量初始化期间,或者在将新对象传递给方法时,使用它的能力,不确定这是否是坏的实践。 我知道这是人为的例子,但你说你有下列课程
假设您没有访问基类的权限,或者说默认值是动态的,基于时间等。是的,您可以实例化然后更改值,但这会变得很麻烦,特别是如果您只是将值传递给一个方法:
但这不是更容易阅读吗:
或者,一个班级成员呢?
VS
这就是我使用链接的方式,通常我的方法只是为了配置,所以它们只有2行长,设置一个值,然后
和一些类似的
链条的损坏
当有很多参数要传递给例程时,我不使用链接,主要是因为行很长,正如OP提到的,当您将例程调用到其他类以传递给其中一个链接方法时,可能会让人困惑。 还有一个问题是,一个例程会返回无效的数据,到目前为止,我只在返回被调用的同一个实例时使用了链接。正如前面指出的那样,如果在类之间进行链接,会使调试更加困难(哪个类返回空?)并且可以增加类之间的依赖耦合。 结论 就像生活中的所有事情和编程一样,链接既不是好的,也不是坏的。如果你能避免坏的,那么链接将是一个巨大的好处。 我试着遵守这些规则。
|
![]() |
10
6
方法链接允许设计高级 DSLs 在Java中直接使用。本质上,您至少可以为这些类型的DSL规则建模:
这些规则可以使用这些接口实现
通过这些简单的规则,您可以在Java中直接实现复杂的DSL,如SQL。 jOOQ ,一个我创建的库。看到一个相当复杂的SQL示例 my blog 在这里:
另一个很好的例子是 jRTF 一个小的DSL,用于直接在Java中编写RTF文档。一个例子:
|
![]() |
11
3
方法链接对于大多数情况来说可能只是一种新颖的方法,但我认为它有它的位置。可以在中找到一个示例 CodeIgniter's Active Record use :
这看起来比:
这确实是主观的,每个人都有自己的观点。 |
![]() |
12
2
我同意,因此我改变了在我的库中实现一个流畅的接口的方式。 之前:
后:
在“before”实现中,函数修改了对象并以
我对这一变化的推理 :
结论:
|
![]() |
13
1
我认为主要的谬论是认为这通常是一种面向对象的方法,而实际上它更像是一种函数式编程方法。 我使用它的主要原因是为了可读性和防止我的代码被变量淹没。 我不太明白别人说的话会损害可读性。它是我使用过的最简洁和内聚的编程形式之一。 此外: converttexttovoice.loadtext(“source.txt”).converttovoice(“destination.wav”); 是我通常使用它的方式。使用它来链接x个参数并不是我通常使用它的方式。如果我想在方法调用中输入x个参数,我将使用 帕拉姆 语法: public void foo(params object[]items) 并根据类型强制转换对象,或者根据您的用例使用数据类型数组或集合。 |
![]() |
14
0
这里完全忽略了一点,方法链接允许 DRY . 它是“with”(在某些语言中实现得不好)的有效代言人。
这很重要,因为同样的原因,dry总是很重要的;如果a结果是一个错误,并且这些操作需要在b上执行,那么只需要在1个位置更新,而不需要在3个位置更新。 从实际意义上讲,这种情况下的优势是很小的。不过,少打字一点,再加一点结实(干),我就要了。 |
![]() |
15
0
好:
坏处:
一般: 一个好的方法是在出现情况或特定模块特别适合它之前,一般不要使用链接。 在某些情况下,尤其是在1点和2点称重时,链接会严重损害可读性。 在访问时,它可能会被误用,例如代替另一种方法(例如传递数组)或以奇怪的方式混合方法(parent.setsomehing().getchild().setsomehing().getparent().setsomehing())。 |
![]() |
16
0
我通常讨厌方法链接,因为我认为它会降低可读性。紧凑性常常与可读性混淆,但它们不是相同的术语。如果您在一个语句中做所有的事情,那么这是紧凑的,但是大多数情况下它比在多个语句中做的更不可读(更难理解)。正如您注意到的,除非您不能保证所用方法的返回值相同,否则方法链接将是一个混乱的来源。 1)
VS
2)
VS
3)
VS
正如你所看到的,你几乎一无所获,因为你必须在你的单个语句中添加换行符以使其更具可读性,并且你必须添加缩进以使它清楚地表明你所说的是不同的对象。如果我想使用基于标识的语言,那么我将学习python而不是这样做,更不用说大多数IDE都会通过自动格式化代码来删除缩进。 我认为这种链接唯一有用的地方是在CLI中管道化流或在SQL中将多个查询连接在一起。两者都有一个多对账单的价格。但是,如果您想解决复杂的问题,那么即使是那些付出代价、使用变量或写bash脚本、存储过程或视图在多个语句中编写代码的人,最终也会失败。 至于枯燥的解释:“避免知识的重复(不是文本的重复)。”和“少打字,甚至不重复文本。”,第一个原则是什么意思,但第二个原则是常见的误解,因为许多人不能理解过于复杂的胡说八道,如“每一个知识必须有一个单一的,不可重复的系统中的模糊、权威的表示”。第二种是不惜一切代价的紧凑性,在这种情况下会中断,因为它会降低可读性。当您在有界上下文之间复制代码时,第一个解释会被DDD打断,因为松耦合在该场景中更重要。 |
![]() |
Schadre · C-plus编码错误 2 年前 |
![]() |
Nithin K · 即使类属性的类型正确,也会获取异常 2 年前 |
![]() |
amirreza870 · Python OOP-更改类文本 2 年前 |
![]() |
A_K · 使用cat或打印方法打印部分内容的子集闭包 2 年前 |
![]() |
Mo Fatah · 如何使用Python类打印数独板? 3 年前 |