当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 重构CollapsibleSplitter

ASP.NET
AspNetPager与Socut.Data使用方法
asp.net UpdaeProgress的简单用法
asp.net ajaxControlToolkit ValidatorCalloutExtender的简单用法
asp.net 简易生成注册码(数字+大小写字母)
asp.net中利用ashx实现图片防盗链代码
ASP.NET程序中常用代码汇总
ASP.NET 2.0/3.5中直接操作Gridview控件插入新记录
ASP.NET Ajax级联DropDownList实现代码
ASP.NET 2.0写无限级下拉菜单
asp.net Web Services上传和下载文件(完整代码)
asp.net DataGrid控件中弹出详细信息窗口
Asp.NET 多层登陆实现代码
利用Asp.Net回调机制实现进度条
ASP.NET Ref和Out关键字区别分析
Javascript调用Webservice的多种方法
.Net下的签名与混淆图文分析
.Net Compact Framework开发小技巧 推荐
.Net连接Oracle数据库的实现代码
js获取.aspx页面里面的服务器控件和.ascx中的服务器控件值
asp.net下 jquery jason 高效传输数据

ASP.NET 中的 重构CollapsibleSplitter


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 192 ::
收藏到网摘: n/a

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


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


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


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


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


  用了太多的switch、if语句,把面向对象的优点抛到爪哇国去了,看看这些代码吧。这是ToggleSplitter()方法里的代码,这个控件中还有很多这样的代码:

以下为引用的内容:

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...嵌套),有这样代码的方法还有三四个:

以下为引用的内容:

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像素”宽(或高)。