这两天移植了一个工具,原来是某个平台写的,也是用C++写的,然后移到MFC下面,比较蛋疼的事。这里YY一下移植的经验。
最开始的工作是,根据原来的界面先用MFC写出来,这一步基本不会去涉及原来工具的代码。中间本来想根据功能来,写一部分代码,移部分功能代码,但事实证明这是事倍功半,因为添加功能代码会让界面这部分代码变得复杂,让你考虑的东西更多,所以果断决定,先关注界面部分,这也是通常的将当前需要考虑的逻辑尽量规避,简单化,KISS原则。
整个界面OK了,下一步是将原有代码中的公用函数全导进我的工程里面去。嗯,但是这些代码该放到我这边什么地方?原来的代码有的放在.h里面的,而有的是局部在.cpp里面,为了便利一点,就全塞到一个工具类里面,我取名为CImportFuncs,不管是static还是inline什么的,都不会引起编译或者链接出错。所以这样可以一步到位,后面有些小问题,也很好的调整。这样做了过后,CImportFuncs做了一个全局变量,后面所有的访问这些函数都通过ImportFuncs().XXXFunc()。
注意:这一步过程需要边移植,边编译,这是一个迭代过程,直到公用部分移植完成。
最后是UI功能代码了,这个过程就是是一个迭代的过程。先以大功能为单位,大功能下化为UI单元来做。
先把类里面的成员变量移植过来,编译一下,没有错了,然后把原来的UI事件响应代码Copy到对应的响应地方,编译,改错。对于提示的错误,如果是公有部分,这个上面说过了。如果是引用的这个类的其他成员函数,那就将相应的也Copy到这个类里面来。直到可以编译连接成功,对于有的依赖关系很严重的,可以先只解决引用,而不加功能代码,让他编译和连接成功,然后执行验证一下。这个过程实际上是一个重构过程,可以不必过多的考虑原来的代码是怎样的,只要把错的地方等价的替换一下(这个过程里面我基本上是Copy代码,甚至过来的代码很多时候都不用看他到底干了什么,除非有的地方我重构了一下,需要考虑一下代码的拆分)。
注意:这一步的是移植,编译,执行,验证的迭代过程,一次一小点,切不可一次做得太多。在重构里面验证通常是事先做好的测试用例。我这里没有用到这个,直接执行程序,点一点,调一调,看看输出对不对= =。
嗯,就这么多了。
推荐一本关于重构的书籍:
重构:改善既有代码的设计
Refactoring Improving the Design of Existing Code
By Martin Fowler
很好的一本书。
阅读(2105) | 评论(0) | 转发(0) |