"流利"(或可链接)方法必须是不可变的吗?

15 c# fluent-interface fluent

假设我有一个具有一些属性的类和一些用于操作这些属性的方法:

public class PersonModel
{
    public string Name { get; set; }
    public string PrimaryPhoneNumber { get; set; }

    public void LoadAccountInfo(AccountInfo accountInfo)
    {
        this.Name = accountInfo.Name;
    }

    public void LoadPhoneInfo(PhoneInfo phoneInfo)
    {
        this.PrimaryPhoneNumber = phoneInfo.PhoneNumber;
    }
}
Run Code Online (Sandbox Code Playgroud)

典型用法是:

var model = new PersonModel();
model.LoadAccountInfo(accountInfo);
model.LoadPhoneInfo(phoneInfo);
Run Code Online (Sandbox Code Playgroud)

我认为将方法链接起来会很酷:

    public PersonModel LoadAccountInfo(AccountInfo accountInfo)
    {
        this.Name = accountInfo.Name;
        return this;
    }

    public PersonModel LoadPhoneInfo(PhoneInfo phoneInfo)
    {
        this.PrimaryPhoneNumber = phoneInfo.PhoneNumber;
        return this;
    }
Run Code Online (Sandbox Code Playgroud)

那么用法是:

var model = new PersonModel()
    .LoadAccountInfo(accountInfo)
    .LoadPhoneInfo(phoneInfo);
Run Code Online (Sandbox Code Playgroud)

但是我没有在每个可链接的方法中返回传入的PersonModel对象的修改"克隆".他们只是修改原始对象并返回它(为方便起见).对我来说,这会产生歧义,因为有人调用这些方法可能会认为它们是不可变的(即它们保持原始对象完整但返回修改后的对象).

这是否违反了关于流畅/可链接接口的任何最佳实践?

Ray*_*oal 4

我个人认为不变性和流畅的接口是不同的问题。您可能会发现不变性总体上是一件好事,是一种最佳实践。但这取决于你是否使用了流畅的界面。