【问题标题】:What is refactoring?什么是重构?
【发布时间】:2014-01-04 15:15:42
【问题描述】:

我到处都听到重构这个词。任何编程工具都有一些关于它如何帮助重构的废话,每个程序员或经理都会告诉我一些关于重构的事情。但对我来说,它仍然听起来像一个没有任何意义的神奇词。看来重构只是编辑你的代码还是什么?

维基百科引述

代码重构是一种“用于重构现有代码体、改变其内部结构而不改变其外部行为的纪律性技术”,[1] 旨在改进软件的某些非功能属性。优点包括提高代码可读性和降低复杂性以提高源代码的可维护性,以及更具表现力的内部架构或对象模型以提高可扩展性。

什么?每个(任何)人都明白这一点吗?那些跟我谈重构的人,真的是这个吗?

为什么是这个名字?那么什么是“分解”呢?

【问题讨论】:

  • 想想“重新设计”,让屏幕后面的东西看起来更流畅……在“重构”的程序员世界里。
  • 重构通常与重命名互换使用...重构变量就是在整个应用程序中更改其名称。关于 WP 引用:当您谈论重构别人的代码时,这绝对有助于提高可读性,我总是将变量重构为我理解的名称,以便我更容易阅读。
  • 例如,假设您有一个 1000 行长的函数。因此,您决定通过将计算 fudge 因子的部分移动到一个名为 calculateFudgeFactor() 的函数中并改为调用该函数来缩短它。您可以轻松地剪切文本,创建一个新函数,粘贴文本,然后从文本所在的位置调用该函数,或者您可以单击一个按钮,键入 calculateFudgeFactor 并点击 OK。重构正在改变代码的组织方式而不改变它的作用。
  • 是的,他们确实是这个意思,而且段落没有什么特别难的地方。把它分解。因式分解可能来自 Forth 对这个词的使用,顺便说一句。
  • 我强烈推荐 Martin Fowler 的书。它在改变我编码的书籍的简短列表中。

标签: refactoring


【解决方案1】:

重构是修改现有代码以提高其可读性、可重用性、性能、可扩展性和可维护性。你有没有看过代码并想,“哇,这真是一团糟”或“这可以做得更好”?当你开始清理代码并改进它的不同方面时,这被认为是重构。很多时候代码会经常重复,要求您创建抽象以遵守 DRY 原则,这是重构的另一个演示。在大多数重构过程中,重要的是不要破坏任何东西,这可以通过使用良好的单元测试来保证。

有时最好只是建立一些可以解决特定问题的工作代码。把它想象成一个草稿,它只是建立了基本的想法,让你思考手头的问题。在草稿完成后,您返回代码并对其进行编辑,进行改进以形成最终副本(重构)。您最终可能会收到需要进一步修改代码的进一步要求。此时循环重复。将最初的想法记录在代码中,然后重新审视代码并清理(重构)。

重构背后的主要前提之一是代码总是可以改进的。当您进行这些改进时,它会重构。

【讨论】:

    【解决方案2】:

    重构就是让你的代码更易于维护。

    实际上,软件的需求不断变化,导致软件不断变化。一段时间后,软件开始变得复杂。正如雷曼在他关于软件进化的出色著作中正确地说明的那样,“随着系统的进化,它的复杂性会增加,除非我们努力维护或减少它”。因此,我们必须定期降低软件的复杂性,这就是需要重构的原因。

    让我们考虑一个例子: 当一个类太大和/或太复杂时,就会出现模块化(或上帝类)设计气味不足的问题。如果您的设计中有这样的类,那么您将面临多个问题(例如可理解性差 - 您会发现难以理解您的代码,可靠性问题 - 由于类很复杂,您可能会错误地更改代码或更改某个方面导致另一个方面的错误)。因此,最好使用“Extract-class”重构等技术重构类。

    (有关“模块化不足”的更多信息可以在“重构软件设计气味”一书中找到)

    【讨论】:

      【解决方案3】:

      来自维基词典:http://en.wiktionary.org/wiki/refactor

      (计算)重写现有源代码,以提高其可读性、可重用性或结构而不影响其含义或行为

      “重构”也是 Eclipse 中工具菜单的名称。

      我将以Eclipse“Refactor”菜单下的工具为例来解释“Rename”Eclipse工具。

      在 Eclipse 中,您可以通过突出显示变量、右键单击并转到“重构”和“重命名”来“重构 -> 重命名”变量:

      它不是手动重命名每个变量,而是检测哪些变量引用同一个对象,因此您可以一次更改所有适用变量的名称:

      防止忘记重命名变量时发生的错误非常方便。

      【讨论】:

      • 感谢支持重构的工具……但工具与流程不同。
      • 我同意。我澄清了我的回答,这只是重构的一个例子,并不是所有的重构都是用工具完成的。
      • 仅仅因为 Eclipse 在“重构”菜单下有它并不意味着重命名变量就一定是重构。将 x 重命名为 y 不是重构,除非它改善了某些方面,例如可维护性。但是,如果您执行了足够多的重命名,并且这样做的方式对可维护性产生了可衡量的影响,那么您可以称之为重构。
      【解决方案4】:

      “重构是改变软件系统的过程,它不会改变代码的外部行为,但会改善其内部结构。这是一种清理代码的严格方法,可以最大限度地减少引入错误的机会。本质上,当你重构时,你是在改进编写代码后的设计。” - Martin Fowler(代码嗅觉之父)。

      一个重构的例子可以是提取方法(图 1):如果一个方法太长,它应该被分解,使用这种重构技术。找到一组可以很好地组合在一起的代码(在长方法中),创建一个具有描述性名称的新方法并将代码移动到新方法中。如果使用局部变量,则需要将它们作为参数传递。最后一步是向新方法添加调用并测试代码。

      虽然重构不会在软件系统中添加特性或功能,但它是开发人员进行维护活动的利器。它使软件系统更易于理解且修改成本更低,而无需通过更改其内部结构来改变其可观察的行为。

      根据 M. Fowler 进行重构的目的如下:

      1. 重构改进了软件设计
      2. 重构使软件更容易理解
      3. 重构有助于发现错误
      4. 重构有助于加快编程速度

      【讨论】:

        【解决方案5】:

        重构已经在以下链接中解释得很清楚:Refactoring: Guru。但是,为了快速概览,我们创建了一个有助于基本理解的图表 -

        【讨论】:

          猜你喜欢
          • 2013-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-14
          • 2015-09-15
          • 1970-01-01
          • 2012-01-26
          相关资源
          最近更新 更多