提问人:doliphin 提问时间:2/3/2021 最后编辑:doliphin 更新时间:3/21/2021 访问量:266
类方法返回“this”是不好的做法吗?
Is it bad practice for a class method to return `this`?
问:
public class Chain
{
public string ChainString;
public Chain()
{
ChainString = "{}";
}
public Chain AddLink()
{
ChainString += "-{}";
return this; // is this a bad idea?
}
}
在上面的示例中,该方法返回 .我想这样做的原因是为了一个更具可读性的实例化,如下图所示。AddLink
this
// more verbose (here, `AddLink` returns void)
Chain myChain = new Chain();
myChain.AddLink();
myChain.AddLink();
myChain.AddLink();
// myChain.ChainString = "{}-{}-{}-{}"
// nicer
Chain myChain = new Chain()
.AddLink()
.AddLink()
.AddLink();
// myChain.ChainString = "{}-{}-{}-{}"
我有什么理由不应该这样做吗?我想不出任何一个,但感觉有点骇人听闻,而且我没有在其他地方看到它。
答:
15赞
EricSchaefer
2/3/2021
#1
不。这是 Fluent 接口的常见模式。
0赞
Joel Coehoorn
2/3/2021
#2
这很好。我还可以建议:
public Chain AddLink(int links = 1)
{
if (links <= 0) return this;
string link = "-{}";
var buf = new StringBuilder(ChainString, ChainString.Length + (links * link.Length));
for(int i=0; i<links; i++)
{
buf.Append(link);
}
ChainString = buf.ToString();
return this;
}
评论
0赞
doliphin
2/3/2021
以上只是一个例子,我实际上并没有做链子。不过,谢谢。
0赞
Benzara Tahar
2/3/2021
#3
如上所述,这是一种非常常见的设计模式,旨在使代码更具可读性。您可能会发现使用几个术语来描述此类代码(流体编码、流畅风格、流畅的 api、流畅的接口)。 另一方面,调试很困难,有时甚至不可能。中间结果是无法实现的。
评论
0赞
bolov
2/3/2021
怎么会这样?在处理这个成语时,你可以很容易地介入/退出,并看到每一个中间结果。
0赞
Benzara Tahar
2/3/2021
想象一下,使用一个流畅的库,你在一条指令中链接了 10 个流畅的调用。首先,您不能单步执行/单步执行任何 Fluent 方法调用,因为它是外部代码,如果链中的一个 Fluent 调用失败,则整个序列将失败,并且调试/查找问题至少不是直接的
0赞
bolov
2/3/2021
无法调试外部库并不是链接所特有的。
评论
public static Chain NewChain()