随笔 - 89  文章 - 1  评论 - 261  阅读 - 16万

重构CollapsibleSplitter(1)

RssBandit项目中的CollapsibleSplitter作为Splitter控件的改进版,提供了我梦寐以求的功能:可以像Splitter控件一样分割两个相邻控件,允许在运行时调整他们的大小,还提供了单击时最小化指定控件的功能,并在小小的分隔条上画出了相当直观的精细图案。哦?你还没有这个控件,可以到这里找到它。

这个控件有不太令人满意的地方吗?嗯,有的。它永远只能有8个像素宽(纵向摆放的时候),不能将它设成Splliter默认的4个像素宽,也不能异想天开的将它设成16个像素宽。

打开CollapsibleSplitter的代码文件——我怎么闻到了一股不太美妙的气味呢?哦,那边Martin Fowler同志说了:这是代码的坏气味,该给它除除臭。

那么我们就来给它消除异味吧。

先来看看这个玩意到底有些什么坏气味:

  1. 用了太多的switch、if语句,把面向对象的优点抛到爪哇国去了,看看这些代码吧
    这是ToggleSplitter()方法里的代码,这个控件中还有很多这样的代码:
        
    代码1
     
    下面的是animationTimerTick()方法的代码(实际上还被俺去掉了几个if...else...嵌套),有这样代码的方法还有三四个:
        
    代码2
  2. 单个方法内代码行数太多,且代码重复率高,如同老婆子般絮絮叨叨、啰唆不清。我们来看看这些长方法的代码行数和重复率:
    • 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像素限制去掉。

那现在我们的除臭工作目标订好了,如下:

  1. 去掉这些讨厌的、丑陋的、像懒婆娘裹脚布般一层一层又长又臭的switch语句和if语句——即使不能完全去掉也应该把它们集合在一起,而不是到处分散;
  2. 去掉这些千篇一律的、到处一样的、牵一发全身不得不动的重复语句;
  3. 缩短这些个超过一屏的、洋洋洒洒的函数代码,把他们拆到多个方法里面去;
  4. 最后,我们希望想这个玩意大的时候它就大,想它小的时候它就小,而不是总是那“8像素”宽(或高)。

好吧,那我们就开始工作工作吧——还是下一篇文章再来吧,上班时间文章写得太长会被老板K的...

 

posted on   阿齐  阅读(2410)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
< 2007年4月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12

点击右上角即可分享
微信分享提示