Interface 为什么要使用接口

Interface 为什么要使用接口,interface,Interface,我看到了接口的好处,能够通过契约添加新的实现 我看不出以下问题: 假设您有方法“startTransaction”的接口DB。 只要在MySQL、PostgreSQL中实现,一切都很好。但是明天您将迁移到mongodb,这样您就没有事务支持了 你是做什么的? 1) 空方法-不好,因为你认为你有事务,但你没有 2) 创建您自己的-然后您应该有一些参数,这些参数将不同于常规的“startTransaction”方法 除此之外,有时简单的接口根本不起作用。 示例:对于不同的实现,您需要额外的参数。您基

我看到了接口的好处,能够通过契约添加新的实现

我看不出以下问题: 假设您有方法“startTransaction”的接口DB。 只要在MySQL、PostgreSQL中实现,一切都很好。但是明天您将迁移到mongodb,这样您就没有事务支持了

你是做什么的? 1) 空方法-不好,因为你认为你有事务,但你没有 2) 创建您自己的-然后您应该有一些参数,这些参数将不同于常规的“startTransaction”方法

除此之外,有时简单的接口根本不起作用。
示例:对于不同的实现,您需要额外的参数。

您基本上是正确的,接口可能非常有用,但在(快速)更改代码时也会出现问题,使用接口的最佳做法是使它们尽可能小

当某些东西可以处理事务时,只为处理事务创建一个接口。将它们拆分为逻辑上尽可能小的部分,这样,当新类出现时,您可以为它们分配可以确定其方法的特定接口

对于多参数问题,这确实是有问题的,请查看您是否可以确定是否可以将此特定值移动到构造函数,或者指示您正在执行的操作确实与不需要此参数的操作明显不同


我希望这会有所帮助,goodluck

您是对的,接口用于通过合同添加新的实现,但这些实现必须具有一些相似性。 让我们举一个例子: 您不能使用人机界面实现dog,因为dog是一个有生命的有机体。
与您在这里尝试执行的操作相同。您尝试使用sql db实现来实现非sql db

如果您要在界面上公开事务的概念,那么无论发生什么,您都必须在功能上支持事务,因为界面的用户在逻辑上依赖于它。也就是说,如果调用方可以启动一个事务,那么他们希望也能够回滚多个查询的事务。由于Mongo本身没有任何回滚事务的概念,因此有两种可能性之一:

  • 您可以在代码中实现回滚查询的可能性,模拟本机不支持的数据库的事务功能。(这在Mongo是否可靠是一个有争议的话题。)
  • 您的接口在错误的抽象级别上工作。如果您的接口承诺了实现无法提供的功能,那么接口或实现都是不现实的

  • 在实践中,Mongo和SQL数据库是如此的不同,以至于如果不改变围绕它的大部分业务逻辑,就永远不会进行这种更改;或者,您只使用最小公分母接口来指定您的接口,而绝大多数情况下不会在抽象接口上公开特定于技术的概念。

    这就是所谓的接口隔离原则。如果您不仅拥有跨国数据库,则应将
    跨国
    方法移动到子接口
    接口事务数据库扩展数据库
    。有事务的数据库应该从
    trasaconationaldb
    继承,而不是直接从
    DB
    继承。重点是,我不能在Mongo中使用事务。如果接口隔离原则对我没有任何帮助,为什么还要使用它呢?Mongo将直接实现
    DB
    接口,而不使用与事务相关的方法。我的MongoDB版本不支持事务。正如我在回答中试图指出的,拆分接口,这样就不必实现事务功能。也就是说,ITransactable接口可以强制执行事务功能,而不是其他任何功能。这样,就不用为mongo数据库使用ITransactable了。是的,我看不出使用接口有什么好处。如果我有5个不同的支付提供商,它们都有不同的参数和逻辑,而且问题更大。我不同意这一点,每个支付提供商都有接口是有帮助的,这样你的方法就可以简单地强制一个类型,它是可接受的支付提供商之一。这样,您就不必关心正在使用的数据库是什么,而只关心其功能。这就是interfacesHm非常有用的地方,在现实世界中,支付提供商并不是什么都同意的——这只是在书中。事实上,一个使用某些支付代码,另一个使用其他代码。事实上,现实总是比书更复杂:)。但是你(我猜)有一些触发付款的方法,知道该项/类/某物支持的接口类型有助于确定使用(静态)switch语句执行的正确操作。我不认为这完全正确,你可以发送消息从非sql db和sql db检索相同的值,这取决于接口中定义的内容。但在大多数情况下,是的,您谈论的是根本不同的东西,您说的是,在代码中的任何地方,我都应该使用if语句检查db是否支持事务?那太糟糕了,对吧。我是说接口并不总是提供你想要的:)它取决于“你想要什么”。您当然可以定义一个同时覆盖Mongo和SQL数据库的接口,但它必须类似于
    storeData(数据);获取数据(id)
    ;i、 e.非常小的东西。如果您试图制作一个同时涵盖汽车和摩托车的界面,那么它可能只能是
    界面车辆
    ,而不是
    界面四轮车
    。问题在于如何使用它的细节,而不是界面的概念。我想要事务,如果我提供storeData,我将使用参数来提供事务支持。因此,问题在于是否处于“startTransaction”中