我认为问题是,您是否使用了合适的抽象。
在第一种情况下,我们有
interface IHasGetA {
IHasGetB getA();
}
interface IHasGetB {
IHasGetC getB();
}
interface IHasGetC {
ITransmogrifyable getC();
}
interface ITransmogrifyable {
void transmogrify(x,y);
}
其中main是type IHasGetA
。问题是:这种抽象是否合适。答案并不简单。在这种情况下,它看起来有些偏离,但这无论如何都是理论上的例子。但是要构造一个不同的示例:
main.getA(v).getB(w).getC(x).transmogrify(y, z);
通常比
main.superTransmogrify(v, w, x, y, z);
因为在后面的示例中都this
和main
依赖于类型v
,w
,x
,y
和z
。另外,如果每个方法声明都有六个自变量,则代码看起来并不会好得多。
服务定位器实际上需要第一种方法。您不想访问通过服务定位器创建的实例。
因此,“通过”对象可以创建很多依赖关系,如果它基于实际类的属性,则依赖关系就更大。
但是,创建抽象(即提供一个对象)完全是另一回事。
例如,您可能有:
class Main implements IHasGetA, IHasGetA, IHasGetA, ITransmogrifyable {
IHasGetB getA() { return this; }
IHasGetC getB() { return this; }
ITransmogrifyable getC() { return this; }
void transmogrify(x,y) {
return x + y;//yeah!
}
}
main
的实例在哪里Main
?如果类了解main
将依赖关系降低为IHasGetA
而不是Main
,则您会发现耦合实际上很低。调用代码甚至不知道它实际上是在原始对象上调用最后一个方法,这实际上说明了分离的程度。
您将沿着简洁而又正交的抽象路径前进,而不是深入到实现的内部。