分开变与不变的代码
如今,面向对象编程已成主流。不过无论面向过程,还是面向对象,其共同的目标都是代码复用。但这种代码复用的理念我们到底能使其发挥到多大的程度呢?有些时候,我们做的并不够。
有些时候我们还是下意识地倾向于代码的复制与粘贴。就拿窗体中的一个“关闭”按钮来说,多数情况下,我们可能就下意识地写下下面的代码:
private void CloseButton_Click(object sender, EventArgs e)
{
this.Close();
}
如果你有10个窗体,可能你会写出十段与上面类似的代码。那么我们是否曾经想过要把这么一个“关闭”动作封装起来呢?创建一个新的CloseButton类:
class CloseButton : Button
{
public const string DEFAULT_NAME = "关闭";
public Form. TargetForm
{
get; set;
}
public CloseButton() : base()
{
this.Click += new EventHandler(CloseButton_Click);
}
protected void CloseButton_Click(object sender, EventArgs e)
{
if(TargetForm. != null)
TargetForm.Close();
}
}
如此一来,只需要向Form中拖入这个控件,然后设置TargetForm就行了,而这些并不需要去写什么代码。其实这做起来并不复杂,仅仅是把不变的代码封装起来以供后面使用,但有些时候我们脑子里似乎就是缺少这么一个闪念。当我在读《面向对象项目开发经验大成》这本书的时候,我突然意识到了这个问题。有时候我们仅仅是复用了.Net的控件,而对于业务逻辑的代码我们甚至是在不断重复着复制粘贴的过程,在UI中更甚。
鄙人曾经确实经历过复制粘贴之苦,在修改代码的时候很容易漏掉某些部分。现在回想起来,经历过这些教训确实对自己的提高有好处。如果能早一点意识到封装的思路,可能当初就不会那么痛苦了。