刚毕业的应用程序开发程序员找工作十有八九在面试的时候被问到过面向对象的三大特性,即便没有在面试中被问到过,也极有可能会在入职后跟同事聊起过。

    常规教科书一般会给出这样的答案:封装、继承、多态。封装,首当其冲,难逃众人视线。封装到底是指什么?封什么?装什么?为什么要封装?

    从技术上理解封装,有两种比较多的解释:

    1. 将行为和行为所操作的数据绑定在统一对象里,行为细节被隐藏起来。比如一个矩形对象,计算面积的行为,该行为会使用长和宽的乘积来返回面积,外部无需知道他是如何计算面积的,只要调用计算面积的方法即可。
    2. 通过抽象类型来隐藏具体的实现。比如袁帅想要一个能发出像狼一样叫声的东西,从而能够用它来吓唬夜里的黄鼠狼,防止养的大公鸡被偷吃了。在面向对象建模时,只需要提供一个具备这种行为的抽象接口,具体实现是什么,对袁帅来说就被封装隐藏起来了。

    再有一些不接地气的叫法:信息专家模式。袁帅不太喜欢不接地气的东西,他一直想让自己成为一名能大白话和例子讲解抽象知识的程序员教练,这种强烈的愿望让他刻意避开一些显得高(假)大上(空)的词汇,搞不好还要为这个词汇做一番解释,心累。

    image.pngimage.pngimage.png
    最近无锡战队的新兵成龙、杰克和飞翔三人组成了一支特种学习部队,正在丹娜的组织下开展了风雨无阻学习计划。丹娜看到三人学习热情如此高涨,带着三人信誓旦旦立下誓言:「每天完成3 ~ 5个毕向东Java基础中面向对象部分的视频,并产出学习笔记和随练代码库,还要用他们不熟悉的Git进行管理代码,致力啃下面向对象这座大山」。

    丹娜周末刚读完了《费曼学习法》,非常认同里面用输出倒逼输入的理念,心里盘算着找个机会试一试。周一早晨站会完,丹娜让三位新兵留下给提了个建议:“三个人一起商量将学习的内容梳理总结,再给其他新兵讲出来,先尝试一周讲一次。” 也不知道是初生牛犊不怕虎,还是新兵胆小怕“领导”不敢抗议,竟然欣然同意,但在他们的脸上,袁帅也没读不出有不情愿的字样。

    时间过得飞快,转眼间来到周五了,忙碌的一周,大版本的需求分解和任务分解已经进行的差不多了,「风雨无阻学习计划」的「每周分享时刻」到了。今天是杰克和成龙结对分享面向对象 — 封装。

    杰克一开口就感觉跟其他新兵不一样了:“今天由我和成龙分享面向对象的特性之一封装,希望通过我的分享,能够让大家了解到封装的四个好处,从而把项目代码写得更好。” 自从上次袁帅在一次应届生的无厘头分享中给大家植入了几个问题,大家以后的分享就能有一个观点鲜明的开场。很显然,杰克也是提前思考过这两个问题:

    1. 我今天分享的主题是什么?【简明扼要一句话提炼】
    2. 你为什么花时间听我分享?【听众听完后的收获】

    时间很快半小时过去了,袁帅还在回味一开始杰克介绍面向过程和面向对象区别的介绍: 「面向过程是执行者思维,面向对象是协调者思维。」“真别说,这些新兵蛋子讲的还真不赖” 袁帅在心里给杰克点了个大写的赞。

    还没等他回过神来,杰克面带得意地提高了嗓门:“那今天我们来总结一下封装的好处。”

    1. 隔离变化
    2. 提升安全性
    3. 提升易用性
    4. 提升重用性

    看着这四点总结,袁帅感觉哪里怪怪的,但又说不上来。不一会儿,杰克的搭档成龙成功调动了大家的思考积极性,让听众来解释一下对这几点好处的理解。袁帅参加这种知识分享,心里深知自己扮演了双重角色,除了当一名好学生,更重要的是作为一名教练,尽可能引导在场的新兵获得的正确合理知识,还要尝试用白话讲明白这些知识,让大家更容易理解。

    秉承这个原则,他竖起了耳朵认真听着大家发言。真是兼听则明,偏听则暗啊,听了一圈大家各种奇奇怪怪的理解,他也有了一些灵感,待大家都发表完毕之后,他借用某个新兵提到电脑机箱的例子重新梳理总结杰克分享文档上罗列的几点好处。

    “隔离变化,准确来说不是一个好处,它只是一个手段,它跟其它三个点显然不是一个维度上的描述,你可以说隔离变化达到了什么好处,比如隔离变化达到了自由灵活性,隔离变化本身只是一个手段或者一个现象。” 见大家若有所思的点着头,袁帅心里非常感谢他做内训师初期屡次犯错被指正的经历,让他对痛点、问题、好处、现象、事实这些不同的维度有着深刻的体会,他曾经很多次把现象当做痛点和问题。

    “破坏封装的一个很典型的信号是setter,一旦你的对象有setter,你的对象就不能说封装了,你给属性加上private修饰也不顶用!” 听完这句话,会议室顿时嘈杂起来了,新兵议论纷纷,袁帅猜到大家平时的一个编码习惯 — 随手把对象所有的getter/setter一股脑生成,也不管有没有用。“是不是?!” 感知到大家被触动到了,袁帅加了一个重重的提问。

    丹娜此时也皱着眉看着袁帅,因为她项目组中也会经常有人这么做,之前她没太意识到这一点。“那碰坏了封装,会有什么问题呢?” 正当大家觉得他要跑题绕过那几点好处时,袁帅又通过提问的方式把主题拉回来:“setter破坏了封装也就破坏了安全性。”

    “比如,你启动一台台式电脑主机,主机里面的主板被你改成其他型号了,这台电脑可能就启动不了了,内部东西如果能随意被更改,那主机启动的行为可能被破坏掉了,安全性得不到保障。”

    “易用性是指什么呢,如果没有对象的封装,你启动一台主机需要做什么事情?” 袁帅的提问耐心修炼得炉火纯青了,只剩下几分钟就到时间了,这把丹娜听着都快急死了。

    所有人异口同声:“启动主板,启动CPU,启动内存,启动硬盘…” “很好,那现在你只用一键启动电脑了,是不是很好用了啊。” 新兵被他的问题引导的只顾点头,袁帅知道大家这次是真懂了,没有停下来:“重用性,就是主机的一键启动行为一旦调试就绪,你们每个人都买了一台这样的主机,是不是都可以复用这一套启动的逻辑了。”

    “这就好比一个类实例化了多个对象,每个对象的行为都是一样的” 飞翔为了展示自己的领悟力,兴奋补充了一句。 大家目光都投向了飞翔,袁帅也给他竖起了一个大拇指,飞翔很开心大家对他如此的认可,远程视频也不妨碍这种赞美的传播。

    还有一分钟就到时间了,袁帅没打算放过大家,灵机一动,给大家布置了一个小作业:“最近流行智能家居,我现在需要一个智能家居虚拟机器人,我告诉它我要看电影,它就能一键切换到观影模式(拉上窗帘,关闭主灯,打开孔灯,放下屏幕,打开投影仪)……”

    分享时间到了,新兵们起身陆续离开会议室。袁帅心里嘀咕:“这是谁总结的好处,没见教科书上这么讲过呀,不过也不妨碍自己现场集众人智慧和自己的经验,来个FreeStyle~”

    自我得意了3秒钟,他立马打开微信,把自己之前写的一篇短文《setter真是害人不浅》分享给大家,他希望大家学到了知识,能够用在实际工作中,发生行为上的改变,不然知识学再多,也只是口头学会了,这也是他每次培训完喜欢加一个行动计划或者实操作业的原因