程序员如何才能提高自己?通过一次重构代码讲解自己的感受【有代码比较】
2010-09-16 16:42 通用C#系统架构 阅读(2903) 评论(14) 编辑 收藏 举报大家是否还有印象, 伍华聪 曾经写了一篇文章 吉日嘎啦通用权限管理系统解读及重构升华--高度封装的编辑窗体 ,虽然我也是很顽固的人,其实这篇文章从另一个角度看待问题的话:
1:伍华聪这个家伙蛮厉害的,看了我的架构半天不到,就找出了不少,页面中存在的问题,能理解别人的架构,而且还能找出别人架构里的问题,这是需要一个境界的。
2:伍华聪不只是停留在找出问题上,而且还能有水平支出,这些问题如何修改,如何做才会更好,而且还能做出相应的例子程序来,这就是高手中的高手了。
学习提高是无边无际的,学技术永远是学不完的,是因为有几百万人在研究技术,我们就把别人的技术成果学到死,也学不完的,所以需要提高的方向需要明确,就是提高我工作中需要的技术,我现在哪里做得还不够好?谁能帮助我实实在在的提高?谁能帮我解决眼前的问题?提高我需要提高的。
A: 找到水平比自己高的人,同他成为好朋友,这个需要过程,而且需要寻觅好目标。
B: 让高手指点你,指点你需要的东西,例如你写的代码,需要你有东西,然别人给你点评。
其实,我当时就觉得人家写得非常,我就把这个事情先放在心上,仔细理解人家的精华,今天下午就动手改进了代码。
问题一:
_KeyDown 事件每个窗体里都写了重复的代码,100来个窗体,多出了上千行的重复代码。
问题二:
由于到处写了 _KeyDown 事件的代码,而且复制来复制去,修改来修改去,代码风格都不一致了,没有能统一。
问题三:
由于是好几年前,甚至是5-6年前写的代码,有些幼稚,虽然功能都是对的,但是现在回过头来看看,太嫩了。
现在贴原先写的代码如下:
{
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;
}
}
改进过的代码如下:
/// <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() 了。