关于对象数据封装的一点感悟

        众所周知,面向对象编程的三大特征是继承、多态和数据封装,对这个是早已烂熟于心了,但是在具体的代码编写中总是抛之于九宵之外,唉,记性不好。。。

        最近在做一个资源管理器,其中有一个字段是保存当前的目录的,就叫它CExplorer::m_strCurDiretory。对于数据封装,这是一直强调的,但是编码的时候总觉得无所谓,直接访问更直接,所以直接将要访问的m_strCurDiretory设置为public,你们都直接来访问我吧,别拐弯抹角了,于是就变成了这样子:

class CExplorer
{
       …
public:
       CString m_strCurDiretory;
}

        随着代码的不断增加,直接访问此字段的代码也在膨胀。自己还无所谓,至少记得在需要改变它的时候才改变,但问题是项目是两个人一起做的,你不能保证他也能够跟你有着一样的想法,很多时候是在问题出现了之后调试一番才突然醒悟,“嘿嘿,老兄你不能那样做,你必须在需要改变它的时候才改变它,其它情况保持不动”。

        对于这个问题,加强沟通,说明怎样正确使用也许是解决它的一条途径,但难免还是会不小心犯错误,且治标不治本。问题的根源乃是数据被无限制地暴露出给外面了,想想面向对象编程的特点数据封装吧,我们给它加上getset函数,最终变成了这样子了,

 

class CExplorer
{
       ...
public:
       CString   GetCurDirectory() const;
       Void     SetCurDirectory(CString &strCurDirecotry);
private:
       CString  m_strCurDiretory;
}


 

        这样在访问它的时候就会调用GetCurDirectory返回副本,而不会导致它被不小心改变了,你不会无缘无故地调用SetCurDirectory来改变它吧。起初设置成public是懒得去写getset了,反正它也能够正常运行,后来访问的代码也来也多了,突然觉得不对劲啊,但也没时间去改了,要改的地方太多了,反正到目前为止它还是正常运行,于是bug悄悄地诞生了。

        最近看了《重构改善既有代码的设计》这本书,收获真的很多,觉得程序除了正常运行外,还要健壮地运行,能够更好地应对各种变化和更容易地扩展,这才是王道啊。这本书还要继续品味,才能够懂得更多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值