Должен ли «плавный» (или цепной) метод быть неизменным ?

Скажем, у меня есть класс с некоторыми свойствами и некоторыми методами для управления этими свойствами:

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

Типичное использование:

var model = new PersonModel();
model.LoadAccountInfo(accountInfo);
model.LoadPhoneInfo(phoneInfo);

Я думаю, было бы круто сделать методы последовательными:

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

    public PersonModel LoadPhoneInfo(PhoneInfo phoneInfo)
    {
        this.PrimaryPhoneNumber = phoneInfo.PhoneNumber;
        return this;
    }

Затем использование будет:

var model = new PersonModel()
    .LoadAccountInfo(accountInfo)
    .LoadPhoneInfo(phoneInfo);

Но я не возвращаю модифицированный «клон» переданного объекта PersonModel в каждом из этих цепных методов. Они просто изменяют исходный объект и возвращают его (для удобства). Для меня это создает двусмысленность, потому что кто-то, вызывающий эти методы, может предположить, что они неизменяемы (т.е. они оставляют исходный объект нетронутым, но возвращают измененный объект).

Нарушает ли это какой-либо вид передовой практики в отношении плавных / цепных интерфейсов?

15
задан dreftymac 1 July 2018 в 04:28
поделиться