构建器模式、委托和 lambda 表达式——需要解释
The builder pattern, delegates and lambda expression- need explanation
我不是编程界的新手,但是我需要帮助来理解这段代码中发生的事情。我确实了解构建器模式和 Action delagete(不 return 任何东西,但可以采用一些参数)。
最让我困扰的是下面的代码:
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 函数?
- 是否有可能以更简单的方式重写该代码(以便更好地理解 :))?
What happens in line 4?
在第 4 行,代码调用传入在第 3 行创建的 DoorBuilder
的动作委托,并在第 5 行将使用门构建器构建的门添加到由CarBuilder
。这是复合(或嵌套)构建器中使用的相当常见的模式。它看起来很像我多年前对一个问题的类似回答:
What do I actually pass in line 0 to WithDoors function?
这里有个问题,你的方法命名有点乱,CarBuilder
和DoorBuilder
都有一个方法叫WithDoors
。我会让 DoorBuilder
有一个名为 NumberOfDoors
的方法,使代码更具可读性,并且更清楚发生了什么:
var car = new CarBuilder().WithDoors(x => x.NumberOfDoors(4)).Build();
(注意变量名的变化;这一行的结果是(构建)car
NOT a carBuilder
!)
Is is possible to rewrite that code in some simpler way (to get better understanding :))?
我想知道这里是否甚至需要嵌套构建器,也许随着它变得更复杂(比如,设置门的功能,例如 trim、电动窗户等)但是正如你现在拥有的那样,你唯一可以建造的是门的数量,这些门可以很容易地放在 CarBuilder
本身上,从而制作代码:
var car = new CarBuilder().WithDoors(4).Build();
我不是编程界的新手,但是我需要帮助来理解这段代码中发生的事情。我确实了解构建器模式和 Action delagete(不 return 任何东西,但可以采用一些参数)。
最让我困扰的是下面的代码:
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 函数?
- 是否有可能以更简单的方式重写该代码(以便更好地理解 :))?
What happens in line 4?
在第 4 行,代码调用传入在第 3 行创建的 DoorBuilder
的动作委托,并在第 5 行将使用门构建器构建的门添加到由CarBuilder
。这是复合(或嵌套)构建器中使用的相当常见的模式。它看起来很像我多年前对一个问题的类似回答:
What do I actually pass in line 0 to WithDoors function?
这里有个问题,你的方法命名有点乱,CarBuilder
和DoorBuilder
都有一个方法叫WithDoors
。我会让 DoorBuilder
有一个名为 NumberOfDoors
的方法,使代码更具可读性,并且更清楚发生了什么:
var car = new CarBuilder().WithDoors(x => x.NumberOfDoors(4)).Build();
(注意变量名的变化;这一行的结果是(构建)car
NOT a carBuilder
!)
Is is possible to rewrite that code in some simpler way (to get better understanding :))?
我想知道这里是否甚至需要嵌套构建器,也许随着它变得更复杂(比如,设置门的功能,例如 trim、电动窗户等)但是正如你现在拥有的那样,你唯一可以建造的是门的数量,这些门可以很容易地放在 CarBuilder
本身上,从而制作代码:
var car = new CarBuilder().WithDoors(4).Build();