c# - DSL/流畅接口(interface)的意义何在

标签 c# dsl fluent-interface api-design

我最近在看关于 how to create a fluent DSL 的网络广播我不得不承认,我不明白为什么会使用这种方法(至少对于给定的示例)。

网络广播介绍了一个图像大小调整类,它允许您使用以下语法(使用 C#)指定输入图像、调整其大小并将其保存到输出文件中:

Sizer sizer = new Sizer();
sizer.FromImage(inputImage)
     .ToLocation(outputImage)
     .ReduceByPercent(50)
     .OutputImageFormat(ImageFormat.Jpeg)
     .Save();

我不明白这比采用一些参数的“传统”方法有何优势:

sizer.ResizeImage(inputImage, outputImage, 0.5, ImageFormat.Jpeg);

从可用性的角度来看,这似乎更容易使用,因为它清楚地告诉您该方法期望的输入内容。相比之下,使用流畅的界面,没有什么可以阻止您省略/忘记参数/方法调用,例如:

sizer.ToLocation(outputImage).Save();

继续我的问题:

1 - 是否有一些方法可以提高流畅界面的可用性(即告诉用户他应该做什么)?

2 - 这种流畅的接口(interface)方法是否只是对 C# 中不存在的命名方法参数的替代?命名参数是否会使流畅的接口(interface)过时,例如类似 objective-C 的东西:

sizer.Resize(from:input, to:output, resizeBy:0.5, ..)

3 - 流畅的界面是否仅仅因为它们当前流行而被过度使用?

4 - 或者它只是为网络广播选择的一个坏例子?在那种情况下,请告诉我这种方法的优点是什么,在什么地方使用它有意义。

顺便说一句:我了解 jquery,并且看到它使事情变得多么简单,所以我不寻求关于它或其他现有示例的评论。

我更想寻找一些(一般性)评论来帮助我理解(例如)何时实现流畅的接口(interface)(而不是经典的类库),以及实现接口(interface)时要注意什么。

最佳答案

2 - Is this fluent interface approach just a replacement for the non existing named method parameters in C#? Would named parameters make fluent interfaces obsolete, e.g. something similar objective-C offers:

嗯,是的,不是。流畅的界面为您提供了更大的灵 active 。使用命名参数无法实现的是:

sizer.FromImage(i)
 .ReduceByPercent(x)
 .Pixalize()
 .ReduceByPercent(x)
 .OutputImageFormat(ImageFormat.Jpeg)
 .ToLocation(o)
 .Save();

流体界面中的 FromImage、ToLocation 和 OutputImageFormat,我觉得有点味道。相反,我会按照这些思路做一些事情,我认为这更清楚。

 new Sizer("bob.jpeg") 
 .ReduceByPercent(x)
 .Pixalize()
 .ReduceByPercent(x)
 .Save("file.jpeg",ImageFormat.Jpeg);

Fluent 接口(interface)与许多编程技术都存在相同的问题,它们可能被误用、过度使用或未充分使用。我认为当这种技术被有效使用时,它可以创建更丰富、更简洁的编程模型。甚至 StringBuilder 也支持它。

var sb = new StringBuilder(); 
sb.AppendLine("Hello")
 .AppendLine("World"); 

关于c# - DSL/流畅接口(interface)的意义何在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/587995/

相关文章:

c# - 为什么这个 .dll 在 ILSpy 中有奇怪的字母?

android - 如何使用 Anko DSL 设置 NavigationView 标题 View ?

sql - 将 DSL 转换为 SQL 的正确工具?

python - 你能在 Python 的核心类型上修改补丁方法吗?

c# - 在 C# 3 中编写流畅接口(interface)的技巧

c# - CaSTLe Windsor Fluent 配置 : Is it possible to make a specific lifestyle for a given service without using the concrete implementation?

c# - 可选参数始终填充

c# - 如何仅通过一个线程使用 .net 异步 CTP

c# - 压力测试——连接饱和

.net - .NET 中 DSL(工具)的经验