构建器模式、委托和 lambda 表达式 - 需要解释
Posted
技术标签:
【中文标题】构建器模式、委托和 lambda 表达式 - 需要解释【英文标题】:The builder pattern, delegates and lambda expression- need explanation 【发布时间】:2021-12-03 01:09:26 【问题描述】:我在编程领域并不陌生,但是我需要帮助来理解这段代码中发生了什么。我确实了解构建器模式和 Action delagete(不返回任何内容,但可以接受一些参数)。
下面的代码让我很困扰:
0. var carBuilder = new CarBuilder().WithDoors(x => x.WithDoors(4)).Build();
1. public CarBuilder WithDoors(Action<DoorsBuilder> x)
2.
3. var doorsBuilder = new DoorsBuilder();
4. x(doorsBuilder);
5. _car.AddDoors(doorsBuilder.Build());
6. return this;
7.
-
第 4 行发生了什么?
我实际上在第 0 行中将什么传递给 WithDoors 函数?
是否可以以更简单的方式重写该代码(以便更好地理解:))?
代码: https://rextester.com/SIOV54215
【问题讨论】:
【参考方案1】:第 4 行发生了什么?
在第 4 行,代码调用传递在第 3 行创建的 DoorBuilder
的操作委托,在第 5 行,它将使用门构建器构建的门添加到由 CarBuilder
构建的汽车中。这是复合(或嵌套)构建器中使用的相当常见的模式。它看起来很像我多年前对一个问题的回答:Builder pattern with nested objects
我实际上在第 0 行中将什么传递给 WithDoors 函数?
这里有个问题,你的方法命名有些混乱,CarBuilder
和DoorBuilder
都有一个名为WithDoors
的方法。我会让DoorBuilder
有一个名为NumberOfDoors
的方法,使代码更具可读性,并且更明显地发生了什么:
var car = new CarBuilder().WithDoors(x => x.NumberOfDoors(4)).Build();
(注意变量名的变化;这一行的结果是(构建的)car
NOT carBuilder
!)
是否可以以更简单的方式重写该代码(以便更好地理解:))?
我想知道这里是否需要嵌套构建器,也许随着它变得更加复杂(例如,设置门的功能,如装饰、电动窗等),但你做对了现在您唯一可以构建的就是可以在CarBuilder
本身制作代码的门的数量:
var car = new CarBuilder().WithDoors(4).Build();
【讨论】:
x.Invoke(doorsBuilder) 是否等同于 x(doorsBuilder)? 看起来 x.NumberOfDoors() 需要 DoorsBuilder 的实例才能执行。 x.NumberOfDoors 当然不会明确地接受它,而是隐含地接受它。换句话说:如果我想执行 x.NumberOfDoors,我需要提供 DoorsBuilder 的实例。我做对了吗? @tylkonachwile 我想是的,是的。 是的,您可以使用Invoke
呼叫代表以上是关于构建器模式、委托和 lambda 表达式 - 需要解释的主要内容,如果未能解决你的问题,请参考以下文章