以Java语法为例,尽管问题本身与语言无关。如果以下代码段在方法MyAbstractEmailTemplate
中将对象setTemplate
作为输入参数,则类MyGateway
将与对象MyAbstractEmailTemplate
紧密耦合,从而减少了对象类MyGateway
的可用性。
折衷方案是使用依赖注入来简化MyAbstractEmailTemplate
的实例化。这可能会解决耦合问题
在某种程度上,但界面仍然僵硬,几乎没有提供足够的灵活性
其他开发人员/应用程序。
因此,如果我们只使用原始数据类型(甚至是Web服务中的普通XML)作为方法的输入/输出,似乎耦合问题不再存在。所以你怎么看?
public class MyGateway {
protected MyAbstractEmailTemplate template;
public void setTemplate(MyAbstractEmailTemplate template) {
this.template = template;
}
}
答案 0 :(得分:4)
很难理解你真正要问的是什么,但是将所有内容输入到Object 的路径并不会导致松散耦合,因为如果没有向下转换,你就无法对输入做任何事情,会打破Liskov Substituion Principle。
走极端,它会引导你到这里:
public class MyClass
{
public object Invoke(object obj);
}
这不是松散耦合,只是模糊且难以维护代码。
答案 1 :(得分:3)
名称MyAbstractEmailTemplate
让我相信你在谈论一个抽象类。
你应该始终对接口进行编程,因此它不是依赖于MyGateway
MyAbstractEmailTemplate
,而是取决于EmailTemplate
接口,其中{{1} }}。然后,您可以根据需要传递自定义实现,而无需进一步紧密耦合。
将它与DI相结合,你就得到了一个相当不错的解决方案。
不完全确定“界面仍然僵硬”是什么意思,但显然你应该设计你的界面,以便提供你需要的功能。
答案 2 :(得分:1)
MyGateway
必须假设有关输入的某些内容。即使它使用XML,也必须假设XML的结构和内容。耦合本身并不是一种邪恶;表达两段代码之间的契约。经常重复的避免紧耦合的建议实际上只是说耦合应该表达契约的本质,而不是更多而不是更少。传递特定类型(特别是接口类型)是实现这种平衡的一种非常好的方法。
答案 3 :(得分:0)
恕我直言,使用对象(小帽,而不是Object
s)作为方法参数和/或类成员没有任何内在错误。是的,这些创建了依赖项。您可以(至少)以两种方式管理:
答案 4 :(得分:0)
您将遇到的第一个问题是很多类型根本无法通过原始数据类型表示(这是一个基本类型的Java问题。)。
应使用适当的继承层次结构来减少耦合。什么意思合适?该方法应该将接口的那一部分作为需要的参数。不多也不少。
毕竟你将无法避免依赖。方法必须知道他们可以对他们的输入做些什么,或者必须能够做出关于输入功能的假设(参见C ++概念)。
答案 5 :(得分:0)