从案例深入了解如何重构代码-重构计划

项目名称A,某公司重点项目,已经正式上线运行几年了,公司业务遍布全球,很多国家都有办事处或研发部门,也就需要使用该系统。并且随着公司的不断发展,业务流程也在不断地完善和变化。

  技术上,项目是CS架构的,支持在线和离线两种操作方式,对于在线方式,数据访问是直连服务器上的Oracle数据库,离线的数据访问是连接本地的Access数据库;对于本地数据库,系统提供WebService来实现本地数据的同步。

  目前项目代码的规模已经达到100多万行,负责项目开发和维护是由同一个团对来承担,其中的开发和设计人员有10人,这些是项目的基本情况。

  项目存在的问题:

  1、维护工作量很大,这占用了差不多40%左右的时间,这主要是因为易用性差造成的,不过由于在以前的代码中把太多的逻辑放在UI层上,在业务复杂和界面都复杂的情况下根本不敢去修改,这就导致无法改善易用性。

  2、开发BUG很难减少,特别是做一些变更任务的时候,往往简单的修改会牵涉出很多BUG,这是由于项目代码混乱,复制的代码随处可见,导致变更分析很难做到全面。

  3、代码复用度低,导致每个版本的开发时间都比较长,而且,每次的版本开发都导致代码规模的暴增。

  4、从业务上说项目已经成熟,公司希望将项目产品化起来,并且在内部真正实现组件化(根据业务模块来划分模块,并像搭具木一块快速的组合与拆分)的架构方式。

  现有架构:

  项目在架构上根据业务划分成了几个子模块,下面是提取出来的三个模块,同时也表示出了模块之间的关系。

  

  在每个子模块中根据传统的三层模式来划分,不过层之间业务数据的体现都是以DataTable为核心。

  

  了解完上述这些后,不知道大家都有什么想法?反正对于我来说,这个过程现在想想都郁闷,从进入项目开始算起,花了三个月的时间才提出了最终的重构计划!

  1、在存在的问题、现有的架构、重构时间(1个半月的开发时间)和项目风险几方面的综合考虑制定了新的架构

  

  (看到上面这幅图后,有些人可能会坐不住了,觉得很平常化,没有任何高深或有新意的东西,就连基本的设计原则还都不符合,为什么不加入设计模式,例如:层次之间的利用接口隔离,数据操作类上可以使用工厂模式等等,其实这些并不是没有想过,去掉的理由很简单:初步重构老项目不要去理想化,它的首要目的是解决现有存在的问题,对于理想化的东西我们放到以后的持续重构中去实现。)

  2、选择重构的代码,100多万的代码不可能在一个半月内都完成重构,所以如何选择是个很重要的事情,上面三个模块中,销售模块的使用度最高,其中用户的问题反馈基本占了80%,代码规模处于平均阶段,综合这些考虑选择这块进行重构。那么其他模块怎么办?!采用当后期模块内有需求变更的时候,对于变更的内容采用新的架构来做,这样一步一步地达到目标。

  3、对选择模块的UI层,让BA、UI工程师和用户重新设计界面流程。

  4、对模块内部代码的变动制定详细的执行步骤,例如:先从业务层开始在类中新增对象属性和相关方法,接着利用属性消除DataTable,最后抽出UI层的业务规则等,并且要清楚工作之间的依赖程度,要做出串行和并行的任务,例如:上述步骤是需要串行的,而基础组件模块的重构是可以并行的,这样做是保证你对整个重构过程有很好的控制。

  5、接下来进入实质的编码阶段了。有个注意的地方,最好安排两个设计人员每天对修改的代码进行代码走查,以确保明天不要重构今天的代码。

  就这样团队整整辛苦了一个半月后,终于完成了重构!虽然现在的代码依然存在很多问题,但是至少我们让一直困扰的问题消失了,也许又会出现新的问题,为了避免这种情况,引入了敏捷开发中的过程-对于每个版本的持续重构!

http://dev.yesky.com/172/11321672.shtml

时间: 2024-11-10 01:23:17

从案例深入了解如何重构代码-重构计划的相关文章

代码重构(OOP)-小栗子(PyQt5)

