Oop 保留整个对象与Don';不要找东西

Oop 保留整个对象与Don';不要找东西,oop,refactoring,Oop,Refactoring,我在读福勒的重构书,看到了。另一种新的观点认为,这种重构与您应该做的恰恰相反: Fowler确实提到,您应该查看该方法是否可以移动到使用大量参数列表的类。我认为这是唯一合理的选择。这种重构似乎是一种定义不好的方法的辅助工具。 福勒的原始资料有点过时。流行的智慧是让这种技术走上渡渡鸟的道路,还是真的有这样一种情况下你会想要进行这种重构?或者我误解了测试驱动风格,因为这些示例处理的是对象构造,而不是消息发送?在面向对象的设计中,有许多概念,例如模式、原则和实践,一开始可能看起来相似或矛盾。事实上,它

我在读福勒的重构书,看到了。另一种新的观点认为,这种重构与您应该做的恰恰相反:

Fowler确实提到,您应该查看该方法是否可以移动到使用大量参数列表的类。我认为这是唯一合理的选择。这种重构似乎是一种定义不好的方法的辅助工具。


福勒的原始资料有点过时。流行的智慧是让这种技术走上渡渡鸟的道路,还是真的有这样一种情况下你会想要进行这种重构?或者我误解了测试驱动风格,因为这些示例处理的是对象构造,而不是消息发送?

在面向对象的设计中,有许多概念,例如模式、原则和实践,一开始可能看起来相似或矛盾。事实上,它们大多数既不相似也不矛盾。让他们与众不同和一致的是他们的意图

在Clean Code Talks视频中提到的保留整个对象重构和服务定位器模式之间似乎存在矛盾,当它们被视为同一个概念时就会发生,尽管它们的意图和本质不同

保留整个对象重构只是一种技术,通过减少函数的参数数量,使代码更易于阅读、理解和维护。另一方面,服务定位器是一种设计模式,用于使用控制反转概念管理系统中不同组件之间的依赖关系。与保留整个对象重构技术不同,重构技术对系统具有局部影响,应用于系统的一小部分(功能),而服务定位器模式对系统具有全局影响,并解决更大的体系结构问题(依赖关系管理)

何时使用保留整个对象重构? 当一个函数有两个或多个基本上是一个对象属性的参数时,请使用保留整个对象重构,因此请传递该对象

有一个类似的概念称为参数对象(也称为参数对象)(),它指出,如果有一组参数不是一个对象的属性,但在概念上彼此相关或自然地结合在一起,则使用它们自己的类包装它们,并改为传递该类的实例。它主要用于向对象发送消息时

引用干净代码,第3章:函数,函数参数,第43页(Robert C.Martin):

参数对象

当一个函数似乎需要两个或三个以上的参数时,很可能 这些论点应该被包装成它们自己的一类。例如,考虑一下 以下两种声明之间的差异:

Circle makeCircle(double x, double y, double radius);
Circle makeCircle(Point center, double radius);
通过从参数中创建对象来减少参数的数量 作弊,但事实并非如此。当变量组一起传递时,x和 在上面的例子中,它们很可能是一个概念的一部分,应该给它起个名字 拥有

何时使用服务定位器模式? 当您的类具有概念上不相关的依赖项并且您不希望您的类依赖于具体实现时,请使用服务定位器模式。实际上,这是您想要使用任何依赖关系管理方法的时候。另一种替代方法是依赖项注入方法,它将所有依赖项显式指定为构造函数的单独参数。而服务定位器在单个容器对象中传递所有依赖项。事实上,正是服务定位器模式与保留整个对象重构(将参数组合到单个对象中)之间的这种相似性造成了混淆。依赖关系管理技术主要用于对象构造

Martin Fowler在文章中讨论了这两种依赖关系管理方法的优缺点

何时同时使用两者?
有时会出现这样的情况:您的类将有两个或多个概念上相关的依赖项,您可能希望将它们组合到一个对象中,并使用服务定位器将其作为依赖项传递。因此,正如您所看到的,这两个概念并不是相互排斥的。

谢谢您详细而有用的回答。这是一个很好的解释,我的工具包有两个新的模式:)cheers.PWO和SL是两个不同的东西。“干净的代码会说话——不要找东西!”不会触及任何与保留整个对象模式相关的内容。