gpt4 book ai didi

fluent-interface - 流畅的接口(interface)是由上下文无关语法还是常规语法描述的?

转载 作者:行者123 更新时间:2023-12-04 08:32:47 25 4
gpt4 key购买 nike

我正在玩弄 Martin Fowlers 文本风格的流畅界面,我想知道他们描述的语法是上下文无关的还是常规的?我说的是这样的接口(interface):

var car = new Car();
car.Configure().MakeCar.With.Wheels(4).And.Engine.Using.Petrol;

我想做的是编写一个可以生成它们的程序。目前它需要输入上下文无关语法,但我似乎很难将其转换为源代码应用程序。我怀疑答案是我只能使用常规语法,因为无法知道“堆栈”的状态,因为必须事先知道每个“终端”方法的结果。

我现在得到的东西可以工作,但它在某些语法上会出错。

编辑:我使用常规语法,代码是开源的,如果有人热衷于使用它,现在可以使用。 https://github.com/Dervall/Snout

最佳答案

任何时候的选项集都由当时类上可用的方法决定。该方法返回的类决定了下一组方法。

所以生成链的语法规则是right regular grammar其中起始符号是类,符号是方法,非终结符是方法返回的类:

class Car:
configure: Configurator

class Configurator:
with: Configurator // noise method
and: Configurator // noise method
wheels: int -> Configurator
windows: int -> WindowDetails

class WindowDetails:
transparent -> Configurator
tinted -> Configurator

忽略方法参数(int):

Car -> "configure" Configurator
Configurator -> "with" Configurator
Configurator -> "and" Configurator
Configurator -> "wheels" Configurator
Configurator -> "windows" WindowDetails
WindowDetails -> "transparent" Configurator
WindowDetails -> "tinted" Configurator

但这未能捕捉到的是轮子的参数(轮子的数量)。并且常规语法无法处理该问题,因为不同的整数参数可能导致不同的类(例如,在“(2)”之后,您有配置器还是 WindowDetails?):

Configurator -> "wheels" Integer
Configurator -> "windows" Integer
Integer -> ?

所以这取决于你想要什么。方法链可以用常规语法来描述。但是常规语法也不能描述传递给方法的参数。失败。

可以通过增加上下文无关语法的复杂性来处理参数,因为这样您就可以做如下事情:

Configurator -> "wheels" Integer Configurator
Configurator -> "windows" Integer WindowDetails

它具有在整数参数之后正确继续所需的额外信息。

注意:以上假定方法名称在所有类中都是唯一的。如果你有两个具有相同方法名称的不同类,那么你将会遇到问题,显然(我希望)(如果你使用“with”和“and”之类的东西,这可能不会那么罕见......)

关于fluent-interface - 流畅的接口(interface)是由上下文无关语法还是常规语法描述的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9862979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com