Java 需要帮助改进紧密耦合的设计吗

Java 需要帮助改进紧密耦合的设计吗,java,junit,Java,Junit,我有一个内部企业应用程序(EJB2),它与某个BPM供应商一起工作。内部应用程序的当前实现涉及拉入仅由供应商的API公开的对象,并通过API中公开的方法对其进行更改 我在想,我需要以某种方式将一个内部对象映射到这个外部对象,但这似乎太简单了,我不太确定这样做的最佳策略。有人能解释一下他们过去是如何处理这种情况的吗 我想“黑盒”这个供应商的软件,所以我可以很容易地更换它,如果需要的话。从设计的角度来看,以某种方式将内部对象映射到这个公开的API对象的最佳方法是什么?请记住,我的内部应用程序仍然需要

我有一个内部企业应用程序(EJB2),它与某个BPM供应商一起工作。内部应用程序的当前实现涉及拉入仅由供应商的API公开的对象,并通过API中公开的方法对其进行更改

我在想,我需要以某种方式将一个内部对象映射到这个外部对象,但这似乎太简单了,我不太确定这样做的最佳策略。有人能解释一下他们过去是如何处理这种情况的吗

我想“黑盒”这个供应商的软件,所以我可以很容易地更换它,如果需要的话。从设计的角度来看,以某种方式将内部对象映射到这个公开的API对象的最佳方法是什么?请记住,我的内部应用程序仍然需要与API通信,因此两者之间会有一些依赖关系,但我希望减少这种依赖性,以便我也可以使用junit独立于此软件进行测试

谢谢, 杰森

抽象;实施将提供从内部到外部和背面的转换的


然后,如果您更换了供应商,那么您的内部将仍然很有价值,并且您可以更改供应商特定的代码;假设供应商提供相同的功能和相互关联的数据类型。

为服务层创建一个接口,在内部,您的所有代码都可以使用该接口。然后创建一个使用该接口并调用第三方api方法和作为api facade的类

i、 e

为第三方API提供接口总是一个好主意,这样你就不会让他们的恐惧侵入你的应用程序域,你可以根据需要进行交换。您可以创建另一个使用完全不同的服务的类实现

要在代码中使用它,只需调用

IAPIEndpoint endpoint = new MyAPIEndpoint(); // or get it specific to the lang you are using.

当你的东西跨越多个实现时,让它基于接口是一种方法。它也适用于TDD,因此您可以将接口换成本地测试接口,该接口可以完全独立于第三方api检查您的域代码。

我将是这里的害群之马,并支持这一原则。问题是,如果您现在做一个抽象层,它将看起来非常接近第三方API,它将只是一个冗余层。由于您现在不知道假设的未来第二个供应商的API会是什么样子,因此您不知道需要说明哪些差异,而且任何未来的端口都可能需要对这些不可预见的差异进行返工


如果您需要一个测试框架,我的建议是使用与BPM供应商相同的API创建您自己的测试实现。更好的是,几乎所有著名的API提供商都提供了某种沙箱模式进行测试。如果他们没有,你应该要一个。

谢谢Ryan,我认为这是有道理的。让我问一个问题以确保我理解:我可以使用这种方法并创建接口-在一个impl中,我可以调用第三方api,在另一个impl中,我可以调用api的测试impl,这样我就可以单独进行测试。对吗?我关心的是,当我必须调用API对象中的方法时,我将如何处理它们(主要是set/get,但也有一些方法)。Yeh找到共同点总是很棘手的。是的,接口描述了应用程序在所有实现中一致使用的内容(类使用接口或java世界中的impl)。我倾向于只将“泛化”的常用方法放在主界面中。然后,这些方法在实现中使用的任何特定api方法都可以为实现执行特定的方法。例如,这里有一个匹配服务器,我们为FindMatch()、StartMatch()、CloseMatch()等调用一个接口。这些都在接口中。然后在Gamecenter中…在该类的实现中,我们使用Gamecenter调用来获取匹配、启动匹配、关闭匹配,并有许多其他方法,这些调用将特定于Gamecenter作为私有方法使用。然后,我们可以轻松地与本地运行的测试实现以及另一个自托管的匹配服务器交换。因此,我们的三个第三方或唯一用途都是通过带有泛型调用的接口实现的。HTH接口在web服务服务器/客户机设置中也非常常见,其中所有代码可能不在客户机上,只需要存在接口和容器类。但最终发生的情况是,除非在供应商和应用程序之间存在一个正式的层,否则供应商通过类型和API行为的实现将开始进一步向上游浮现,然后它应该会出现。一旦您切换了供应商,您就开始意识到您与供应商实现的耦合程度;而抽象层迫使您首先考虑应用程序的需求;抽象掉供应商类型和API奇怪之处。我同意我通常不会这样做,除非我立即需要两个实现或一个web服务,我们试图限制客户端代码。但是对于测试和TDD样式是非常有用的。抽象最酷的一点是,你可以有一个ProductionThirdPartyAPI实现、一个测试实现和一个测试开发ThirdPartyAPI,这样你就可以交换开发和生产api层,这可能是值得的。除非应用程序中有某种特定的约束,下面的答案描述了抽象的标准方式(使用接口)。我相信你已经知道这一点,所以我很好奇你的应用程序中是否有任何特定的东西可能会使这一点变得困难。另外,我不想在这里重复,但是如果你想让它真正失去耦合,你可以使用Spring IOC而不是“new MyApidendpoint();”,我在寻找更多的证据来证明创建某种类型的外观是一种可行的方法。我也不知道为什么没有在这里完成,所以我觉得我错过了一些东西。Spring将是理想的,我希望在将来的某个时候将其迁移到该框架中
IAPIEndpoint endpoint = new MyAPIEndpoint(); // or get it specific to the lang you are using.