程序员如何才能提高自己?通过一次重构代码讲解自己的感受【有代码比较】

来源:互联网 发布:java程序员培训有用吗 编辑:程序博客网 时间:2024/05/16 07:32

大家是否还有印象, 伍华聪 曾经写了一篇文章 吉日嘎啦通用权限管理系统解读及重构升华--高度封装的编辑窗体 ,虽然我也是很顽固的人,其实这篇文章从另一个角度看待问题的话:

   1:伍华聪这个家伙蛮厉害的,看了我的架构半天不到,就找出了不少,页面中存在的问题,能理解别人的架构,而且还能找出别人架构里的问题,这是需要一个境界的。

   2:伍华聪不只是停留在找出问题上,而且还能有水平支出,这些问题如何修改,如何做才会更好,而且还能做出相应的例子程序来,这就是高手中的高手了。

 

  学习提高是无边无际的,学技术永远是学不完的,是因为有几百万人在研究技术,我们就把别人的技术成果学到死,也学不完的,所以需要提高的方向需要明确,就是提高我工作中需要的技术,我现在哪里做得还不够好?谁能帮助我实实在在的提高?谁能帮我解决眼前的问题?提高我需要提高的。

  A: 找到水平比自己高的人,同他成为好朋友,这个需要过程,而且需要寻觅好目标。

  B: 让高手指点你,指点你需要的东西,例如你写的代码,需要你有东西,然别人给你点评。

  

  其实,我当时就觉得人家写得非常,我就把这个事情先放在心上,仔细理解人家的精华,今天下午就动手改进了代码。

 

  问题一:

          _KeyDown 事件每个窗体里都写了重复的代码,100来个窗体,多出了上千行的重复代码。

  问题二:

          由于到处写了 _KeyDown 事件的代码,而且复制来复制去,修改来修改去,代码风格都不一致了,没有能统一。

  问题三:

          由于是好几年前,甚至是5-6年前写的代码,有些幼稚,虽然功能都是对的,但是现在回过头来看看,太嫩了。

 

  现在贴原先写的代码如下:

private void FrmRequestAnAccount_KeyDown(object sender, KeyEventArgs e)
        {
            
string keyCode = e.KeyCode.ToString();
            
switch (keyCode)
            {
                
case "Enter":
                
case "Return":
                    
if ((this.ActiveControl is TextBox) || (this.ActiveControl is ComboBox) || (this.ActiveControl is CheckBox))
                    {
                        
if ((this.ActiveControl is TextBox) && ((TextBox)this.ActiveControl).Multiline)
                        {
                            
return;
                        }
                        SendKeys.Send(
"{TAB}");
                    }
                    
break;
            }
        }


private void FrmItemsEdit_KeyDown(object sender, KeyEventArgs e)
        {
            
string keyCode = e.KeyCode.ToString();
            
switch (keyCode)
            {
                
case "Enter":
                
case "Return":
                    
if (this.ActiveControl is TextBox)
                    {
                        
if (!((TextBox)this.ActiveControl).Multiline)
                        {
                            SendKeys.Send(
"{TAB}");
                        }
                    }
                    
break;
            }
            
switch (e.KeyValue)
            {
                
case 46:
                    
// 删除按钮
                    
// this.btnDelete.PerformClick();
                    break;
                
case 116:
                    
// 点击了F5按钮
                    this.FormOnLoad();
                    
break;
            }
        }
private void FormWorkFlowActivity_KeyDown(object sender, KeyEventArgs e)
        {
            
switch (e.KeyValue)
            {
                
case 46:
                    
// Delete删除
                    this.btnDelete.PerformClick();
                    
break;
                
case 116:
                    
// F5刷新
                    this.FormOnLoad();
                    
break;
            }
        }
private void FrmDocumentAdd_KeyDown(object sender, KeyEventArgs e)
        {
            
string keyCode = e.KeyCode.ToString();
            
switch (keyCode)
            {
                
case "Return":
                
case "Enter":
                    
if (this.ActiveControl is TextBox)
                    {
                        
if (!((TextBox)this.ActiveControl).Multiline)
                        {
                            SendKeys.Send(
"{TAB}");
                        }
                    }
                    
break;
            }
        }

private void FrmOrganizeRoleAdmin_KeyDown(object sender, KeyEventArgs e)
        {
            
switch (e.KeyValue)
            {
                
case 116:
                    
this.FormLoaded = false;
                    
// 点击了F5按钮
                    this.FormOnLoad();
                    
this.FormLoaded = true;
                    
break;
            }
        }

private void FrmUserAdmin_KeyDown(object sender, KeyEventArgs e)
        {
            
switch (e.KeyValue)
            {
                
case 46:
                    
// Delete删除
                    this.btnDelete.PerformClick();
                    
break;
                
case 116:
                    
// F5刷新
                    this.FormOnLoad(true);
                    
break;
            }
        }

 

 

 改进过的代码如下:

 

        #region public virtual void Form_KeyDown(object sender, KeyEventArgs e)
        
/// <summary>
        
/// 按键事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        public virtual void Form_KeyDown(object sender, KeyEventArgs e)
        {
            
if (e.KeyCode == Keys.F5)
            {
                
// F5刷新,重新加载窗体
                this.FormOnLoad();
            }
            
else
            {
                
// 按了回车按钮处理光标焦点
                if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
                {
                    
if ((this.ActiveControl is TextBox) || (this.ActiveControl is ComboBox))
                    {
                        
if ((this.ActiveControl is TextBox) && ((TextBox)this.ActiveControl).Multiline)
                        {
                            
return;
                        }
                        SendKeys.Send(
"{TAB}");
                    }
                }
            }
        }
        
