众所周知,面向对象编程的三大特征是继承、多态和数据封装,对这个是早已烂熟于心了,但是在具体的代码编写中总是抛之于九宵之外,唉,记性不好。。。
最近在做一个资源管理器,其中有一个字段是保存当前的目录的,就叫它CExplorer::m_strCurDiretory。对于数据封装,这是一直强调的,但是编码的时候总觉得无所谓,直接访问更直接,所以直接将要访问的m_strCurDiretory设置为public,你们都直接来访问我吧,别拐弯抹角了,于是就变成了这样子:
class CExplorer
{
…
public:
CString m_strCurDiretory;
}
随着代码的不断增加,直接访问此字段的代码也在膨胀。自己还无所谓,至少记得在需要改变它的时候才改变,但问题是项目是两个人一起做的,你不能保证他也能够跟你有着一样的想法,很多时候是在问题出现了之后调试一番才突然醒悟,“嘿嘿,老兄你不能那样做,你必须在需要改变它的时候才改变它,其它情况保持不动”。
对于这个问题,加强沟通,说明怎样正确使用也许是解决它的一条途径,但难免还是会不小心犯错误,且治标不治本。问题的根源乃是数据被无限制地暴露出给外面了,想想面向对象编程的特点数据封装吧,我们给它加上get、set函数,最终变成了这样子了,
class CExplorer
{
...
public:
CString GetCurDirectory() const;
Void SetCurDirectory(CString &strCurDirecotry);
private:
CString m_strCurDiretory;
}
这样在访问它的时候就会调用GetCurDirectory返回副本,而不会导致它被不小心改变了,你不会无缘无故地调用SetCurDirectory来改变它吧。起初设置成public是懒得去写get、set了,反正它也能够正常运行,后来访问的代码也来也多了,突然觉得不对劲啊,但也没时间去改了,要改的地方太多了,反正到目前为止它还是正常运行,于是bug悄悄地诞生了。
最近看了《重构改善既有代码的设计》这本书,收获真的很多,觉得程序除了正常运行外,还要健壮地运行,能够更好地应对各种变化和更容易地扩展,这才是王道啊。这本书还要继续品味,才能够懂得更多。