开发者常编写如下代码:
builder.Add("Milk").Add("Sugar").Add("Coffee").Mix();或这样:
new EmailBuilder()
.To("user@domain.com")
.WithSubject("Invoice Ready")
.WithBody("Please find attached invoice.")
.Send();这两种风格看似相似,大多数人会立即认为:
“两者都是流式API。”
实际上,只有第二种才是真正的流式接口。
第一种是方法链。
两者都很优雅。两者都很有用。
但它们解决的是不同问题。
让我们用最恰当的比喻,慢慢揭开它们的层次。
[按Enter键或点击查看完整图片]
现实世界故事:两种完成工作的风格
想象你在厨房里。
你想制作咖啡。
有两种方式可以指示你的助手。
方法链 → “只需执行下一步…并继续把碗递给我。”
这种风格是机械式的。
没有对话,没有英语语法,没有类似食谱的流程。
你只需说:
“加糖。”
“加牛奶。”
“加咖啡粉。”
“搅拌。”
“上菜。”
每次,你的助手都递回同一个碗。
没什么花哨的。
只是直接的任务执行,一步一步。
你的指令读起来不像食谱。
它们读起来像是连续动作。
这就是方法链。
对象返回自身(return this),以便下一次调用可以在同一个对象上操作。
流式方法 → “为我制作咖啡:加糖→加牛奶→搅拌→上菜。”
这完全不同。
在这里,你不仅仅是发出命令。
你是在传达意图。
你是在以人类阅读食谱的方式表达步骤。
感觉像是描述性指示,而非程序性杂务。
你使用语言结构。
你使用领域语法。
你在代码中构建一个故事。
这就是流式接口。
它们有何不同?
让我们用简单的情感术语来解析:
方法链 = 机械连接性
流式接口 = 人类对话
让我们在C#中并排观察:情感与细节并存
1. 方法链(简单、直接)
publicclassCalculator
{
privateint _value;
public Calculator Add(int number)
{
_value += number;
returnthis;
}
public Calculator Multiply(int number)
{
_value *= number;
returnthis;
}
publicintResult()
{
return _value;
}
}这感觉如何?
感觉像是:
“拿同一个对象,应用这个操作,现在应用那个操作…继续下去。”
用法:
var result = new Calculator()
.Add(10)
.Multiply(2)
.Add(5)
.Result();没有语言。
没有表达。
只是链式命令。
这是乐高式编程。
2. 流式方法(可读、表达性、自然)
这是一个读起来像对话的邮件构建器。
publicclassEmailBuilder
{
privatestring _to;
privatestring _subject;
privatestring _body;
public EmailBuilder To(string to)
{
_to = to;
returnthis;
}
public EmailBuilder WithSubject(string subject)
{
_subject = subject;
returnthis;
}
public EmailBuilder WithBody(string body)
{
_body = body;
returnthis;
}
public Email Send()
{
returnnew Email(_to, _subject, _body);
}
}使用它:
var email = new EmailBuilder()
.To("student@domain.com")
.WithSubject("Your Results")
.WithBody("Congratulations!")
.Send();这读起来像是:
“给学生→带有主题→带有正文→发送。”
这是流利性。
它提供意义,而不仅仅是执行。
它反映了人类的思维过程。
流利性的真正力量:引导正确使用
一个恰当的流式API通常使用接口来强制逻辑顺序。
例如:
.Select()之前调用.Where().OrderBy()之前调用.Build().To()之前调用.WithSubject()API强制正确性。
让我们看看它。
真正的流式接口:逐步语法
publicinterfaceIEmailTo
{
IEmailSubject To(string address);
}
publicinterfaceIEmailSubject
{
IEmailBody WithSubject(string subject);
}
publicinterfaceIEmailBody
{
IEmailSend WithBody(string body);
}
publicinterfaceIEmailSend
{
Email Send();
}实现:
publicclassFluentEmailBuilder :
IEmailTo, IEmailSubject, IEmailBody, IEmailSend
{
privatestring _to;
privatestring _subject;
privatestring _body;
public IEmailSubject To(string address)
{
_to = address;
returnthis;
}
public IEmailBody WithSubject(string subject)
{
_subject = subject;
returnthis;
}
public IEmailSend WithBody(string body)
{
_body = body;
returnthis;
}
public Email Send()
{
returnnew Email(_to, _subject, _body);
}
}用法:
var email = new FluentEmailBuilder()
.To("developer@dotnet.com")
.WithSubject("Welcome")
.WithBody("Your account is ready!")
.Send();这不再是关于链式方法。
它已成为精心设计的语言。
这是流利性。
这是优雅。
这是API故事讲述。
最深刻的区别(大多数博客遗漏的部分)
方法链是一种技术。
流式接口是一种哲学。
方法链是语法糖。
流式接口是考虑人类心理的API设计。
你永远不会忘记的真实世界示例
想象两位开发者编写代码
开发者A(方法链风格)
他写道:
query.Select("*").From("Orders").Where("Status='Pending'");他的心态是:
“我必须按顺序执行这些步骤。”
这就像告诉机器人:
做这个
现在做那个
现在做那个
非常事务性。
非常程序化。
开发者B(流式方法风格)
她写道:
query
.Select("OrderId", "Amount")
.From("Orders")
.Where("Amount > 1000")
.OrderBy("Amount");她的意图是:
“以我英语描述的方式为我构建查询。”
她的API甚至引导她。
她感觉自己正在编写一个故事。
这就是流式接口旨在实现的目标。
注,如有侵权,请第一时间联系删除,谢谢。