主要是为了练习下 面向对象, 不断提醒自己代码一定要写成 营销风格, 和优雅. 最近在B站上看一下关于 Python GUI 编程的内容. 恰好呢, 前不久的一个 将本地 Ecxcel 数据 发布到 Tableau Server 中, 当核心接口搞定后, 工程化领导让弄 web, 我们果断拒绝了, 不太熟前端也暂时不想学, 就用 Python 自带的 Tk 模块来写一版, 涉及安全就不能共享出来, 总体蛮简单的. 后来, 倒是引发我对 gui 的一点小兴趣. 就没事看看 PyQt5 的内容, 没

step 1 代码重构

代码重构 代码重构介绍 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1  新建一个方法 ?                     新建方法 ?                     把要抽取的代码,直接复制到新方法中 ?                     根据需求调整参数 2  调整旧代码 ?                     注释原代码,给自己一个后悔的

【iOS开发-44】通过案例谈iOS代码重构:合并、格式化输出、宏变量、利用数组字典存储数据,以及利用plist的终极知识

首先我们今天的案例就是如下5个页面通过上一张下一张来切换: (1)第一步,基本是以很傻很直接的方式来创建,这里用到的主要点有: --把对象变量设置为全局变量使得可以在其他方法中调用来设置它们的属性 --设置了一个全局变量index,默认是0,然后通过增加减少这个index值并结合switch来调用不同的数据. --利用先调用一次change方法初始化页面,使得页面定格在第一帧. --利用按钮的enabled属性来设置按钮是否可以被点击,然后结合index的值分别在第1张和第5张时分别把上一张和下

代码重构(二):类重构规则(Swift版)

在上篇博客<代码重构(一):函数重构规则(Swift版)>中,详细的介绍了函数的重构规则,其中主要包括:Extract Method, Inline Method, Inline Temp, Replace Temp with Query, Introduce Explaining Variable, Split Temporary Variable, Remove Assignments to Parameters, Replace Method with Method Object等.关于

java代码重构的方法学习

2,8阅读 第一章  第一个案例 在此案例中使用了, 方法的提取(extract method),方法的移动(move method),临时变量的清除,变量及函数名重构,switch类型重构(replace type code with state/strategy)等. 重构使得代码功能更加好的被复用,偏于维护和修改. 注意: switch语句的属性尽量不要是另一个对象的数据,最好在自己的数据基础上进行 第二章 重构原则 何为重构:(名词)不改变软件可观察行为的前提下,提供可理解性,降低其修改

第四章:重构代码[学习Android Studio汉化教程]

第四章 Refactoring Code The solutions you develop in Android Studio will not always follow a straight path from design to finish. To be an effective Android programmer, you need to be flexible and refactor your code as you develop, debug, and test. In t

浅谈代码重构与优化

浅谈代码重构与优化 前几天看到有一篇不错的文章减少该死的if-else嵌套,觉得写得很不错,整理了一下后准备在团队内部简单分享一下. 写在前面 大家在接手项目的时候,应该有遇到过下面这种结构的代码 if (true) { ..... if (true) { if (true) { .... if (true) { if (true) { ...... } } // do something } // do something if (true) { ......... } } // do som

编程思想:巧用位运算重构代码

开篇 在一门编程语言中,往往会提供大量的运算符.按功能来分的话,有算术运算符.赋值运算符.关系运算符.逻辑运算符.位运算符等.这些对于大家来说都不陌生.但是,本期的主角『位运算』符相对而言是比较少去使用的.因为位运算符主要针对两个二进制数进行位运算. 巧用位运算能极大的精简代码和提高程序效率.所以,在一些优秀的开源代码中,经常能出现位运算.所以,把位运算这种思想迁移到业务代码里,有时候往往能起到柳暗花明般的重构. 位运算 在 JAVA 语言中,定义了诸多的位运算符,如下所示: 运算符 描述 &

Windows程序代码重构

代码重构:在程序功能实现之后,对代码进行一定规模的整理,使之符合"高内聚.低耦合"的软件设计原则,便于维护和使用. ①用函数封装消息处理代码--对Windows程序窗口函数中的每一个case程序段进行封装以形成一个消息处理函数,而在case中调用这个函数. ②利用数组或链表实现消息映射表进一步实现代码的隔离--因为窗口函数switch-case结构实质上实现的就是一个根据消息标识来查找消息处理代码的功能,故可以用消息映射表和一段查表程序来替代它,表中的每一项可以使用一个函数指针来指向消