Да, есть недостатки
Код, который легко читать, хорош, но также остерегайтесь того, что код также передает . Когда методы объекта всегда возвращают объект, он сообщает пару вещей:
- Мне требуется расширенная конфигурация, которая не обязательно очевидна, в каком порядке все должно быть установлено или настроено
- Каждый последующий вызов метода основывается на последнем
Допустимый вариант использования: специальные запросы к базе данных
Библиотеки классов существуют почти во всех языках, что позволяет запрашивать базу данных, не прибегая к жестко закодированному SQL. Возьмем Entity Framework для .NET в качестве примера:
DBContext db = new DBContext();
List<Post> posts = db.Posts
.Where(post => post.Title.Contains("Test"))
.OrderBy(post => post.DateCreated)
.ToList();
Это свободный интерфейс, в котором каждый последующий вызов метода основывается на предыдущем. Логическое чтение этих вызовов имеет смысл в контексте запросов к базе данных.
Неверный вариант использования: синтаксический сахар для настройки свойств
Теперь давайте использовать тот же шаблон с Post
классом:
public class Post
{
public string Title { get; set; }
public DateTime DateCreated { get; set; }
public string Body { get; set; }
public Post SetTitle(string title)
{
Title = title;
return this;
}
public Post SetDateCreated(DateTime created)
{
DateCreated = created;
return this;
}
public Post SetBody(string body)
{
Body = body;
return this;
}
}
Теперь давайте посмотрим, как вы будете использовать этот класс:
Post post = new Post()
.SetTitle("Test")
.SetDateCreated(DateTime.Now)
.SetBody("Just a test");
Когда я вижу этот код, я сразу же задаю вопрос: «После вызова SetBody
запрашивает ли он базу данных? Нужно ли вызывать другой метод, чтобы сказать« Я сделал? »»
Что связывают вызовы метода с кодом с помощью Post
класса?
- У меня сложная настройка
- Каждый вызов метода основан на предыдущем
Является ли это на самом деле так? Нет . Post
Класс никак не имеет сложную настройку. Установка заголовка, даты создания и тела не основывается на более сложной конечной цели. Вы разбили квадратный колышек в круглое отверстие.
Недостаток связывания методов со ссылками на себя состоит в том, что вы сообщаете, что для выполнения чего-либо требуется несколько вызовов методов и что каждый вызов строится из последнего. Если это не так, то цепочка методов может сообщать неправильные вещи другим программистам.
Когда ваши коллеги сказали:
Свободные интерфейсы должны быть реализованы не только для удобства, но и для семантики
Они были абсолютно правы. Свободный интерфейс или цепочка методов сообщают о себе что-то, что может быть неверным.