编码时,我经常遇到以下模式:
-A方法调用另一个方法(Fine),但被调用的方法/ callee接受参数,所以在wrap方法中,我传入参数。问题是,这种依赖性可以继续下去。我怎么能避免这种情况(赞赏任何示例代码)?
由于
答案 0 :(得分:3)
仅仅因为较低层组件需要它而传递参数是 Leaky Abstraction 的标志。它通常可以更有效refactor dependencies to aggregate services并隐藏接口背后的每个依赖项。
横切关注(通常是传递参数的最常见原因)是best addressed by Decorators。
如果您使用具有拦截功能的DI容器,您可以利用这些功能非常有效地实现装饰器(有些人将此称为容器的 AOP 功能)
答案 1 :(得分:2)
您可以使用依赖注入框架。其中一个是Guice:见http://code.google.com/p/google-guice/
答案 2 :(得分:2)
步骤1:不要将所有内容作为单独的参数传递,而是将参数分组到一个类中,假设是X.
步骤2:将getter添加到类X以获取相关信息。被调用者应该使用getter来获取信息,而不是依赖于参数。
步骤3:创建类X继承的接口类。将所有getter放在接口中(在C ++中,这是纯虚方法)。
步骤4:使被调用的方法仅依赖于接口。
答案 3 :(得分:1)
重构:引入参数对象
你有一组自然结合在一起的参数吗?
用物体替换它们。
http://www.refactoring.com/catalog/introduceParameterObject.html
参数对象的优点是,如果你添加/删除参数,传递它们的调用不需要改变。
(考虑到你的答案背景,我不认为IoC库或依赖注入模式真的是你所追求的)
答案 4 :(得分:0)
由于它们不能(轻松)进行单元测试,因此大多数开发人员选择将对象注入到视图中。由于视图(通常)不用于构建其他视图,因此您的DI链结束。您可能遇到问题(我曾经在ahwile中遇到过),您需要以正确的顺序构建对象,尤其是在使用像Unity这样的DI框架时,其中解决对象的attemt将会死锁。您需要担心的主要问题是循环依赖。为此,请阅读以下文章: