- 浏览: 83542 次
文章分类
- 全部博客 (136)
- 我的技术资料收集 (98)
- 具体技术 (1)
- 的技术资料收集 (4)
- All Articles (1)
- 机器学习 Machine Learning (1)
- 网络编程 (1)
- java (2)
- ava (1)
- 零散技术 (1)
- C# (3)
- 技术资料收集 (1)
- CQRS (1)
- 数据库技术(MS SQL) (1)
- .Net微观世界 (1)
- Oracle SQL学习之路 (1)
- C/C++ (1)
- JS/JQ (1)
- Js封装的插件/实例/方法 (2)
- 敏捷个人 (2)
- Javascript (1)
- 程序设计---设计模式 (1)
- Bug (1)
- 未知分类 (1)
- 程序设计 (1)
- Sharepoint (1)
- Computer Graphic (1)
- IT产品 (1)
- [06]JS/jQuery (1)
- [07]Web开发 (1)
- .NET Solution (1)
- Android (3)
- 机器学习 (1)
- 系统框架设计 (1)
- Others (1)
- 算法 (1)
- 基于Oracle Logminer数据同步 (1)
- 网页设计 (1)
- 原创翻译 (1)
- EXTJS (1)
- Jqgrid (1)
- 云计算 (1)
最新评论
上个月个人有机会重构正在开发的一个系统代码,在完成后团队使用中还有效果的情况下,觉得有必要将总结一下。
简介
这个系统功能是一个工业设计软件,通过一些参数的配置,自动生成客户所需要的模型。采用C#开发,winform系统,该系统现为单机版,不存在服务端开发。其代码实现主要是模型生成,数据库参数读取都相对简单,现阶段代码量不是很大,配置界面大概有十个左右,业务操作代码估计有一万五左右吧。开发模式主要是敏捷开发,前期对系统进行简单设计,具体详细设计主要是由编码人员实现。
原因
- 由于该系统正在开发中,不易系统新增功能,甚至有些功能无法新增;
- 核心功能修改困难,只有开发自己可以修改;
- 该系统是公司计划的一个产品,产品负责人希望保证其质量;
- 团队技能提升方向。
处于以上原因,团队成员与团队负责人,产品负责人,以及请其他技术骨干人员,大家一起讨论觉得现阶段代码有必要重构。初步的计划是,不影响整体项目计划,我们原开发人员继续完成可以完成的任务,重构由团队负责人,与一C#技术资深人员(其他部门,十年左右开发)完成 。这里就有必要说说我们的这位团队负责人了,反正现在也不是我的主管了!):,他以前是做java的,自身对技术也比较感兴趣,现在刚刚做团队主管,经常把一些PMP中的原话搬出来,自己不负责开发,不做分析,不做设计,不写代码,但是在专案的过程中,经常对开发很感兴趣。
好了,还是言归正传,话说最后决定有这两位大神对系统进行重构,一位是相对我们这些全身投入的“猪”来说的“鸡”,一位是从其他部门调来的大神,每天支援我们专案半天左右。二位就开始了他们的重构之践,每天打电话请资深人员来我们办公室,二位在同一台电脑前,开始了结对重构,一个向另一个讲解专案需求,另一个向这个分析应该怎么设计,应该怎么实现。就这么一个知道需求,一个只懂技术的两个人一周过后,系统基本与原来一样。为什么会这样呢?最后还是我们团队负责人说,他每天要对另个人讲解需求,而且还包括部分行业知识,还不如他自己做呢,但他自己又对具体实现和C#不清楚,不明白不敢修改,而且还要不停的询问当时代码开发人员,效率效果都不好。
所以最终还是决定让我来重构,因为我对现阶段系统的实现都比较清楚,没有十分也有七分吧。我对当前的重构内容评估的时间七人天,最后给了我两周的时间,包括最后将现在开发的任务整合进重构后的系统代码中。
目标
由于是自己第一次正式的做重构,所以我当时给自己制定的目标是:
- 使该系统新增现功能方便;
- 处理当前系统难以修改的部分;
- 多向其他人员询问,这样是否可以易于编码?
步骤
这里就该主要的总结一下,自己在本次重构过程中究竟做了哪些了。这里有有必要说一下VS的一个快捷键 “CTRL +K,R ”,该快捷键帮助我找出一个属性,方法或者类在哪些地方被调用,对后面的重构省了很多功夫。而且有SVN版本管控使我很容易的找到上一个正确的版本,并比较修改了哪些代码。
步骤一:先找出系统中复杂度最高的几个类。
我的定义是修改最频繁,代码行数最多,其他类引用该类最多。初步划分下来主要有三部分,暂且定义为A、B、C吧。A为界面操作部分,B为A对应之业务操作类,C为另一主要业务部门,在编写代码中我主要负责的C中的部分实现。
步骤二:找到了需要重构的部分,接下来就要确定从哪里入手。
针对上面的ABC三部分,我第一感觉是将C排在了最后,因为当时主要是由我个人完成的,我对里面的代码质量还是有信心的(虽说最后仔细看代码结构还是不理想),而且每个人都不喜欢改自己的代码,认为修改即是对之前的否定,我个人心里也算有点这方面的意识吧,虽说一直在调整这种认识;第二觉得应该最先处理的是B部分,因为现有大部分新增功能都与B相关,而且认为B完成后也易于修改A部分。所以最终就从B部分开始啦!
步骤三:确定了具体从哪里入手后,就要彻底仔细分析该部分。
B部分复杂不是由于引用该类的地方多,直接引用该类只有A的主要一个界面,这里为什么说是直接引用呢?这就要提到A部分了,因为在A的主界面中B是作为一个公用属性,而且在主界面上new一个子界面时穿的参数是this——即主界面全部信息。好了还是说B吧,B复杂主要是由于修改频繁和代码行数较多,该类当时行数记得好像大概有近2000行吧,而且还在增加,修改频繁的主要是B里面的一个主要方法Mb,而且该方法基本上只有编写人员他一个搞的懂内部关系,其他人只能望文观止。
步骤四:具体做法。
我在重构的时候具体的方法大概有:由于没有测试代码,所以较小比较确定的修改只是保证其编译通过,就可以进行下一项了,较大的修改,就需要简单手动测试下。
- 去除一些无用的注释,例如当时开发人员注释掉的一些方法或段落,现在用不上的;
- 移除除没有被用到的属性,方法,类,以及一些空的cs文件。这里的类和cs文件可能是超前设计的产物;
- 只在该类中用到的属性,方法,降低起访问级别,改为private;
- 该类中修改最频繁的那个方法Mb,复制至新的类中,并取合适的类名称,连同其所有子方法,以及用到的属性字段。修改调用该方法的代码,使其使用新的类中的方法;
- 检查上面方法中的子方法与属性,原类中是否还有其他方法使用,若无直接删除,否则先暂时保留。分析有使用共同属性的方法与需要调整的方法Mb之间是否有联系;
- 去除掉与方法Mb相关的操作后,B类此时剩余代码大概就只有1000行左右。也就是每一个复杂的类里面总能找到一个与之对应的方法同样复杂;
- 接下来就是对方法Mb再一步进行重构,方法复杂主要是由于方法里面判断比较多,解决的方法就是用多态替换判断,将不同类型处理方式放在不同的类中,然后讲个方法改为一个工厂方法;
- 做完这些测试通过后,我觉得B部分就可以先放一放了,接下来就是A部分,因为AB关系较密切;
A的处理方式:
- 开与B中的基本相似,除去无用代码与注释
- 然后修改界面之间的传值问题,将this整个界面传递改为需要什么传什么
- 若子界面中的数据影响主界面,则用委托事件替代之前的直接调用主界面中的方法
- 建立每个子界面的业务操作类,从B中移除主要是数据读取
- 将每个界面上的数据新建一个对象,运用单例模式保存数据,减少之间的参数传递
- 子界面与子界面之间的关系都通过主界面间接触发
- 提取每个界面的公有接口,重置,保存,判断数据正确性,判断数据是否被修改
C的处理方式
C复杂主要是由于开始的时候只有一种处理方式CA,然后慢慢的又出现另一个处理方式CB。也就是之前只有一个一个基类CA,然后又加了一个基类CB,但是写CB这个类的人又是完全参照CA写的,造成二者间有许多重复的操作,而且为了模仿增加了一些不必要的操作。然后出现这种情况了,当时我们讨论尽然大部分一样那就在抽取一层CAB,是CA和CB分别继承CAB,好么,最后这样弄完以后就是全部代码在CAB类中大概有1000行左右,然后CA、CB有两三百行左右。
我的处理方式就是和其他人先讨论这两种处理方式,最后决定就使用CB这种方式,好,由于CA之前是我写的,CB是另外一人写的,但是我比较清楚。我就将CAB重写了一遍,去掉CA与CB,将类中的属性分离只另个类中,这个类的对象作为CAB的一个属性包含在内,方法里面的一些类型判断全部删除,留给子类自己处理,最后好像代码也只有三百多行似的。
现状
重构的任务当时也在两周之内完成,达到团队的预期把。距现在也有一个月时间了,在这一个月里代码中又新增了许多功能,工作中也发生了许多事。代码整体上还算整洁,每个类的代码基本上都还保持在500行左右,但是也有时常有需要改善的地方,我个人有个习惯,就是没事的时候看看自己别人写的代码,觉得需要调整的就调整了,觉得别人哪里写的不好的,也会找本人谈谈。我发现我们团队的主要问题是在完成功能时忽略代码质量,而且就算觉得部分代码放在这里或这样写不好,但是不知道应该放哪,这时在不知道的情况就只好暂且先这样,然后就是永远这样。个人觉得我们在面向对象中还是应该先做好类的封装,然后在谈继承多态,就像我之前介绍设计原则——单一职责,封装是最基础最实用,对封装性最直观的就是方法、类行数,以及类中的属性方法数量。
反思
其实写这篇博客的初衷,希望将自己重构的方法,以及对代码质量的认识分享出来的,但是写着写着就跑到记录上去了,唉又跑题啦!不过还好,这张的题目叫重构之践,多点实践,下次重构之见时再写个人的认识见解吧。
发表评论
-
C#WebBrowser控件使用教程与技巧收集--苏飞收集 - sufeinet
2013-06-28 12:07 1066原帖地址:http://www.cnblogs.com/suf ... -
我要喷一个自认为很垃圾的网站架构 - 老赵【苏州】
2013-06-28 12:01 1125原帖地址:http://www.cnblogs.com/lao ... -
[翻译] Oracle Database 12c 新特性Multitenant - Cheney Shue
2013-06-28 11:43 619原帖地址:http://www.cnblogs.com/ese ... -
memcahd 命令操作详解 - 阿正-WEB
2013-06-28 11:37 468原帖地址:http://www.cnblogs.com/azh ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 592原帖地址:http://www.cnblogs.com/ste ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 556原帖地址:http://www.cnblogs.com/ste ... -
RPG游戏之组队测试 - zthua
2013-06-27 10:22 556原帖地址:http://www.cnblogs.com/zth ... -
IT人们给个建议 - SOUTHER
2013-06-26 14:06 521原帖地址:http://www.cnblogs.com/sou ... -
Java向前引用容易出错的地方 - 银河使者
2013-06-26 14:00 491原帖地址:http://www.cnblogs.com/nok ... -
使用Func<T1, T2, TResult> 委托返回匿名对象 - 灰身
2013-06-26 13:54 798原帖地址:http://www.cnblo ... -
【web前端面试题整理03】来看一点CSS相关的吧 - 叶小钗
2013-06-25 10:45 781原帖地址:http://www.cnblogs.com/yex ... -
Windows 8 动手实验系列教程 实验6:设置和首选项 - zigzagPath
2013-06-25 10:27 616原帖地址:http://www.cnblogs.com/zig ... -
闲聊可穿戴设备 - shawn.xie
2013-06-25 10:21 561原帖地址:http://www.cnblo ... -
CentOS下Mysql安装教程 - 小学徒V
2013-06-23 15:24 606原帖地址:http://www.cnblogs.com/xia ... -
vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化) - skyme
2013-06-23 15:18 835原帖地址:http://www.cnblogs.com/sky ... -
之前专门为IE6、7开发的网站如何迁移到IE10及可能遇到的问题和相应解决方案汇总 - 海之澜
2013-06-23 15:12 946原帖地址:http://www.cnblogs.com/wuz ... -
Android学习笔记--解析XML之SAX - 承香墨影
2013-06-23 15:01 406原帖地址:http://www.cnblo ... -
SQL Server 性能优化之——T-SQL TVF和标量函数
2013-06-19 09:32 667原帖地址:http://www.cnblogs.com/Boy ... -
Nginx学习笔记(二) Nginx--connection&request
2013-06-19 09:26 662原帖地址:http://www.cnblogs.com/cod ... -
从郭美美霸气侧漏看项目管理之项目经理防身术
2013-06-19 09:20 497原帖地址:http://www.cnblogs.com/had ...
相关推荐
标题中的"【EMD重构】.rar"指的是包含EMD重构过程的压缩文件,而"EMD重构函数"是指在处理EMD分解后的IMF分量时使用的特定函数。"IMF变量重构"则是指将分解得到的各个IMF重新组合成原始信号的过程。"tomorrowi4n"可能...
这本书是每一位致力于提升软件工程实践水平的开发者,尤其是架构师的必读之作。 重构的核心概念在于,当代码变得难以理解和维护时,我们需要对其进行整理和优化,使其更清晰、更简洁,同时保持原有的功能。这一过程...
重构之所以重要,是因为随着软件系统的不断发展和演变,代码往往会变得越来越复杂和难以管理。如果不进行重构,随着时间的推移,这些系统可能会变成所谓的“遗产系统”或“技术债务”,这将导致开发新功能变得更加...
重构是软件开发过程中的一个重要环节,它涉及到代码的优化、设计改进和质量提升,而不改变程序的外部行为。本文将详细探讨重构的目的、对象、时机和方法,帮助开发者理解和掌握重构的核心理念。 **重构的目的(Why...
在本文中,我们将深入探讨基于Matlab的压缩感知(Compressive Sensing,简称CS)重构算法的实现。压缩感知是一种理论先进的信号处理方法,它允许我们以远低于奈奎斯特定理所要求的采样率捕获信号,并能恢复原始信号...
《代码重构》一书由Martin Fowler编写,是软件开发领域中关于代码质量提升的经典之作。书中详细阐述了重构代码的必要性、重构的时机以及如何安全地重构代码。重构指的是在不改变软件外部行为的前提下,改进其内部...
资源名:用于信号的EMD、EEMD、VMD分解_vmd重构_故障诊断emd_故障诊断_故障重构_VMD信号重构 资源类型:matlab项目全套源码 源码介绍:用于信号的分解、降噪和重构,实现故障诊断 源码说明: 全部项目源码都是经过...
重构.pdf_电子版_pdf版 本资源主要讲解了软件设计中的重构(Refactoring)概念,并提供了一个实际案例来演示如何通过重构来改进代码结构。 什么是重构? 重构是软件设计中一种重要的技术,它的目的是为了使代码变...
《重构与模式》是软件开发领域的一本经典著作,作者为Addison-Wesley Professional出版社。这本书主要探讨了如何在实际编程过程中有效地进行重构,并将其与设计模式相结合,以提升软件质量和可维护性。 重构是一种...
Java 代码重构经验分享 Java 代码重构是指在不改变外部行为的情况下,修改代码的内部结构,以提高代码的可维护性、可读性和可扩展性。本文总结了 Java 代码重构的经验和技术规范,包括重构要求、重构的工作、代码的...
重构之所以重要,是因为它能够帮助开发者逐渐摆脱历史遗留代码的束缚。许多经验丰富的开发者在完成项目后会发现,他们得到的代码虽然能够运行,但效率低下且难以维护和扩展。这种现象被形象地称为“代码的债务”。...
### Python 代码重构的艺术:探索自动化重构工具 #### 一、引言 Python 作为一门高级编程语言,自1991年首次发布以来,便以其简洁易读的语法、强大的标准库支持以及广泛的跨平台特性赢得了众多开发者的青睐。随着...
【软件重构】是一种重要的软件开发实践,旨在提升代码的质量、可读性和可维护性,同时保持软件原有的功能和外部行为不变。这一概念由 Martin Fowler 在他的著作《重构:改善既有代码的设计》中进行了深入阐述。重构...
重构是软件开发过程中的一个重要环节,它关注于改善已有代码的设计,以提高代码的可读性和维护性,同时保持原有功能不变。通过重构,程序员能够更有效地管理代码,提升开发效率,减少错误,并促进团队成员之间的沟通...
3. **清晰的代码**:重构的目标之一是提高代码的可读性,因此,每一次重构都应该使代码更加清晰明了。 4. **避免重复代码(DRY原则)**:如果发现重复的代码,应当通过抽象和模块化来消除。 5. **及时重构**:一旦...
《重构——改善既有代码设计》是软件工程领域的一部经典著作,作者Martin Fowler,该书与《设计模式》被并称为软件工程的双雄。《重构》一书的主旨在于向读者展示重构的过程与方法,即通过一系列小的、有步骤的改变...
重构是软件开发过程中一个至关重要的环节,它旨在不改变代码外在行为的前提下,改进代码结构,使之更易理解和修改。此书深入浅出地介绍了重构的概念、原则和实践方法,对于任何Java开发者来说,都是提升编码技艺的...
重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt
通过重构,我们可以逐步改进代码结构,使之更清晰、更易于理解和修改,从而提高软件的长期价值。 书中详细介绍了多种重构手法,这些手法涵盖了从命名改进到大型结构改造的各种情况。例如,"提取函数"是将一段重复的...