面向对象的三个特征是继承、封装和多态。学习完设计模式后,我们对继承有了一定的了解,接下来就是机房重构的学习了。在写代码过程中,我们会有意无意的用到封装,那么什么是封装?封装有什么好处?
我理解的就是将一段代码拿出来放在一个方法里并给这个方法起个名,需要这段代码时只需要叫这个方法的名就行,不必关心它的处理过程。在这里这个处理过程就被封装到了方法里。
至于这样做的好处,到现在会一目了然了吧。在代码量上:用到这个方法时不用复制代码了,哪里需要它就在哪里放它的名字就行,如果有参数的话,要给参数赋值(传参详见下篇博客)。在整体代码结构上:封装前代码只是为了特定的某个数据的处理,代码利用率低,封装后方法可以在需要的地方处理需要的数据,代码更灵活,利用率也高了。
大概了解封装方法后,我们就来看看它长什么样。在vb版机房收费系统的时候,我们的代码是这样的:
表查询:
Private Sub cmdcha_Click()
'清空表内容,保留表头
MSFlexGrid1.Rows = 2
'表连接
strSQL3 = "select * from line_info where cardno='" & Trim(txtkahao.Text) & "'" 'line??
Set mrc3 = ExecuteSQL(strSQL3, MsgString)
strSQL = "select * from student_info where cardno='" & Trim(txtkahao.Text) & "'and status='使用'"
Set mrc = ExecuteSQL(strSQL, MsgString)
'空值
If txtkahao.Text = "" Then
MsgBox "没有数据或卡号不存在", , "提示"
txtkahao.SetFocus
Exit Sub
End If
' 。。。。。。后面的逻辑省去了
End Sub
每个事件里用到了几个查询语句就放几个查询语句,以后再次用到时还得写,查询语句也仅限于对本次事件某些数据的处理。
在机房重构时我们的代码可能是这样的(DAL层):
//添加退卡记录
public int AddCancel(CancelInfo cancel)
{
string sql = "insert into T_CancelInfo(id,returncash,mid,ischeck)" +
"values(@id,@returncash,@mid,@ischeck)";
SqlParameter[] sp =
{
new SqlParameter("@id",cancel.id),
new SqlParameter("@returncash",cancel.returncash),
new SqlParameter("@mid",cancel.mid),
new SqlParameter("@ischeck",cancel.ischeck)
};
return SQLHelper.ExcuteNonQuery(sql, sp);
}
——————————————————————————(不在同一类里)————————————————————————
//删除商品
public int DeleteGoods(GoodsInfo goods)
{
string sql = "delete * from GoodsInfo where goodsname=@goodsname";
SqlParameter[] sp =
{
new SqlParameter("@goodsname",goods.goodsname)
};
return SQLHelper.ExcuteNonQuery(sql, sp);
}
由于有了分层的架构,不同的层又有不同的类,类里SQL语句放在了一起,根据功能封装成了不同的方法。在这里就用到了封装,每个查询都是一个方法,根据查询结果的类型,相应的方法要写成对应的类型,将执行结果通过return返回给方法。这样,方法就被完整的封装了起来,用的时候调用方法名(有参数的话需要给参数值)就可以了。
现在意识到了吧,在我们刚写DAL层代码时就用到了封装。是不是省了很多代码呢。
后续博客会详细讲解封装方法及参数使用。