`
lane_cn
  • 浏览: 53688 次
社区版块
存档分类
最新评论

我对系统重构的理解

阅读更多

什么是重构

重构,用最简单的一句话说:就是要在不改变系统功能的情况下,对系统的内部结构进行重新调整。重构的最直接目的在于改进软件系统的内部架构。一个好的结构可以更加适应于需求的变化,更好的满足客户的需求,最大限度的延长软件系统的生命周期。

为什么要重构

在不改变系统功能的情况下,改变系统的实现方式。为什么要这么做?投入精力不用来满足客户关心的需求,而是仅仅改变了软件的实现方式,这是否是在浪费客户的投资呢?

重构的重要性要从软件的生命周期说起。软件不同与普通的产品,他是一种智力产品,没有具体的物理形态。一个软件不可能发生物理损耗,界面上的按钮永远不会因为按动次数太多而发生接触不良。那么为什么一个软件制造出来以后,却不能永远使用下去呢?

对软件的生命造成威胁的因素只有一个:需求的变更。一个软件总是为解决某种特定的需求而产生,时代在发展,客户的业务也在发生变化。有的需求相对稳定一些,有的需求变化的比较剧烈,还有的需求已经消失了,或者转化成了别的需求。在这种情况下,软件必须相应的改变。

考虑到成本和时间等因素,当然不是所有的需求变化都要在软件系统中实现。但是总的说来,软件要适应需求的变化,以保持自己的生命力。

这就产生了一种糟糕的现象:软件产品最初制造出来,是经过精心的设计,具有良好架构的。但是随着时间的发展、需求的变化,必须不断的修改原有的功能、追加新的功能,还免不了有一些缺陷需要修改。为了实现变更,不可避免的要违反最初的设计构架。经过一段时间以后,软件的架构就千疮百孔了。bug越来越多,越来越难维护,新的需求越来越难实现,软件的构架对新的需求渐渐的失去支持能力,而是成为一种制约。最后新需求的开发成本会超过开发一个新的软件的成本,这就是这个软件系统的生命走到尽头的时候。

重构就能够最大限度的避免这样一种现象。系统发展到一定阶段后,使用重构的方式,不改变系统的外部功能,只对内部的结构进行重新的整理。通过重构,不断的调整系统的结构,使系统对于需求的变更始终具有较强的适应能力。

拒绝变化 VS 拥抱变化

按照传统的软件设计方式,软件的生产分为需求调查、概要设计、详细设计、编码、单体测试、联合测试、现场部署几个阶段。虽说这几个阶段是可以互相渗透,但是总的来说是有一定次序的,前一个阶段的工作是后一个阶段工作的基础。这就向下面这样一种V形的模式:



往下的方向将系统进行分解,往上的方向将系统进行整合。这样的开发形式将软件开发分为设计前和设计后两个阶段,开发过程中存在一个重要的“里程碑”——设计说明书的。在设计说明书完成前,工程处于“设计”阶段,而在设计说明书完成之后,工程则进入“实施”阶段。一旦到了实施阶段,任何需求或者设计上的变更都是非常困难的,需要花费大量的成本。通常为了保证工程的顺利实施,开发人员常有这样一种冲动:按住客户的手,在需求说明书上签字。并且告诉客户:“从今天开始,任何需求变更都要停止,直到我们把现在这个东西做完。”这是一种拒绝变化的开发方式。

软件系统要保持与企业的目标一致。时代在发展,人们的要求在不断的提高,客户的业务在不断的发展。在这种情况下,传统的先设计、再施工的V形式已经不能适应日益复杂的业务需要。软件工程逐渐演化成下面这样的过程:



说明一下:
1、软件开发的目标要与企业目标保持一致,一个开发周期不宜时间过长,一般控制在半年到一年。系统部署后,并不意味着开发工作结束了,而是进入了下一个周期。

2、工程以循环迭代的方式前进,这并不意味轻视了设计,不是要搞边调研、边设计、边施工的“三边”工程,相反,是更加重视设计的地位。软件开发的全过程都需要设计,软件开发是“持续设计”的过程。同时,设计工作也不只是简单过程分解、任务分配,而是概念设计、逻辑设计、物理设计等各个方面互相交织、齐头并进。

传统的软件开发方式使用一种非常理想化的流程——先与客户讨论项目的范围,确定哪些需要做,哪些不需要做,然后规划一个完美的设计,不仅可以满足现在的需求,还能很好的适应未来的需求,设计完成后开始编码,然后测试组装,送到现场安装调试运行。这一系列过程就类似与发射一颗炮弹,首先要找到目标,然后根据地形、风力、目标的位置、移动速度等各种因素,计算提前量、炮弹发射的角度,计算出一个抛物线轨道,最后在合适的时间把炮弹发射出去。这一切都符合最正确的物理定律,一切都听起来很理想。如果没有意外条件,当然是可以击中目标的。但是炮弹一旦发射出去,一切就失去了控制,任何环境的变化都会造成偏离目标。尤其是对于一个运动的目标来说,计算过程十分复杂,很多情况下只能靠人估计。对于不规则的运动目标只能碰碰运气。这样的方式,命中率是很低的。

新的软件开发过程不追求完美的、长期的、理想的计划,更加重视实际情况,重视需求的变化,提倡采用短期的计划。这是一种拥抱变化的过程。就象是在炮弹上安装了一个反馈装置,锁定目标后,确保大方向的正确,然后就将炮弹发射出去。炮弹在运行过程中不断的将目标位置偏移量输入反馈电路,根据反馈输出调整自己的运行路线,无限的逼近目标。这样,炮弹就拥有了制导能力,命中率大大增加。

重构就可以增加工程的调整能力,他可以把产品回复到一个稳定的状态,可以基于这个状态达到下一个目标。如此反复前进,更好的满足客户的需求。

保持兼容性

重构的目的在于改变系统的实现方式,而不改变原有的功能。这个过程中,判断兼容性就十分的重要。一个子系统、模块、类、函数是否与升级前保持兼容,如何判断这个兼容性,如何保持这个兼容性,这关系到重构的成本和重构的可能性。

程序员学习写程序代码时,会发现随着程序代码愈来愈多,许多的程序代码不断重复出现和被使用,因此很自然的开始使用例程、子程序或是过程、函数等机制帮助我们进行程序代码整理的工作。于是很自然的,字体的分析方式演化成这个样子:将客户的需求过程进行分解,一步一步的分解,直到可以直接的实现他。这就是面向过程的分析方式。

面向过程的分析方式对变化的能力是很弱的。为什么呢?因为面向过程的分析方式很容易造成一种倾向——不区分行动的主体。一个过程是没有主体的,他不是在为自己工作,而是在为“别人”工作。当我们修改了一个过程之后,我们很难判断这个过程是否保持向后兼容,其他过程会不会受到影响。因为这个过程对外界有意义的不仅是他的输入和输出,还包括每一步过程,每一步过程都可能含有一个非常隐讳的业务意义,对外界产生影响。

因此,修改一个过程是非常困难的,通常升级一个面向过程的系统,可以采用两种方式:
1、写新的过程;
2、在原有的过程上加开关参数。

除此以外的升级办法都很难保证原过程和新过程的兼容性,容易造成错误。

为了更好的保证升级后模块的兼容性,应该采用面向对象的分析方式。按照这样的分析方式,一个对象为“自己”工作,他有完整的、独立的业务含义。对象之间通过接口发生联系,一个对象对外界有影响的部分只有接口,至于他做什么、如何做、做的对不对,则不是外界需要关心的事情。

判断一个接口升级后是否保持兼容性就是一件比较容易的事情了。我们可以判断接口的输入输出是否符合下面两条规则:
1、升级后的输入是升级前的输入的超级;
2、升级后的输出是升级前的输出的子集。

只要符合这两点,他就仍然可以在系统中运行,不会对其他对象造成危害。在实际的工程中,判断这个兼容性有一个更好的办法:自动化的单元测试

在重构的过程中,自动化的单元测试是非常好的保障。采用自动化的单元测试,不断运行测试,可以保证系统的结构改变的过程中,业务行为不发生改变。

分享到:
评论

相关推荐

    遗留系统重构与维护

    遗留系统的重构与维护是软件...对于遗留系统重构与维护课程讲义,除了上述提到的内容,还应该包含大量的实例、最佳实践、策略和技巧,以便于学习者能够更好地理解和运用重构与维护的理论知识,并将其应用于实际工作中。

    图书管理系统设计重构

    《图书管理系统设计重构》 本项目是一个基于Java的图书管理系统,旨在实现图书的日常管理功能,包括用户登录、注册、借阅与归还等操作。在设计过程中,开发者运用了三种设计模式,使得代码结构更加清晰,易于维护。...

    系统重构.pdf 侯捷

    - **定义**:系统重构是指在不改变软件外部行为的前提下,对其内部结构进行调整以提高代码质量和可维护性的过程。这一概念最初源于Smalltalk社区,并逐渐扩展到其他编程语言领域。 - **重要性**:随着软件项目的不断...

    软件重用-系统重构

    在IT行业中,软件重用和系统重构是两个关键的概念,它们对于提高开发效率、降低维护成本以及提升软件质量具有至关重要的作用。让我们深入探讨这两个主题。 **软件重用(Software Reuse)** 软件重用是将已开发的、...

    软件工程中的系统重构

    《软件工程中的系统重构》是一本深入探讨代码优化与结构改善的专业书籍。系统重构是软件开发过程中的一个重要环节,它关注于在不改变代码外在...因此,理解和掌握系统重构技术对于任何软件工程师来说都是至关重要的。

    大规模软件重用和系统重构课件

    在编程和软件开发领域,大规模软件重用和系统重构是两个至关重要的概念,它们对于提高开发效率、降低维护成本以及确保软件质量具有显著作用。在这个课件中,我们将深入探讨这两个主题,帮助学习者理解如何在实践中...

    33节点系统重构程序实现_33节点重构_33节点配电网重构_配电网IEEE—33_配电网_33节点

    在电力系统领域,33节点系统重构是一种针对配电网优化设计的方法,主要应用于小型到中型的配电网络。本文将详细解析33节点系统重构的实现过程及其在IEEE-33节点配电网中的应用。 首先,33节点系统通常代表一个具有...

    云原生背景下的系统重构.pdf

    综上所述,云原生背景下的系统重构是政府数字化转型的关键,它不仅关乎技术创新,更是推动公共服务现代化、提高治理效能的重要手段。通过理解和实践云原生理念,政府系统能够更好地适应不断变化的环境,为人民服务...

    JAVA系统重构

    ### JAVA系统重构知识点详解 #### 一、重构概念与起源 **重构定义**:重构是一种对现有代码进行改进的技术,其目标在于不改变程序外部行为的前提下优化内部结构,提高代码可读性和可维护性。 **起源与发展**:...

    一种可重构计算系统设计与实现

    为了更好地理解可重构计算系统的实际应用,以下是一个具体的实例分析: 假设我们需要设计一个用于实时图像处理的嵌入式系统。这个系统需要具备高速的数据处理能力和对不同图像处理算法的支持。传统的通用处理器可能...

    我经历的重构

    易度文档管理系统重构案例 - **初始状态**:基于Plone3开发的易度文档管理系统1.0版面临商业化限制和技术陈旧的问题。 - **决策过程**:决定放弃现有的1.0版本,转向全新的Zope3进行重构。 - **实施结果**:重构...

    可重构制造系统英文书籍

    可重构制造系统(Reconfigurable Manufacturing Systems,RMS)是一种先进的制造理念,它结合了灵活性、模块化和自动化,以适应快速变化的市场需求和产品生命周期的缩短。在本书中,作者深入探讨了这一领域的核心...

    收集的很好的MES系统入门资料,关于MES系统重构

    **MES系统重构:入门知识深度解析** MES(Manufacturing Execution System)系统,即制造执行系统,是企业信息化架构中的重要组成部分,它连接了企业的计划层(ERP)与生产层,实时监控并指导生产过程,确保制造...

    软件重构技术的本质

    重构(Refactoring,名词)是指在不改变软件可观察行为的情况下,对软件的内部结构进行改造,以提高其可理解和修改的便捷性。重构(Refactor,动词)则是指执行一系列这样的操作,以逐步改善代码质量。这种改变的...

    基于Xilinx SoPC的可重构嵌入式计算系统的研究与设计.pdf

    通过对重构过程的时间延迟进行精确测量,可以更好地理解该技术的实际效益。 #### 结论 本文提出的基于Xilinx SoPC的可重构嵌入式计算系统设计方法,不仅满足了高性能嵌入式计算硬件平台的需求,还展示了通过动态可...

    嵌入式系统硬件可重构-很好的资源

    首先,理解“嵌入式系统”至关重要。嵌入式系统是指集成在其他设备或产品中的专用计算机系统,它们负责特定的功能控制,如汽车的导航系统、手机的操作系统等。这些系统通常对实时性、功耗和成本有严格要求。 硬件可...

    基于FPGA的动态可重构系统设计与实现

    - **动态系统重构**:在系统运行过程中可以进行实时配置,支持局部或全局的重构。 其中,动态系统重构又可以进一步细分为**全局重构**和**局部重构**。 - **全局重构**:对整个FPGA或系统进行完整的重新配置,过程...

    重构技术—经典实例【影片租赁系统】

    重构是一个系统性的过程,通过改进代码设计,消除冗余,简化复杂度,使代码更易于理解和修改。它并不直接增加新功能,而是优化现有功能,为未来的扩展和改进奠定基础。 在.NET平台上,我们可以利用各种工具和库来...

    重构_重构_改善既有代码_

    重构的核心概念在于,当代码变得难以理解和维护时,我们需要对其进行整理和优化,使其更清晰、更简洁,同时保持原有的功能。这一过程包括识别代码中的坏味道(code smell)——那些表明代码可能存在潜在问题的迹象,...

    重构(Refactoring)英文版

    通过对这些案例的研究,读者可以更好地理解重构的实际操作方法,并将其应用到自己的项目中。 #### 七、重构与设计模式的关系 重构与设计模式之间存在着紧密的联系。设计模式提供了一套经过验证的解决方案集,而...

Global site tag (gtag.js) - Google Analytics