Tag: api design

DSLs /流畅接口的重点是什么?

我最近正在观看关于如何创建流畅的DSL的网络直播,我不得不承认,我不明白为什么会使用这种方法(至少对于给定的例子)。 网络广播提供了一个图像大小调整类,它允许您指定输入图像,resize并使用以下语法将其保存到输出文件(使用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,看看它有多容易,所以我不是在寻找关于那个或其他现有例子的评论。 我正在寻找一些(一般)注释来帮助我理解(例如)何时实现流畅的接口(而不是经典的类库),以及实现它时需要注意的事项。

C#generics:如果T是返回类型,它也可以是无效的吗? 如何将这些接口组合在一起?

我有以下接口,使用回调返回类型T的generics参数… public interface IDoWork { T DoWork(); } 但是我也有以下接口,但它不会调用回调,因为它返回void。 public interface IDoWork { void DoWork(); } 我可以组合这两个接口并使用运行时逻辑来确定差异吗? 我怎样才能做到这一点?