神秘的力量:信息隐藏

「信息隐藏」在软件开发领域中是一个非常重要的核心要点, 它的另一个名称叫做「封装」, 但是因为现代面向对象技术流行的原因, 「封装」似乎已被视为和private是等价的, 这就导致了封装的含意并不那么准确了, 事实上它的使用范围在代码的编写中无处不在, private只是封装的其中一项用途而已。 因为封装一词已经被误用太久,所以使用「信息隐藏」能更简单的阐述清楚这个概念,这能避免受对「封装」先入为主的错误理解的影响。

信息隐藏, 顾名思义就是将信息给隐藏起来。 信息是什么? 在编程语言中, 信息包括变量、常量、语句、函数、类等等一切组成代码的元素, 信息隐藏的意义就是在高级别的代码元素层面上对低级别的代码元素进行隐藏。 比如说

函数的作用就是将变量、语句等最低级的代码元素给包裹起来, 使之对于函数外部不可见, 对于函数的调用者来说,他只需知道函数的作用, 而无需了解函数内部的实现细节, 这样才能将问题简单化, 这便是函数的信息隐藏的能力。

类的作用就是将private成员给包裹起来,使之对于类外部不可见,这就是类的信息隐藏功能,而类的信息隐藏能力就是为大众所知的封装功能。 在面向对象编程语言中还有一项protected的访问修饰级别, 它也能起到信息隐藏的作用, 只是能力相对较弱, 因为当类成员启用protected访问修饰以后, 对于类外部虽然起到隐藏的作用, 但是对于继承它的子类而言,是没有信息隐藏的能力的。 因此我们在编写类的时候, 能使用private就不要使用protected, 能使用protected的就不要使用public,以此来最大限度的保证类的信息隐藏能力。 public是完全公开的, 没任何隐藏的能力,因此能不使用尽量不使用。 从理论上来说, 一个完美的类的所有成员都应该是private的,但是这样的类的是无法正常使用, 然而,在写代码的时候我们应该让自己编写的类无限趋向于这种方式,以最大限度获得信息隐藏能力。

信息隐藏能带来什么好处呢?其实最主要的核心作用就一点:降低软件开发的复杂性, 使问题尽量简单化。 复杂的代码项目是程序员的恶梦, 许多兢兢业业的前沿科学工作都无时无刻不在想方设法发明或者发现各种降低软件代码复杂性的工具和方法, 信息隐藏就是一项经过实践并已被证明是行之有效的工具。 这个道理其实很简单, 就拿世界上最好的语言php实现发送http请求来说明信息隐藏能将问题简单化的能力。 php发送http请求一般有两种方式, 一种是使用curl库,另一种是使用file_get_contents函数,使用curl势必要写许多代码来实现完整的发送http请求的功能, 如下图

这便是没有经过信息隐藏(封装)的代码示例, 它复杂且难以使用,以这种方式发送http请求肯定会导致功能实现的效率降低, 出错的机率增加。

而以file_get_content方式发送请求则要简单许多,一行代码就可以搞定

$response = file_get_content($url);

足够高效,足够简单, 因为所有发送请求的具体细节都被封装(隐藏)在这个函数里面, 函数的调用者只需要知道如何使用这个函数就可以了。 当然, 这只是一个简单到不能再简单的示例,可能无法足够的深刻说明信息隐藏的威力。但是以小观大, 在写程序时, 信息隐藏无时无刻不伴随着我们, 我们在使用各种类库、框架、组件等都是信息隐藏的范例, 我们平时经常提及「底层」这个术语,它一般表示高难度、复杂、功能强大,但是使用效率低等特点,因为它从某种角度显现出来的都是未经过信息隐藏的细节内容。而那些在「底层」的基础上进行信息隐藏(封装)的框架或者库, 使用简单且高效,所以在现代软件开发中往往会使用各种框架来进行软件的开发,脱离框架编写原生代码的情形非常罕见, 这便是信息隐藏价值的体现了。

因此,在编写代码的时候要时不时的问下自己:“我还需要隐藏些什么吗?”, 只要能做到这点,写出来的代码的质量将会有长足的进步。

原文发布于微信公众号 - 带你撸出一手好代码(gh_afab56b37671)

原文发表时间:2017-03-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

大量参数与信息丢失之间不可不说的故事

代码越少就越好?对象越少就越好?这些都是真的吗?由绝大多数情况来看,这还真的都不一定。

6710
来自专栏听雨堂

Mapx用xml创建点图层

     Mapx4.*中,并不支持xml,到5以后,创建ds支持xml了,听起来很美,但是,在网上居然没有找到一个说这个的,难道mapx就没人用了吗?    ...

19980
来自专栏HBStream流媒体与音视频技术

采集音频和摄像头视频并实时H264编码及AAC编码

61980
来自专栏吉浦迅科技

DAY53:阅读Profiler Counter Function

Each multiprocessor has a set of sixteen hardware counters that an application c...

8920
来自专栏前端架构与工程

不仅仅是复制粘贴 - 聊聊前端脚手架

许多团队在制定前端工程方案时会加入脚手架模块。虽然不同的团队对工程化的理解和实施有所差异,但是对于脚手架的定位基本是一致的:创建项目初始文件。这是一条看起来十分...

22960
来自专栏web前端教室

javascript中那些可以连成片的点

JavaScript的提高,是一点一滴的提高,这些点滴连接成线,进而连接成为一个面。 这个“面”的知识你都会了之后,会首先从某个点上形成突破再提高,然后这些再提...

21460
来自专栏大数据

加速python科学计算的方法(二)

好久不见。有一年了。 很久没有更推文了,我的错。额,进入正题吧。到了年底,很多App都会放出“你今年听了多少歌”、“你今年看了多少帖子”、“你今年剁手了多少次”...

328100
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试复习大纲更新1.0(持续更新)

1、背熟你的简历 原因:面试的第一个问题,一般都是让你简单介绍下你自己,或者介绍一下你最近的项目,而一个面试者,如果连自己的简历都无法熟知,对里面提到的项目、技...

50840
来自专栏樊华恒的专栏

海量之道系列文章之弱联网优化 (六)

基于一个快速和高效管理的链路之上,做好IO调度和控制,也是提升效能和改善用户体验的重要环节,本节主要来探讨 IO 管理与 强监控。

41600
来自专栏深度学习计算机视觉

分析类的角色

1-边界类 1-O 负责系统与外界(最终用户)的通讯与交互 职责:转换和翻译交互事件 对内:将外界不同格式的时间和信息 转换为内部能够识别的格式 常见的边...

22440

扫码关注云+社区

领取腾讯云代金券