【发布时间】:2010-10-09 22:26:22
【问题描述】:
我最近正在观看一个关于 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 - 这种流畅的接口方法只是替代 C# 中不存在的命名方法参数吗?命名参数是否会使流利的接口过时,例如类似 Objective-C 提供的东西:
sizer.Resize(from:input, to:output, resizeBy:0.5, ..)
3 - 流畅的界面是否仅仅因为它们目前很流行而被过度使用?
4 - 或者这只是为网络广播选择的一个坏例子?在这种情况下,请告诉我这种方法的优点是什么,在哪里使用它有意义。
顺便说一句:我了解 jquery,并且了解它使事情变得多么容易,所以我不是在寻找关于那个或其他现有示例的 cmets。
我更多的是寻找一些(通用的)cmets 来帮助我理解(例如)何时实现流畅的接口(而不是经典的类库),以及实现接口时要注意什么。
【问题讨论】:
-
+1 我也认为他们目前被滥用了。
标签: c# dsl fluent-interface api-design