为什么程序开发时一定要使用封装而不能让用户直接访问变量

更新时间:02-09 教程 由 别弃我 分享

为什么程序开发时一定要使用封装而不能让用户直接访问变量?

封装,主要来自于面向对象编程。具体做法是将类(class)里面的一部分变量和一部分方法(或函数)设置为私有,不允许外部访问。通过对外暴露一些公有的方法、函数、字段、属性、事件(不同编程语言叫法不一样),来实现封装。

封装的好处大概有以下几点:

第一、防止不小心对某些敏感变量进行错误的读写

举个简单例子,设计一个机械时钟的类,通常会有两个重要变量,一个是时针、一个是分针。如果没有封装,而是直接对外暴露,就会导致时针分针错乱。比方说,6:30,分钟指向30,时针应该指向6和7的正中间。如果不封装,时钟就容易指错位置。如果是电子时钟,还会出现分钟超过60,小时超过24的情况。相反,封装得好,只对外暴露调节旋钮的功能,则时针分针的显示绝对不会出错。如果是电子时钟,则可以在内部统一对输入的时、分变量进行范围校验或修正(而不是将此功能转嫁给外部调用者)。总之,封装得好,不论外部如何调用,在任何时候都不会出现时、分出错,将bug扼杀在摇篮里。

第二、降低外部调用的难度

在面向对象编程中,我们调用一个对象的成员时,只会显示公有的成员。这样就会大大降低学习和维护的难度。试想,假设一个类有100个成员,如果采用公有私有封装,只公开20个,那么,调用者只需要学习这20个就足够了,否则,就需要学习100个。同时,如果可以选择的东西太多时,就会导致“选择恐惧”或者产生困扰。不要说自己写的,不需要“学习”。因为当你时间久了后,肯定要遗忘之前写的代码的。另外,现在大部分IDE都自带代码智能补全功能,在对象后面输入一个点,就直接出来公有变量,用起来非常方便。相反,面向过程或者没有良好封装时,就享受不了这个好处,需要不断地查看文档来寻求帮助。

第三、对变量进行简单的getter/setter封装,有利于错误调试,有利于采用反射技术

估计大部分人都能很好地理解上面两点,但就是不知道明明可以直接访问变量,为什么却非要搞个getter/setter。实际上,很多时候确实没有必要,仅仅就是为了所谓的规范。但是却存在一种情况,当我们想跟踪某个变量到底在什么时候被调用,特别是被改变时,就很有用了。只需要在getter/setter中临时加入一些跟踪代码,比如日志打印,就能轻松查出来。这在遇到bug时,非常有帮助。

还有一种情况就是getter/setter可以更方便地使用反射技术,这在使用某些大型框架时经常用到。

以上所说,在大型项目,多人开发时,表现得特别明显。如果只是一个人,只是写个小程序,或者临时小工具(比如运维、简单数据处理),那估计体会不到封装的好处,也没有必要过度封装。

但是,也需要意识到,一些优秀大型项目,也有封装不良好的情况,有的还用到了面向过程的技术。这是因为,这部分代码,可能会非常底层、非常强调性能(比如操作系统、编译器、高性能科学计算)。不过,咱们普通人就不用想了,还达不到那个水平,就老老实实把封装技术用好吧。

声明:关于《为什么程序开发时一定要使用封装而不能让用户直接访问变量》以上内容仅供参考,若您的权利被侵害,请联系13825271@qq.com
本文网址:http://www.25820.com/tutorial/14_2302963.html