On 9月22日, 上午8时07分, missdeer <missd...@gmail.com> wrote:
如果你能将这20万行代码重构成结构良好的代码, 比起重新做出来20万行结构好的代码, 对你的锻炼会更大 :)
我最近重构了 12万行代码 C/C++ (上面跑着25万行脚本), 其中部分代码良好, 部分代码较差, 现在重构基本做完了, 觉得还是挺挑战
的: 要在无法写出单元测试, 覆盖测试代码的基础上, 分离耦合, 提取模块, 同时让上面的脚本一直保持可以正确运行.
我只能当所有的 .cpp 是一个单元, 所有的上层脚本是我的测试代码了.
On Sep 22, 10:55 am, Tiny fool <tinyf...@gmail.com> wrote:
> 无法写出单元测试的情况下重构,确实可以表现你的功底,但是为了质量还是最好在单元测试的前提下重构吧
这个项目中, 面临的问题是, 程序结构太复杂, 已经理解不了了, 不但新功能很难加, 旧 bug 也很难调试了. 所以不得不大动干戈.
我的方法是分步走, 全局变量先弄成类静态变量, ok 了, 再转成普通成员变量, ok 了, 再看看要不要加访问控制. 改一点就编译跑一
跑, 好在现在的 cpu 比前几年快不少.
除了rename 重构在这个项目中远远不够之外, 其他几个方面, 我都同意你的看法.
这个项目中, 面临的问题是, 程序结构太复杂, 已经理解不了了, 不但新功能很难加, 旧 bug 也很难调试了. 所以不得不大动干戈.
我的方法是分步走, 全局变量先弄成类静态变量, ok 了, 再转成普通成员变量, ok 了, 再看看要不要加访问控制. 改一点就编译跑一
跑, 好在现在的 cpu 比前几年快不少.
我用 eclipse, 它的 c++ refactor 能力, 有一个是可靠的, 就是函数参数和变量的改名, 其余的功能都不可靠 :)
SlickEdit 的功能可靠吗 ?
> 最痛苦的事情莫过于C++的重构,很难有比较好的工具支持【顺便鼓吹一下SlickEdit,它支持C++重构】,而没有工具支持,纯手工重构不但效率低,还容易出错。据说由于C++的语法太丑陋和难于解析了,所以很难写出一个C++的重构工具。我用 eclipse, 它的 c++ refactor 能力, 有一个是可靠的, 就是函数参数和变量的改名, 其余的功能都不可靠 :)
SlickEdit 的功能可靠吗 ?
>
> SlickEdit也是改名可靠,别的用的少,不过到没有发现啥错误。会给一个预览界面让你看看重构是否正常。
On Sep 22, 8:30 am, sagasw <sag...@gmail.com> wrote:
> 对于这种代码我有一些办法也许你可以试试:
>
> 1,长函数分解,这种长函数往往是内部有重复代码或者功能很独立的代码,可以抽取或者合并成为一个新函数,小心一点做不会有什么问题。
>
> 2,函数参数合并,不需要修改太多,只要新建一个结构就可以,把那些参数都放进去。开始阶段先不要对函数个数、序列进行增减,只要让代码看着整洁就好,也是小心点做不会有什么问题。
>
> 3,新旧逻辑对比,某个比较独立的逻辑块可以把接口(不是interface,而是调用的entry)部分分成两块,先调用旧代码,然后调用你修改的代码,然后确保两块代码的返回值、修改值都是一样的,当然这是在这段代码不考虑性能问题的前提下。这是用旧代码检验新代码的一种方法,没有unit
> test的时候可以用它。
>
> 4,一直使用version control,保证可以时刻回溯代码修改。然后删掉不必要的函数、变量、参数、注释。
>
> 5,最为重要的一点,在修改之前应该征得你的team
> leader的同意和支持,否则出力不讨好。如果有比较熟悉代码而且愿意做代码重构的老同事,那就更好了,可以跟他们一起动手。
>
> -------------------------------------------
> 孙秀楠宝宝博客http://sunxiunan.com
> -------------------------------------------
>
> 2009/9/22 sagasw <sag...@gmail.com>
>
> > 都有类似的问题,哪怕是大师,也不是一下子就成为了大师,而是有个渐进的过程。
>
> > 最重要的一点建议:
>
> > 如果你觉得应该做,那么就从现在开始一点点的进行重构,看书学习只是开始,最重要的部分是动手。
>
> > 另外不知道你们这个项目有没有自动测试和单元测试,这些都是开发人员的好帮手,不花费测试组多少时间又能检验修改质量。
>
> > 2009/9/22 missdeer <missd...@gmail.com>
On Sep 22, 9:00 am, sagasw <sag...@gmail.com> wrote:
> Tiny的情况应该和作者的不太一样,关键问题不是技术,而是人。
>
> Tiny写的重构里面如何设计如何实现都是完全掌控的,客户方只是提出商业需求没有技术限制。
>
> 但是我看作者的描述,他在项目中应该只是一个程序员的身份,如何影响别人注意代码味道的问题,如何影响管理层让他们感觉到代码味道带来的后期维护代价,是比较有难度的。我的意见是不要改革要改良,针对他自己写的feature代码力争清晰简洁,修改其他bug时候相应的进行小范围代码重构,这样才能把风险降到最低。
>
> 代码坏味很难看,但是为了修改搞到自己饭碗危险那就不值了。
>
> 2009/9/22 Tiny fool <tinyf...@gmail.com>
>
> > 像极了我当年去XXX遇到的那个程序,呵呵
> > 这个故事详见:一个具体项目的重构(一)<http://www.tinydust.net/prog/diary/2004/09/blog-post_27.html>
> > ,一个具体项目的重构(二) <http://www.tinydust.net/prog/diary/2005/10/blog-post.html>
> > ,一个具体项目的重构(三)<http://www.tinydust.net/prog/diary/2005/10/blog-post_30.html>
> > 。
>
> > 当然我们的重构是把项目重新设计了一遍,而不是一般意义的代码级的重构。因为我们很多工程问题是由于要给略有不同的同类硬件产品设计PC客户端造成的。以前的实现方式是,一个新硬件产品,就从老的PC客户端代码改起,最后有无数的差异不大的PC客户端代码,里面充斥着各种谁也不知道的宏定义。新的实现方式是,把所有产品共有的界面逻辑和数据模型,放在一个exe里面,为每一款新产品设计一个dll插件,升级和新产品的主要工作就是设计和分发新的dll插件。
>
> > 2009/9/22 missdeer <missd...@gmail.com>
严重同意这句话啊,不过没机会了。自从去年PL去听了个微软的人讲,Bug过多的模块在微软就是推倒重来的,他就信仰这个了。
On Sep 22, 11:50 am, up duan <fixo...@gmail.com> wrote:
On 9月22日, 下午6时36分, missdeer <missd...@gmail.com> wrote:
> 我用Visaul Assist,基本可以忍受......
On 9月22日, 下午6时36分, missdeer <missd...@gmail.com> wrote:
On 9月22日, 下午6时36分, missdeer <missd...@gmail.com> wrote: