为了账号安全,请及时绑定邮箱和手机立即绑定

如何在程序中正确表达构图?

如何在程序中正确表达构图?

PHP
POPMUISE 2024-01-20 16:09:32
假设我们有 2 个类:Car 和 Engine。发动机取决于汽车——当汽车被毁坏时,发动机也随之被毁。如何正确表达Engin对Car的依赖?其关系是 Engine 类在 Car 之外没有意义。在我看来,Engine 的注入表明了与 Car 的某种独立性。在这种情况下哪个汽车构造函数是正确的?有DI还是没有?示例代码:interface IEngine { }class Engine : IEngine { }class Car{    private readonly IEngine _engine;    public Car()    {        _engine = new Engine();    }    public Car(IEngine engine)    {        _engine = engine;    }}
查看完整描述

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

两个想法:

  1. 架构可能会受到可测试性的影响。注入使得测试类变得更加容易,因为可以注入模拟或存根。

  2. 假设过于严格的关系时要小心:发动机当然可以独立于汽车而存在,例如在工厂、修理店和回收中。轮胎等类似。(这就是为什么我不会像奥利维尔建议的那样将其设计为内部类。)


查看完整回答
反对 回复 2024-01-20
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

使用带有 DI 的那个。

至于类比;您的汽车是否负责制造发动机;在某些时候很难改变引擎。即使您不更改实际类型(例如,将天然气更改为电力),更改构造函数也会给您带来一些问题。

当然,汽车并不取决于发动机,反之亦然,具体的类型也是如此。

例如; 您可以拥有一辆带有虚拟发动机的展示模型车。或者超现代发动机的测试设施。

因此,如果可能的话:不要做 new(尤其是在使用接口时),而是使用 DI。尤其; 当您处理实际硬件时;-)


查看完整回答
反对 回复 2024-01-20
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

您可以使用嵌套类:


public interface IEngine

{

  void SomeMethod();

}


public class Car

{


  private class DefaultEngine : IEngine

  {

    void IEngine.SomeMethod()

    {

      throw new NotImplementedException();

    }

  }


  private readonly IEngine _engine;


  public Car()

  {

    _engine = new DefaultEngine ();

  }


  public Car(IEngine engine)

  {

    _engine = engine;

  }


}


查看完整回答
反对 回复 2024-01-20
  • 3 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信