问题标签 [fluent-interface]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2955 浏览

c# - 流畅地设置 C# 属性和链接方法

我正在使用.NET 3.5。我们有一些复杂的第三方类,它们是自动生成的,不受我的控制,但为了测试目的,我们必须使用它们。我看到我的团队在我们的测试代码中做了很多深度嵌套的属性获取/设置,这变得非常麻烦。

为了解决这个问题,我想制作一个流畅的界面来设置分层树中各种对象的属性。这个第三方库中有大量的属性和类,手动映射一切太繁琐。

我最初的想法是只使用对象初始化器。Red, Blue, 和Green是属性,并且Mix()是将第四个属性设置为Color与该混合颜色最接近的 RGB 安全颜色的方法。油漆必须在使用Stir()前均质化。

这可以初始化Paint,但我需要链接Mix()和其他方法。下一次尝试:

但这不能很好地扩展,因为我必须为要设置的每个属性定义一个方法,并且所有类中有数百个不同的属性。此外,C# 没有办法在 C# 4 之前动态定义方法,所以我认为我不能以某种方式自动执行此操作。

第三次尝试:

这看起来还不错,而且似乎可行。这是一个可取的方法吗?是否可以编写以Set这种方式工作的方法?还是我应该追求另一种策略?

0 投票
1 回答
1064 浏览

c# - 流畅的界面设计和代码味道

基本上,我希望能够做这样的事情:

因此,有些“步骤”被命名,有些则没有。

我不喜欢的是 StepClause 知道它的派生类 NamedStepClause。

我尝试了几件事来让我觉得更好。我试图将事情转移到接口,但问题只是从具体转移到接口 - INamedStepClause 仍然需要从 IStepClause 派生,并且 IStepClause 需要返回 INamedStepClause 才能调用 Step()。我也可以让 Step() 成为一个完全独立的类型的一部分。那么我们就没有这个问题了,我们会有:

没关系,但如果可能的话,我想将步骤命名设为可选。

我在这里找到了关于 SO 的另一篇文章,看起来很有趣且很有希望。你有什么意见?我认为最初的解决方案是完全不可接受的,或者是吗?

顺便说一句,这些操作方法将采用谓词和仿函数,我认为我不想采用额外的参数来命名那里的步骤。

对我来说,这一切的重点是只在一个地方和一个地方定义这些操作方法。因此,使用泛型和扩展方法的引用链接中的解决方案似乎是迄今为止最好的方法。

0 投票
4 回答
1435 浏览

java - 具有流畅接口的方法名称

Permissions在 Java 中有一个类,其方法流利,如下所示:

问题是,我应该命名这些方法set{Property}还是只命名{property}. 后者看起来像这样:

如果我分别查看这些方法,我希望它read会读取一些东西,但另一方面它更接近于在 Scala 中拥有类似命名参数的意图:

0 投票
2 回答
121 浏览

c# - 库开发 - 寻找建议功能的有效用例

我正在为一个名为Fasterflect的库做出贡献,其目的是“改善开发人员使用反射的体验”。因此,它提供了一个建立在经典反射之上的抽象,并且可以在完全相同的场景中使用。

下面显示了通过对象实例访问成员的当前语法:

一位用户建议我们添加对基于 lamdba 的访问的支持(类似于 Fluent Hibernate):

考虑到反射通常是在编译时您不知道的类型上执行的,我很难考虑这将是有用的场景。我只是缺乏想象力吗?是否存在有效的反射场景,您在编译时就知道类型?

此 NBuilder 功能请求中的原始建议有一些额外的上下文,您还可以查看Fasterflect 功能请求

0 投票
2 回答
864 浏览

.net - 流畅的接口是否会显着影响 .NET 应用程序的运行时性能?

我目前正忙于为现有技术实现一个流畅的接口,这将允许类似于以下代码段的代码:

为了实现这样的结构,需要类来积累参数并将它们传递给其他对象。例如,要实现该Open.File(...).In(...)构造,您需要两个类:

也就是说,初始示例等语句的组成部分越多,需要创建的对象就越多,以便将参数传递给链中的后续对象,直到实际语句最终可以执行。

问题:

我对一些观点感兴趣:使用上述技术实现的流畅接口是否会显着影响使用它的应用程序的运行时性能?对于运行时性能,我指的速度和内存使用方面。

