是的,有缺点
易于阅读的代码是好的,但也要注意代码所传达的内容。当一个对象的方法总是返回该对象时,它传达了两件事:
- 我要求不一定要按顺序设置或配置的高级配置
- 后续的每个方法调用均基于最后一个
有效用例:临时数据库查询
类库几乎以每种语言存在,可让您查询数据库而无需求助于硬编码的SQL。以.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
类并没有有一个复杂的设置。设置标题,创建日期和正文并不能相互建立更复杂的最终目标。您已将一个方形钉捣成一个圆孔。
自引用方法链接的缺点是,您必须传达需要进行多个方法调用才能执行某项操作,并且每个调用都建立在最后一个方法的基础上。如果不是这样,则方法链接可能会将错误的信息传达给其他程序员。
当您的同事说:
流利的接口不应该只是为了方便而实现,而是为了语义
他们是绝对正确的。流利的接口或方法链接本身可能在传达某些不正确的信息。