保留所有对象VS不要认准的事(Preserve Whole Object VS Don't

2019-07-29 06:46发布

我读福勒的重构书,看到保护区中的整体 。 不同的,新的观点说,这个重构是你应该做的完全相反: 清洁代码会谈-不要认准的事! 。

福勒也提到,你应该看看,如果该方法可以只被移动到使用参数的大名单中的类。 我认为这是唯一合理的选择。 这种重构似乎是一个创可贴一个不好界定方法。

福勒源材料有点过时。 是当时的智慧,让这种技术去渡渡鸟的方式或者是有实际当你想要做这种重构的情况? 还是我误解了测试驱动风格,因为这些例子处理对象构造,不是短信发送?

Answer 1:

有在面向对象设计的许多概念如看起来可能是类似的或矛盾在第一模式,原则和做法。 事实上,大多数人既不是类似的,也没有矛盾。 这使他们不同的和一致的东西是他们的意图。

当它们被作为一个相同的概念处理,但他们是在他们的意图和它们的本质不同发生保留中的整体重构,并在清洁码会谈视频中提到的Service Locator模式之间的矛盾似乎,。

保护区中的整体重构仅仅是用来使代码更易于阅读,理解并通过减少参数个数的功能维持的技术。 的服务定位器 ,在另一方面,是用于管理在使用控制概念的反转的系统的不同组件之间的依赖性的设计模式。 不同于保留其具有系统中的本地影响所有对象的重构技术中,被施加到系统(的函数)的一小部分,则服务定位器模式对系统全局效果并解决了更大的建筑问题( 依赖管理 )。

当使用保存中的整体重构?

使用preserve中的整体重构时,有两个或多个参数,其基本上都是一个对象的属性的功能,所以传递对象来代替。

有一个名为参数对象 (又名参数对象 )类似的概念( 引入参数对象重构 ),其中规定,如果你有一组不属于一个对象的属性,但在概念上是互相关联的或自然的参数一起去,包他们用自己的类,并通过该类的实例来代替。 将消息发送到一个对象时,它主要是用。

函数,函数的参数,第43页(罗伯特·马丁):从清洁代码 ,第3章引述:

参数对象

当一个函数似乎需要超过两个或三个参数,这可能是一些这些参数应该被包裹成一个自己的类。 举个例子,以下两个声明之间的区别:

 Circle makeCircle(double x, double y, double radius); Circle makeCircle(Point center, double radius); 

通过创建出他们的对象减少参数的个数可能看起来像作弊,但事实并非如此。 当变量组传递在一起,x和y的方式是在上面的例子中,它们是值得它自己的名字一个概念可能一部分。

当使用Service Locator模式?

使用Service Locator模式时,您的类有没有相关的概念依赖和你不希望你的类依赖于具体实现。 其实,这是当你想使用的任何依赖关系管理的方法。 另一种选择是依赖注入的做法,明确规定所有的依赖作为一个单独的参数构造函数。 而服务定位器通过在一个容器对象的所有依赖。 事实上,它是服务定位器模式和参数在作为混淆的源的单个对象相结合的保留所有对象的重构之间的这种非常相似。 依赖关系管理技术主要应用于对象的构造。

有优点和缺点,这是在讨论的依赖管理的两种方法控制容器和依赖注入模式的反转由Martin Fowler的文章。

当同时使用?

有时会出现在那里你的类将有两个或更多的概念相关的依赖情况,您可能希望他们在一个单一的对象结合起来,把它作为使用服务定位器的依赖。 所以,你可以看到这两个概念并不相互排斥。



Answer 2:

保留所有对象

优点

  • 使得代码更短,更为清楚。

缺点

  • 使界面更加compicated:

     void drawCircle(Point center, double radius); // in order to understand this method I should study the Point class 

    代替

     void drawCircle(double center_x, double center_y, double radius); // more verbose but makes explicit what you need to draw a circle 
  • 结果在测试样板代码,因为你需要创建和初始化虚拟参数对象:

     Point p = new Point(2,2); //boilerplate drawCircle(p, 2); 

    代替

     drawCircle(2, 2, 2); 
  • 产生额外的耦合,例如,抽屉和点之间。

    有一个很好的比喻,鼓励不这样做:你给收银员的钱,不是你的钱包:)。

摘要:

我保存对象,如果方法需要大量的它的数据。 在与点上面的例子中我可能会这么做,是因为点的东西相当原始。

否则,我更喜欢直接传递所需的参数或使用“引入参数对象”进行分组的参数的模式。



文章来源: Preserve Whole Object VS Don't Look For Things