类方法返回“this”是不好的做法吗?

Is it bad practice for a class method to return `this`?

提问人:doliphin 提问时间:2/3/2021 最后编辑:doliphin 更新时间:3/21/2021 访问量:266

问:

public class Chain
{
    public string ChainString;

    public Chain() 
    {
        ChainString = "{}"; 
    }

    public Chain AddLink()
    {
        ChainString += "-{}";
        return this; // is this a bad idea?
    }
}

在上面的示例中,该方法返回 .我想这样做的原因是为了一个更具可读性的实例化,如下图所示。AddLinkthis

// 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 = "{}-{}-{}-{}"

我有什么理由不应该这样做吗?我想不出任何一个,但感觉有点骇人听闻,而且我没有在其他地方看到它。

C# oop 返回 这个 流畅的

评论

1赞 juharr 2/3/2021
那不应该吗?public static Chain NewChain()

答:

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
无法调试外部库并不是链接所特有的。