保留整个物体 VS 不寻找东西

2024-04-12

我在读福勒的重构书时看到保留整个对象 http://martinfowler.com/refactoring/catalog/preserveWholeObject.html。一种不同的、较新的观点认为这种重构与你应该做的完全相反:整洁代码讲座 - 不要寻找东西! http://www.youtube.com/watch?v=RlfLCWKxHJ0.

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

福勒的源材料有点过时了。流行的智慧是让这种技术走上渡渡鸟的道路还是实际上存在您想要进行这种重构的情况?或者我是否误解了测试驱动风格,因为这些示例涉及对象构造,而不是消息发送?


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

两者之间看似矛盾保留整个对象重构和服务定位器当将它们视为同一概念时,就会出现《清洁代码讲座》视频中提到的模式,尽管它们的意图和本质不同。

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马丁·福勒的文章。

何时同时使用两者?

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保留整个物体 VS 不寻找东西 的相关文章

  • 如何动态构造方法?

    我设计了一个类 它非常标准 具有一些方法属性 class foo def f1 self print f1 def f2 self print f2 def fn self print fn 现在我想创建一个包含一组 foo 实例的类 cl
  • 不在对象上下文中时使用 $this php

    我刚刚开始学习 php 中的 OOPS 我写了一个简单的程序来实现继承 当不在对象上下文中时 我收到 this 的致命错误 谁能解释一下这个错误 它是什么意思 这是我的代码
  • Python Tkinter OOP 布局配置

    我正在尝试使用 tkinter 构建一个应用程序 该布局在没有 OO 原则的情况下工作 但我很难理解应该如何将其转移到 OO The layout is as shown in the pic below 1280x720px 我有以下内容
  • 为什么c++中的构造函数不能声明为静态?

    我最近读完了第一卷 Bruce Eckel 的 Thinking in C 现在转向将这些知识应用到一些实际用途中 我最近正在使用静态成员函数 并尝试将构造函数设为静态 但编译器对此不满意 我查了书上的原因 但没有找到 谁能解释为什么 P
  • 如何让枚举存储每个条目的额外信息

    我有一组包含相关信息的项目 这些项目是由我 程序员 定义的 用户不需要更改它们 它们永远不需要根据配置进行更改 并且它们唯一可能更改的时间是在我的应用程序的未来版本中 我事先知道这些项目应该有多少 以及它们的确切数据是什么 枚举是一种很棒的
  • 如何使用类中的常量作为 php 函数中的参数定义?

    我有一堂课 class FetchMode const FetchAll 0 const FetchOne 1 const FetchRow 2 和一个函数 function getRecordSet FetchMode FetchMode
  • 使用 shoulda 重构 Rails 模型上的 rspec 测试

    了解后应该匹配器 https github com thoughtbot shoulda matchers通过回答关于属性可访问性测试的另一个 StackOverflow 问题 https stackoverflow com a 11849
  • 如何从类外部更改公共 R6 类方法?

    我希望能够在我的 R6 类中重新定义公共方法 以便它根据该类保存的数据类型进行更改 如下所示 library R6 Simple lt R6Class Simple public list dt mtcars my print functi
  • 依赖注入系统中的事件朝哪个方向发展?

    上或下 我是一个非常注重视觉的人 我将我的应用程序视为一个层次结构 顶部是根 底部是叶子 我还了解到 在 DI 系统中 容器不知道其所包含对象的职责 功能 相反 所包含的对象知道它们的上下文 因为上下文 依赖项 被注入 UP 非 DI 方式
  • 工厂模式和策略模式

    我需要创建一个类来负责结果集处理 但可能会发生应该使用不同的算法来处理该结果集的情况 我知道以下选项 1 使用策略模式 伪代码如下 interface Strategy processResultSet ResultSet rs class
  • 这是依赖注入吗?这是一种不好的做法吗?

    我有一个小框架 我是这样编码的 我不确定这是否称为依赖注入 我不知道它是否像设计模式 我也不知道并且想知道是否通过 this因为 param 是一种不好的做法 看看这个 不是一个有效的示例 只是将这些代码写入浏览器中以供解释 This is
  • 检查一个类是否是另一个类的子类

    我想在不创建实例的情况下检查一个类是否是另一个类的子类 我有一个类 它接收类名作为参数 作为验证过程的一部分 我想检查它是否属于特定的类系列 以防止安全问题等 有什么好的方法可以做到这一点吗 is subclass of http php
  • 过程式编程与 OOP 的开发成本?

    我有相当深厚的 OO 背景 OOD 和 OOP 的好处对我来说是第二天性 但最近我发现自己在一家与过程编程习惯相关的开发商店 实现语言具有一些 OOP 功能 但它们没有以最佳方式使用 更新 每个人似乎对这个话题都有自己的看法 我也是如此 但
  • R 中使用 `UseMethod()` 与 `inherits()` 来确定对象的类

    如果我需要根据 R 对象的类以不同的方式处理它们 我可以使用if and else在单个函数内 foo lt function x if inherits x list Foo the list else if inherits x num
  • 什么是对象序列化和反序列化?

    什么是对象序列化 and 反序列化 序列化与读取对象的属性 然后用它们填充 DataRow 的列 最后将 DataRow 保存在数据库中等普通技术有什么区别 序列化通常是指创建可用于存储 可能在文件中 通过网络传输或仅用于进程之间传输的数据
  • 为什么需要在 Python 方法中显式使用“self”参数? [复制]

    这个问题在这里已经有答案了 当在 Python 中的类上定义方法时 它看起来像这样 class MyClass object def init self x y self x x self y y 但在其他一些语言中 例如 C 您可以使用
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • 在方法内部执行方法

    我目前正在 FreeCodeCamp 中进行 JavaScript 练习 我的代码应该使用的测试用例之一是函数调用 如下所示 addTogether 2 3 这是我得到的基本功能 function addTogether return 当我
  • 使用超类初始化器初始化类

    我有两个类 一个是另一个的子类 比如说Animal and Dog 超类有一些初始化器 比如initAnimal 子类有一些初始化器 比如initDog 问题是 从编译器的角度来看 做类似的事情是完全合法的Dog adog Dog allo
  • Oo 任何 IDE 中的 javascript 代码补全

    你知道有什么IDE可以自动完成这种代码吗 我这里有一个 javascript 类生成器 function var core bind function method scope if method instanceof Function t

随机推荐