java—接口如何从实现中移除依赖关系?

jckbn6z7  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(284)

我正在读鲍勃叔叔写的《干净的建筑》一书。整本书的要点之一是,您应该依赖于抽象,而不是实现。
例如,他提到软件的高层不应该从底层知道任何东西(我同意这一点)。他还指出,当上层需要与下层通信时,下层必须实现上层使用的接口。例如,如果用例层需要调用presenter层,那么应该通过presenter实现的接口outputboundary来完成,这样用例层就不依赖于presenter。如果您在没有接口的情况下进行操作,那将非常糟糕,因为用例层依赖于presenter层。
这是怎么回事?如果将来presenter层需要用例发送更多或不同的数据,您不仅需要修改presenter,还需要修改outputboundary接口和用例。因此,用例从来都不是完全独立于演示者的。
如果演示者仅仅改变了方法的主体就改变了他呈现数据的方式,那么用例层就不必改变任何东西。如果演示者通过更改方法声明来更改他呈现数据的方式,那么您是否有接口就无关紧要了,因为您必须在用例层中修改方法调用。在这两种情况下,接口的使用都不重要。
这里有什么我不知道的吗?我知道一个接口的用法,我知道如果你有或计划有多个演示者,那么让他们实现一个公共接口将是正确的方法,但即使如此,我看不到他在书中提到的从较低层独立出来的独立性。

cgyqldqp

cgyqldqp1#

这是怎么回事?如果将来presenter层需要用例发送更多或不同的数据,您不仅需要修改presenter,还需要修改outputboundary接口和用例。因此,用例从来都不是完全独立于演示者的。
答案是肯定的,也不是肯定的,这是真的,因为所有层都指向内部,而不是向外,这使得层之间的通信基于接口/抽象。例如,应用层将针对接口实现所有代码,并且不知道该接口的实现,但因为更高的层指向内部,所以它将使用底层的接口,然后实现它,这使得答案是肯定的
每一层本身都依赖于一个较低的层,因此应用程序依赖于核心/实体,基础设施依赖于应用程序,但这里有一个技巧,在表示层中,您实际上将使用di将每个接口的实现指向该接口,这将使它们仅在运行时相互依赖
在这幅图中,你可以看到每一层的方向

如果演示者仅仅改变了方法的主体就改变了他呈现数据的方式,那么用例层就不必改变任何东西。
是的,因为来自应用层的数据仍然相同,但是如果表示层需要完全不同,比如说视图模型,那么应用层将不得不更改数据,这可能需要更改持久性/基础结构层,这将导致更改应用层中的接口,而持久性/基础设施将需要实施!!!
我真的建议你为jason ta看这段视频ylorhttps://www.youtube.com/watch?v=dk4yb6-lxak
如果你有任何问题,请告诉我

wpx232ag

wpx232ag2#

想象一下,收音机是更高级的软件,那么电池的依赖性就更低。在现实生活中,无线电没有紧耦合到杜拉塞尔电池,你可以使用任何电池你想要的。
让我用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 .
所以你可以用任何你想要的电池。

efzxgjgh

efzxgjgh3#

这是怎么回事?如果将来presenter层需要用例发送更多或不同的数据,您不仅需要修改presenter,还需要修改outputboundary接口和用例。因此,用例从来都不是完全独立于演示者的。
如果presenter层需要更多或不同的数据,那么用例层必须更改以提供该数据。
但是,如果您决定在表示层中进行更改,或者用新技术替换它,但是信息是相同的,那么您将不需要修改用例层。
与数据访问的想法相同,您使用接口,因此它取决于应用程序,而不是相反,当您需要更改数据访问以使用不同的数据库技术时,只要您的数据访问层继续实现相同的接口,就不需要在应用程序中进行更改。

相关问题