面向对象设计中有许多概念,例如模式、原则和实践,乍一看可能相似或矛盾。事实上,它们中的大多数既不相似也不矛盾。让他们与众不同而又保持一致的是他们的意图。
两者之间看似矛盾保留整个对象重构和服务定位器当将它们视为同一概念时,就会出现《清洁代码讲座》视频中提到的模式,尽管它们的意图和本质不同。
The 保留整个对象重构只是一种通过减少函数参数数量来使代码更易于阅读、理解和维护的技术。这服务定位器另一方面,是一种设计模式,用于管理系统中不同组件之间的依赖关系控制反转概念。不像保留整个对象对系统有局部影响的重构技术,应用于系统的一小部分(功能),服务定位器模式对系统有全局影响并解决更大的架构问题(依赖管理).
何时使用保留整个对象重构?
Use the 保留整个对象当函数有两个或多个参数时进行重构,这些参数基本上是一个对象的属性,因此请传递该对象。
有一个类似的概念叫做参数对象 (aka 参数对象) (引入参数对象重构 http://martinfowler.com/refactoring/catalog/introduceParameterObject.html)其中指出,如果您有一组参数不是一个对象的属性,但在概念上彼此相关或自然地组合在一起,请将它们用自己的类包装并传递该类的实例。它主要用于向对象发送消息时。
引用自干净的代码,第 3 章:函数、函数参数,第 43 页(Robert C. Martin):
参数对象
当一个函数似乎需要两个或三个以上的参数时,很可能其中一些参数
这些论点应该被归为自己的一类。例如,考虑
以下两个声明之间的区别:
Circle makeCircle(double x, double y, double radius);
Circle makeCircle(Point center, double radius);
通过创建对象来减少参数数量可能看起来像
作弊,但事实并非如此。当变量组一起传递时,x 和
y 在上面的例子中,它们很可能是一个概念的一部分,这个概念值得命名为
自己的。
何时使用服务定位器模式?
Use the 服务定位器当您的类具有概念上不相关的依赖项并且您不希望您的类依赖于具体实现时,请使用此模式。实际上,这是您想要使用任何一个的时候依赖管理接近。另一种选择是依赖注入显式指定所有依赖项作为构造函数的单独参数的方法。鉴于服务定位器将所有依赖项传递到一个容器目的。事实上,正是这种相似性服务定位器模式和保留整个对象将参数组合到单个对象中的重构会造成混乱。这依赖管理技术主要用于对象构造。
两种方法各有利弊依赖管理中讨论的控制容器反转和依赖注入模式 http://martinfowler.com/articles/injection.html马丁·福勒的文章。
何时同时使用两者?
有时会出现这样的情况:您的类将具有两个或多个概念上相关的依赖项,您可能希望将它们组合在一个对象中,并使用服务定位器。因此,正如您所看到的,这两个概念并不相互排斥。