#endregion

 

 

   其中 virtual 表示,其他窗体里可以覆盖这个方法,写个性化的特殊事件处理。

   图解如下:  

    

 

表面上好用的东西,未必是代码写的好,运行正确的东西,未必是写得最精,错误的做法,自己未必能意识到,这时候需要高人来指点一下,总是自以为事不别别人放在眼里,很难提高自己,到处学一大堆没用的东西,未必能提高自己,只是眼界高了,功夫未必是高了。

 

在这里再次感谢伍华聪,你让我又提高了一点点,有时候高手也寂寞,因为没几个人能指点,没几个人能指出如何写代码会写得更好,能让我提高的,都是我的恩师。

 

曾经写代码,最愚蠢的地方是 string keyCode = e.KeyCode.ToString();, ToString() 脑子进水了,估计是那时候水平也不怎么样,现在改进过的代码,就没 ToString() 了。

 

 

 

将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。

posted on 2010-09-16 16:42 吉日嘎拉 不仅权通用权限 阅读(969) 评论(12) 编辑 收藏

评论

#1楼  回复 引用 查看    先强占个沙发!

2010-09-16 16:42 | 风也无奈      

#2楼  回复 引用 查看   

view source
print?
1do{
2    if (e.KeyCode == Keys.F5){this.FormOnLoad();break;}
3    if (e.KeyCode != Keys.Enter && e.KeyCode =!= Keys.Return)break;
4    if ((!this.ActiveControl is TextBox) && (!this.ActiveControl is ComboBox))break;
5    if ((this.ActiveControl is TextBox) && ((TextBox)this.ActiveControl).Multiline)break;
6    SendKeys.Send("{TAB}");
7}while(false);


减少if/else的嵌套,希望有帮助
2010-09-16 16:57 | 月照孤周      

#3楼  回复 引用 查看   

判断嵌套太多了,基本上控制在两层以内.
2010-09-16 17:19 | Cocoo      

#4楼  回复 引用 查看   

不建议缩短代码,可读性差.
引用月照孤周:
view source
print?
1do{
2    if (e.KeyCode == Keys.F5){this.FormOnLoad();break;}
3    if (e.KeyCode != Keys.Enter && e.KeyCode =!= Keys.Return)break;
4    if ((!this.ActiveControl is TextBox) && (!this.ActiveControl is ComboBox))break;
5    if ((this.ActiveControl is TextBox) && ((TextBox)this.ActiveControl).Multiline)break;
6    SendKeys.Send("{TAB}");
7}while(false);


减少if/else的嵌套,希望有帮助

2010-09-16 17:21 | Cocoo      

#5楼  回复 引用 查看   

@Cocoo
建议很好,但请按可读性好的方式来改进一下,如果使用多态请小心小类膨胀,如果使用委托请考虑定义出来的handler具有复用性
2010-09-16 17:37 | 月照孤周      

#6楼  回复 引用 查看   

// 按了回车按钮处理光标焦点
if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
{
if ((this.ActiveControl is TextBox) || (this.ActiveControl is ComboBox))
{
if ((this.ActiveControl is TextBox) && ((TextBox)this.ActiveControl).Multiline)
{
return;
}
SendKeys.Send("{TAB}");
}
}

不喜欢这段
至少在逻辑判断上出现了无效的分支
当ActiveControl是ComboBox的时候,白做了一个if判断是否是多行文本框
2010-09-16 18:20 | 徐少侠      

#7楼  回复 引用 查看   

引用月照孤周:
view source
print?
1do{
2    if (e.KeyCode == Keys.F5){this.FormOnLoad();break;}
3    if (e.KeyCode != Keys.Enter && e.KeyCode =!= Keys.Return)break;
4    if ((!this.ActiveControl is TextBox) && (!this.ActiveControl is ComboBox))break;
5    if ((this.ActiveControl is TextBox) && ((TextBox)this.ActiveControl).Multiline)break;
6    SendKeys.Send("{TAB}");
7}while(false);


减少if/else的嵌套,希望有帮助

看这个false的循环怪怪的
直接return似乎也可以
不过也有人不喜欢多个return
呵呵
2010-09-16 18:23 | 徐少侠      

#8楼[楼主]  回复 引用 查看   

@徐少侠
这个建议好
2010-09-16 18:37 | 吉日嘎拉 不仅权限管理      

#9楼  回复 引用 查看   

@徐少侠
一般对于if/else的重构:
一是OO的多态,
二是函数式的回调函数(委托),
三是switch,
四是如果if/else后可以直接退出方法体中,return是不错的选择,许多防御式编程都是这么做的,在本例中使用也无可厚非,但如果if/else后并不退出方法体,那么则应该将if/else的代码块再封装成一个返回bool的方法,在这个新方法中使用return,但这将失去对原有方法体内上下文的引用,如果将上下文作为参数,那么又显得足重脚轻时,不防试试do{}while(false)的方式,它将方法体中又创建了一个属于自己的代码块,且不失对上下文的引用
所以一切看应用场景,但作为程序员应了解相关处理手法,不能因为不习惯而拒之门外,我相信没几个人刚开始对设计模式中代码就啧啧称赞的,所谓的可读性部分取决于读代码人的水平
2010-09-16 21:54 | 月照孤周      

#10楼  回复 引用 查看   

吉日还是多贴贴你的项目管理经验吧.
2010-09-17 12:41 | Dreampuf      

#11楼  回复 引用 查看   

所谓的可读性部分取决于读代码人的水平

恩,强烈同意这点
2010-09-18 10:45 | 徐少侠      

#12楼  回复 引用 查看   

能坚持时时刻刻修改自己的代码真是不容易! 这篇文章说的这种方法对我来说是长见识了 谢谢了
原创粉丝点击