【问题标题】:How does an interface remove dependency from implementation?接口如何从实现中移除依赖关系?
【发布时间】:2021-03-02 03:50:24
【问题描述】:

我正在阅读鲍勃叔叔的清洁架构书。整本书的要点之一是你应该依赖抽象,而不是实现。

例如,他提到软件的较高层不应该知道较低层的任何内容(我同意)。他还指出,当较高层需要与较低层通信时,较低层必须实现较高层使用的接口。比如Use Case层需要调用Presenter层,就应该通过Presenter实现的接口OutputBoundary来完成,这样Use Case层就不依赖Presenter。如果在没有接口的情况下这样做,那真的很糟糕,因为 Use Case 层依赖于 Presenter 层。

这是真的吗?如果将来 Presenter 层需要用例发送更多或不同的数据,您不仅需要修改 Presenter,还需要修改 OutputBoundary 接口和用例。所以不,用例永远不会完全独立于 Presenter。

如果 Presenter 改变了他展示数据的方式,只是改变了方法的主体,那么用例层就不需要改变任何东西。如果 Presenter 通过更改方法声明来更改他呈现数据的方式,那么您是否有接口都无关紧要,因为您必须修改用例层中的方法调用。在这两种情况下,接口的使用都不重要。

这里有什么我遗漏的吗?我知道接口的用途,并且我知道如果您有或计划有多个演示者,那么让他们实现一个通用接口将是正确的方法,但即使这样我也看不到 独立于他在书中提到的较低层

【问题讨论】:

    标签: java oop interface architecture clean-architecture


    【解决方案1】:

    这是真的吗?如果将来 Presenter 层需要更多或 用例发送的不同数据,您不仅需要 修改Presenter,但是OutputBoundary接口和Use 案例也一样。所以不,用例永远不会完全独立 来自演示者。

    如果演示者层需要更多或不同的数据,则用例层必须更改以提供该数据。

    但是,如果您决定对表示层进行更改,或者将其替换为新技术,但信息相同,则无需修改用例层。

    与数据访问相同的想法,您使用接口,因此它取决于应用程序而不是相反,当您需要更改数据访问以使用不同的数据库技术时,只要您的数据访问层继续实现相同的界面,您无需在应用程序中进行更改。

    【讨论】:

      【解决方案2】:

      假设 Radio 是更高级别的软件,那么 Battery 将是较低级别的依赖。在现实生活中,Radio 与 Duracell 电池没有紧密耦合,您可以使用任何您想要的电池。

      举个C#的例子(抱歉,我没有安装Java编辑器,但是代码真的很简单):

      class Radio
      {
          private IBattery _battery;
      
      
          public Radio(IBattery battery)
          {
              _battery = battery;
          }
      
      
          public void TurnOn() 
          {
              _battery.GiveEnergy();
          }
      }
      
      
      interface IBattery
      {
          void GiveEnergy();
      }
      
      class Duracell : IBattery
      {
          public void GiveEnergy()
          {
              
          }
      }
      

      及用法:

      IBattery battery = new Duracell();
      var radio = new Radio(battery);
      radio.TurnOn();
      

      您的更高级别 - Radio 不依赖于较低级别 Battery 的实现。

      所以你可以使用任何你想要的电池。

      【讨论】:

        【解决方案3】:

        这是真的吗?如果将来 Presenter 层需要用例发送更多或不同的数据,您不仅需要修改 Presenter,还需要修改 OutputBoundary 接口和用例。所以不,用例永远不会完全独立于 Presenter。

        答案是肯定的和否定的 是的,这是真的,因为所有层都指向向内而不是向外 这使得基于接口/抽象的层之间的通信例如应用层将针对接口实现所有代码并且不知道该接口的实现但是由于较高层指向内部所以它将消耗较低层的接口然后实施它,答案是肯定的

        每一层都依赖于较低的一层,因此应用程序依赖于核心/实体 和基础设施取决于应用程序,但这是您的表示层中的技巧,您实际上将使用 DI 将每个接口的实现指向该接口,这将使它们仅在运行时相互依赖

        在这张图片中你可以看到每一层的方向

        如果 Presenter 改变了他展示数据的方式,只是改变了方法的主体,那么用例层就不需要改变任何东西。

        是的,因为来自应用层的数据仍然相同,但是如果表示层需要完全不同,比如说视图模型,那么应用层将不得不更改数据,这可能需要更改持久性/基础设施层,这将导致应用层接口的变化,持久化/基础设施需要实现!!!

        我实际上建议您观看 Jason Taylor 的视频 https://www.youtube.com/watch?v=dK4Yb6-LxAk

        如果您有任何问题,请告诉我

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-06
          相关资源
          最近更新 更多