Fork me on GitHub

代码中的坏味道

  写了半年的代码,对面向对象还是只有个初步的了解,还不能达到熟练运用的地步,但是从半年的编码中,隐隐约约感觉到影响代码结构的坏味道的代码。

  1. 首先就是重复代码,一个程序中重复代码过多,导致维护时一旦修改就需要将所有重复的代码都修改一遍。尤其是一些逻辑复杂的代码或者参数过多的代码,很容易出现某个个地方的修改不对或没有修改到等问题。
  2. 属性放置的位置不对,例如UpdateUI作为UI的控制器,直接将UI中的一个Window的Panel定义为UpdateUI的属性,虽然这样做在UpdateUI中很方便的就能操作Panel,但是UpdateUI作为整个UI的控制,并不一定只针对一个Window,如果UpdateUI控制多个Window,就会导致UpdateUI中属性过重,且大部分都是对当前Window没有用的属性。
  3. 类的职责定位不清晰,如Window用来构建窗口,那么关于业务的逻辑就不应该还放在UI(Window)中,例如开启统计的方法应该属于UpdateUI,Window的作用就是创建各种UI和保存子组件的引用。

  对应的措施如下:

  1. 重复的代码尽量提取到一个方法中,通过调用新加的方法来解决代码重复的问题;两个类中的有许多类似的方法,可以考虑将两个类抽象出一个公共的抽象父类,将重复的方法定义为父类的方法;如果两个类之间不是同一中类型,即不适合使用继承公共的抽象类,可以使用组合的方式解决重复代码的问题,比如A和B中都定义了a方法,且A中有B类的引用,可以调用A.a()的位置都修改为通过b.a()来替换,去掉A中的a方法。
  2. 移动属性,通过组合的方法,将属性移到具体对象的属性中,然后将原来直接使用该属性的地方修改为组合对象的新属性的get方法,如果存在给移动属性赋值的情况就使用组合对象的新属性的set方法。
  3. 将界面跟数据分开(MVC,听到的很多,其实理解不深),首先在Window类中,应该只有UI组件的定义、布局,具体的数据填充应该通过一个控制类来完成例如UpdateUI。Window类中包含了一个UpdateUI的实例,当操作Window中的控件,涉及到数据操作或者界面刷新时统一通过组合对象调用UpdateUI中的方法来实现,这样关于数据的处理(业务逻辑)始终只在UpdateUI中完成,将Window和数据分开了。Window相当于V,UpdateUI对应C。

  仅仅是我在重构项目的一些体会,没有什么条理,讲的也不太清晰,见谅。

posted @ 2015-01-21 00:43  瓘木  阅读(613)  评论(0编辑  收藏  举报