请记住,可能只需要在非常短的时间跨度内创建大量临时的、保存参数的对象,我认为这可能会给垃圾收集器带来一定的压力。

如果您认为有显着的性能影响,您知道实现流畅接口的更好方法吗?

0 投票
2 回答
2165 浏览

c# - 使用 Castle Fluent 接口注册拦截器

我正在尝试通过拦截器实现休眠事务处理,但无法弄清楚如何通过流利的机制注册接口。

我看到一个

但不确定如何使用它。有人可以帮我吗?这个例子看起来有点复杂。

0 投票
1 回答
1152 浏览

php - 在 PHP 中检测方法链的结尾?

我找不到关于上述问题的简单示例:如何检测方法链的结尾?

例如,我只是看了 Zend_Db_Select ,但是对于我认为这个简单的问题来说,这个太复杂了。

是否有可能在 PHP 中捕获方法链的“结束”?

谢谢,法布里克

0 投票
3 回答
6076 浏览

javascript - 设计一个流畅的 Javascript 接口来抽象出 AJAX 的异步特性

我将如何设计一个 API 来隐藏 AJAX 和 HTTP 请求的异步性质,或者基本上延迟它以提供流畅的接口。举一个 Twitter 新的Anywhere API 的例子:

vs this(每个调用的异步性质清晰可见)

它找到用户,获取他们的推文时间线,仅过滤前 20 条推文,应用自定义过滤器,并最终使用回调函数处理每条推文。

我猜测像这样设计良好的 API 应该像查询构建器(想想 ORM)一样工作,其中每个函数调用都构建查询(在这种情况下为 HTTP URL),直到它遇到诸如 each/map/etc 之类的循环函数,进行 HTTP 调用,传入的函数成为回调。

一个简单的开发路线是使每个 AJAX 调用同步,但这可能不是最好的解决方案。我有兴趣找出一种使其异步的方法,并且仍然隐藏 AJAX 的异步性质。

0 投票
6 回答
6185 浏览

c# - C# 中可能的部分泛型类型推断?

我正在为我的 IoC 类库重写我的流利界面,当我重构一些代码以便通过基类共享一些通用功能时,我遇到了一个障碍。

注意:这是我想做的事情,而不是我必须做的事情。如果我不得不使用不同的语法,我会的,但如果有人知道如何让我的代码按照我想要的方式编译,那将是最受欢迎的。

我希望某些扩展方法可用于特定的基类,并且这些方法应该是通用的,具有一种通用类型,与方法的参数相关,但这些方法还应该返回与它们的特定后代相关的特定类型'被调用。

使用代码示例比上面的描述更好。

这是一个简单而完整的例子,说明什么不起作用

如果你编译这个,你会得到:

我想要的是扩展方法 ( Parameter<T>) 能够在ConcreteTypeRegistration和上调用DelegateRegistration,并且在这两种情况下,返回类型都应该与调用扩展的类型相匹配。

问题如下:

我想写:

但也Parameter<T>返回一个与它被调用的类型相同的对象,这意味着:

有什么办法可以欺骗编译器为我实现这一飞跃?

如果我向方法中添加两个泛型类型参数Parameter,类型推断会强制我要么提供两者,要么不提供,这意味着:

给了我这个:

这同样糟糕。

我可以轻松地重组类,甚至通过将它们引入层次结构来使方法成为非扩展方法,但我的问题是我是否可以避免为两个后代复制方法,并且以某种方式只声明一次, 对于基类。

让我重新表述一下。有没有办法更改上面第一个代码示例中的类,以便保留 Main-method 中的语法,而无需复制相关方法?

代码必须与 C# 3.0 和 4.0 兼容。


编辑:我不想将两个泛型类型参数都留给推理的原因是,对于某些服务,我想为一种类型的构造函数参数指定一个参数值,但传入一个后代值。目前,指定参数值和要调用的正确构造函数的匹配是使用参数的名称和类型完成的。

让我举个例子吧:

如果我将两者都留给类型推断,则参数类型将是FileStream,而不是Stream

0 投票
1 回答
513 浏览

php - 闭包如何帮助创建 DSL/fluent 接口:PHP 示例?

你能给我一个例子,用 PHP 来说明闭包如何有助于创建 DSL(流利的接口)吗?

编辑:以下问题中接受的答案讲述了嵌套闭包。如果有人可以将该示例翻译成 PHP,那也会有所帮助: 体验流畅的界面?我需要你的意见!