zoukankan      html  css  js  c++  java
  • 重构实践者手记(20130517)

         手上有好几块代码,都是关于 ERP的,想把他们整合到一起去,搞一个功能更强大的软件.重构是我想到的第一途径,也是我目前所知的最快速的途径.为了保证重构的时候可以持续恢复源码,首先要做的就是进行版本控制.添加工程到SVN的服务器,这是为自己留后路的最好选择.然后做的就是正事了.


         首先看到的就是命名规范问题,老版本的窗体控件一律使用小写的 frm 作开头,虽然这不影响使用,但是为了统一全局的思想考虑,将其统统命名为 Frm ,逐一替换显然是不现实的,几百个窗体,这不是让人死么?两种方式:
         第一种是直接使用类似NotePad++,搜索工程文件中的所有frm,然后替换为 Frm.这个方法很方便,可以一次性替换掉所有的地方,但是带来的问题就是不知道是否有变量名称是以 frm 开头的,比如:
    1      frmLogin frml = new frmLogin ();
    如此,文本搜索替换可能会引起另外的命名问题.
         第二种是使用VS自带的重构功能,但是这个每次都只能对一个变量使用, frmLogin, frmMain, frmManage 每个窗体都要进行一次重构.但是好处是明显的,不会出现 第一种 所说的错误.
          很明显,使用第二种方式是最保险的,所以我决定每当看到或遇到一处命名不规范的地方时候再去进行重构,看不到的就先放在那里,反正整个项目都会过一遍,所有的不规范命名理论上都会被我去除.
     
         其次是缩进格式的问题,这个可以是使用缩进工具来排版,比如 AStyle.但是我个人感觉 AStyle的缩进虽然很规范,但是使用也是很麻烦的,还得下载安装,配置,最重要的是,Visual Studio的默认缩进和 AStyle 的缩进其格式不一致,导致你即使写的很漂亮的代码,用 AStyle 执行后又被改变一次.改来改去心情就被改糟掉了.放弃之.
         我现在采用的就是如果发现缩进不尽如人意的代码文件,首先 Ctrl + A,然后 Ctrl + X ,最后 Ctrl + V.全文剪切再粘贴,这个过程中 VS 会自动帮你排版,方便快捷,不用任何插件.
     
         然后是名称和注释.这两个放在一起,其实使用的手段还是重命名,目的就是不看注释也能理解 字段,方法,类名的作用或者意义.比如系统中有一个 SavePre() 方法,其实做的是 Validate 的事情,返回布尔值,判断当前需要保存的所有字段是否符合要求的格式,长度等. 那我们不如把这个方法重命名为 ValidateRecord(),这样只看方法名我们就知道其具体作用,十分直观. 命名为 SavePre() ,却会让人产生误解,以为是个事件,不明白其真实意图,需要去查看具体实现.虽然是小事,但是所有这种小事情上花费的时间算在一起却是非常可观的.
     
         一些编程方法的使用,也是很重要的.比如原先使用 try...catch...finally 包住的代码,现在可以使用 using 来处理,代码量少的时候,比try...catch...finally 更加优雅.再比如老式的C风格代码,喜欢返回数组,约定 hostInfor[0] 代表主机名称, hostInfor[1] 代表IP地址,  hostInfor[2] 代表MAC地址. 于是就有了这种函数:
    //...
    string[] = GetHostInfor(XXX);
    host.HostName = string[0];
    host.IpAddress = string[1];
    //...
    这种也是建议改掉,返回结构体,或者实体类对象(推荐),如是方显优雅:
    //...
    hostInfor = GetHostInfor(XXX);
    host.HostName = hostInfor.HostName;
    host.IpAddress = hostInfor.IpAddress ;
    //...
     
         偶得:Application.Exit();
         这个方法执行的效果是调用所有该进程中的Form的Close() 方法,其之后的代码仍然会被执行,而不是说程序直接退出.所以如果说想退出的话,要使用 Environment.Exit(0); 该方法直接结束程序所在进程.感觉有点暴力的话,就直接在 Application.Exit();后面进行 Return 好了.但是这样并不能保证程序一定退出.原因参考前面的解释.(如:在窗体的Close()事件中进行Cancel,窗体是关闭不了的.)
  • 相关阅读:
    Spring Boot中报错org.apache.ibatis.binding.BindingException: Parameter 'XXXX' not found. Available parameters are [0, 1, param1, param2]的解决办法
    CockroachDB学习笔记——[译]Cgo的成本与复杂性
    CockroachDB学习笔记——[译]如何优化Go语言中的垃圾回收
    解决Java中的HttpServletResponse中文乱码问题
    Spring Boot自定义Mapper的SQL语句
    Spring Boot设置定时任务
    Java8中List的removeif()函数的使用示例
    skip list跳跃表实现
    五分钟理解一致性哈希算法(consistent hashing)
    github 更新fork分支
  • 原文地址:https://www.cnblogs.com/woodywu/p/3084065.html
Copyright © 2011-2022 走看看