一个类方法返回`this`是不好的实践吗?

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

有没有什么理由我不应该这样做?我想不出来,但感觉有些hacky,而且我没见过别人这样做过。


1
那不应该是 public static Chain NewChain() 吗? - juharr
3个回答

15

0

没问题。我还可以建议:

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; 
}

以上只是一个例子,我实际上并没有制造链条。谢谢。 - doliphin

0
如上所述,这是一种旨在使代码更易读的非常常见的设计模式。您可能会发现多个术语用于描述此类代码(流畅编码,流畅样式,流畅 API,流畅界面)。另一方面,它很难甚至有时不可能进行调试。中间结果无法获得。

怎么做呢?在处理这个惯用语时,你可以轻松地进入/退出并查看每一个中间结果。 - bolov
想象一下使用流畅的库,并在单个指令中链接10个流畅调用。首先,您无法进入/退出任何流畅方法调用,因为它是外部代码,如果链中的一个流畅调用失败,则整个序列都会失败,并且至少不容易调试/找到问题。 - Benzara Tahar
无法调试外部库并不特定于链接。 - bolov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接