我最近在看关于 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/