rssbandit项目中的collapsiblesplitter作为splitter控件的改进版,提供了我梦寐以求的功能:可以像splitter控件一样分割两个相邻控件,允许在运行时调整他们的大小,还提供了单击时最小化指定控件的功能,并在小小的分隔条上画出了相当直观的精细图案。
这个控件有不太令人满意的地方吗?嗯,有的。它永远只能有8个像素宽(纵向摆放的时候),不能将它设成splliter默认的4个像素宽,也不能异想天开的将它设成16个像素宽。
打开collapsiblesplitter的代码文件——我怎么闻到了一股不太美妙的气味呢?哦,那边martin fowler同志说了:这是代码的坏气味,该给它除除臭。
那么我们就来给它消除异味吧。
先来看看这个玩意到底有些什么坏气味:
用了太多的switch、if语句,把面向对象的优点抛到爪哇国去了,看看这些代码吧。这是togglesplitter()方法里的代码,这个控件中还有很多这样的代码:
以下为引用的内容: 代码1 if(controltohide.visible) { if(useanimations) { if(parentform != null) { if(this.dock == dockstyle.left || this.dock == dockstyle.right) { } else { } } } else { if(expandparentform && parentform != null) { if(this.dock == dockstyle.left || this.dock == dockstyle.right) { } else { } } } } else { // control to hide is collapsed if(useanimations) { if(this.dock == dockstyle.left || this.dock == dockstyle.right) { if(parentform != null) { } } else { if(parentform != null) { } } } else { // no animations, so just toggle the visible state if(expandparentform && parentform != null) { if(this.dock == dockstyle.left || this.dock == dockstyle.right) { } else { } } } } |
下面的是animationtimertick()方法的代码(实际上还被俺去掉了几个if...else...嵌套),有这样代码的方法还有三四个:
以下为引用的内容: 代码2 switch(currentstate) { case splitterstate.collapsing: if(this.dock == dockstyle.left || this.dock == dockstyle.right) { } else { } break; case splitterstate.expanding: if(this.dock == dockstyle.left || this.dock == dockstyle.right) { } else { } break; } |
单个方法内代码行数太多,且代码重复率高,如同老婆子般絮絮叨叨、啰唆不清。我们来看看这些长方法的代码行数和重复率:
togglesplitter()方法,89行,其中重复的语句有
if(parentform != null),3处
if(expandparentform && parentform != null),2处
if(this.dock == dockstyle.left || this.dock == dockstyle.right),4处
if(useanimations),2处
animationtimertick(object sender, system.eventargs e)方法,114行,其中重复的语句有
if(this.dock == dockstyle.left || this.dock == dockstyle.right),2处
if(expandparentform && parentform.windowstate != formwindowstate.maximized && parentform != null),8处
onpaint(painteventargs e)方法,254行,其中重复的语句有
if(hot),4处
if(this.enabled),2处
switch语句(对一个参数进行判断),2处
臭味如此明显,更显除臭工作之必要,呵呵。那我们就开始伟大的除臭工作吧,还有呢,刚才说了“它永远只能有8个像素宽”,这个特性也不太好啊:对于视力好的人,这个分割条显得如此之大;而对于有点近视的人呢,它又显得如此之小。如此,我们自然应该把这个8像素限制去掉。
那现在我们的除臭工作目标订好了,如下:
去掉这些讨厌的、丑陋的、像懒婆娘裹脚布般一层一层又长又臭的switch语句和if语句——即使不能完全去掉也应该把它们集合在一起,而不是到处分散;
去掉这些千篇一律的、到处一样的、牵一发全身不得不动的重复语句;
缩短这些个超过一屏的、洋洋洒洒的函数代码,把他们拆到多个方法里面去;
最后,我们希望想这个玩意大的时候它就大,想它小的时候它就小,而不是总是那“8像素”宽(或高)。
新闻热点
疑难解答