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

ASP.NET
ASP.NET在上传文件时对文件类型的高级判断的代码
JQuery运用ajax注册用户实例(后台asp.net)
Asp.net与SQLserver一起打包部署安装图文教程
asp.net 上传下载输出二进制流实现代码
asp.net(C#)解析Json的类代码
asp.net 截取字符串代码
asp.net ubb使用代码
asp.net XML文件操作实现代码
asp.net利用HttpModule实现防sql注入
ASP.NET(C#)中操作SQLite数据库实例
asp.net(c#)ref,out ,params的区别
asp.net(C#)防sql注入组件的实现代码
asp.net FCKeditor自定义非空验证
Asp.net TreeView来构建用户选择输入的方法 推荐
asp.net(C#)函数对象参数传递的问题
Asp.net中的GridView导出遇到的两个问题和解决方法
asp.Net 中获取一周第一天,一月第一天等实现代码
asp.net MaxLengthValidator 最大长度验证控件代码
C# 通用文件上传类
asp.net 自定义控件实现无刷新上传图片,立即显示缩略图,保存图片缩略图

ASP.NET 中的 重构CollapsibleSplitter


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 72 ::
收藏到网摘: 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像素”宽(或高)。