【问题标题】:The builder pattern, delegates and lambda expression- need explanation构建器模式、委托和 lambda 表达式 - 需要解释
【发布时间】: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. }
  1. 第 4 行发生了什么?
  2. 我实际上在第 0 行中将什么传递给 WithDoors 函数?
  3. 是否可以以更简单的方式重写该代码(以便更好地理解:))?

代码: https://rextester.com/SIOV54215

【问题讨论】:

    标签: c# design-patterns lambda delegates


    【解决方案1】:

    第 4 行发生了什么?

    在第 4 行,代码调用传递在第 3 行创建的 DoorBuilder 的操作委托,在第 5 行,它将使用门构建器构建的门添加到由 CarBuilder 构建的汽车中。这是复合(或嵌套)构建器中使用的相当常见的模式。它看起来很像我多年前对一个问题的回答:Builder pattern with nested objects

    我实际上在第 0 行中将什么传递给 WithDoors 函数?

    这里有个问题,你的方法命名有些混乱,CarBuilderDoorBuilder 都有一个名为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 呼叫代表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    相关资源
    最近更新 更多