实现方案的隐藏

为方便后面的讨论,让我们先对这一领域的从业人员作一下分类。从根本上说,大致有两方面的人员涉足面向对象的编程:“类创建者”(创建新数据类型的人)以及“客户程序员”(在自己的应用程序中采用现成数据类型的人;注释④)。对客户程序员来讲,最主要的目标就是收集一个充斥着各种类的编程“工具箱”,以便快速开发符合自己要求的应用。而对类创建者来说,他们的目标则是从头构建一个类,只向客户程序员开放有必要开放的东西(接口),其他所有细节都隐藏起来。为什么要这样做?隐藏之后,客户程序员就不能接触和改变那些细节,所以原创者不用担心自己的作品会受到非法修改,可确保它们不会对其他人造成影响。

④:感谢我的朋友Scott Meyers,是他帮我起了这个名字。

“接口”(Interface)规定了可对一个特定的对象发出哪些请求。然而,必须在某个地方存在着一些代码,以便满足这些请求。这些代码与那些隐藏起来的数据便叫作“隐藏的实现”。站在程式化程序编写(Procedural Programming)的角度,整个问题并不显得复杂。一种类型含有与每种可能的请求关联起来的函数。一旦向对象发出一个特定的请求,就会调用那个函数。我们通常将这个过程总结为向对象“发送一条消息”(提出一个请求)。对象的职责就是决定如何对这条消息作出反应(执行相应的代码)。
对于任何关系,重要一点是让牵连到的所有成员都遵守相同的规则。创建一个库时,相当于同客户程序员建立了一种关系。对方也是程序员,但他们的目标是组合出一个特定的应用(程序),或者用您的库构建一个更大的库。
若任何人都能使用一个类的所有成员,那么客户程序员可对那个类做任何事情,没有办法强制他们遵守任何约束。即便非常不愿客户程序员直接操作类内包含的一些成员,但倘若未进行访问控制,就没有办法阻止这一情况的发生——所有东西都会暴露无遗。

有两方面的原因促使我们控制对成员的访问。第一个原因是防止程序员接触他们不该接触的东西——通常是内部数据类型的设计思想。若只是为了解决特定的问题,用户只需操作接口即可,毋需明白这些信息。我们向用户提供的实际是一种服务,因为他们很容易就可看出哪些对自己非常重要,以及哪些可忽略不计。
进行访问控制的第二个原因是允许库设计人员修改内部结构,不用担心它会对客户程序员造成什么影响。例如,我们最开始可能设计了一个形式简单的类,以便简化开发。以后又决定进行改写,使其更快地运行。若接口与实现方法早已隔离开,并分别受到保护,就可放心做到这一点,只要求用户重新链接一下即可。
Java采用三个显式(明确)关键字以及一个隐式(暗示)关键字来设置类边界:public,private,protected以及暗示性的friendly。若未明确指定其他关键字,则默认为后者。这些关键字的使用和含义都是相当直观的,它们决定了谁能使用后续的定义内容。“public”(公共)意味着后续的定义任何人均可使用。而在另一方面,“private”(私有)意味着除您自己、类型的创建者以及那个类型的内部函数成员,其他任何人都不能访问后续的定义信息。private在您与客户程序员之间竖起了一堵墙。若有人试图访问私有成员,就会得到一个编译期错误。“friendly”(友好的)涉及“包装”或“封装”(Package)的概念——即Java用来构建库的方法。若某样东西是“友好的”,意味着它只能在这个包装的范围内使用(所以这一访问级别有时也叫作“包装访问”)。“protected”(受保护的)与“private”相似,只是一个继承的类可访问受保护的成员,但不能访问私有成员。继承的问题不久就要谈到。

时间: 2024-10-01 09:58:38

实现方案的隐藏的相关文章

Discuz论坛的SEO优化方案

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 设discuz已启用伪静态功能,使用5.0/5.5 GBK 版本: 1.meta,content 优化 2.内容页的网页复制问题 3.robots.txt使用及其它 更新 discuz5.5的robots.txt问题 DZ 禁止一个版面帖子的收录的补充 一.meta的优化 discuz的后台可以对meta信息进行设置,甚至可以添加自己的头部信

JAVA编程思想 课程进展 一

编程 第1章 对象入门 "为什么面向对象的编程会在软件开发领域造成如此震憾的影响?" 面向对象编程(OOP)具有多方面的吸引力.对管理人员,它实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.易于维护的设计方案.对程序员,对象模型显得如此高雅和浅显.此外,面向对象工具以及库的巨大威力使编程成为一项更使人愉悦的任务.每个人都可从中获益,至少表面如此.如果说它有缺点,那就是掌握它需付出的代价.思考对象的时候,需要采用形象思维,而不是程序化的思维.与程序

thinking in java

写在前面的话 引言: 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的隐藏 1.4 方案的重复使用 1.5 继承:重新使用接口 1.5.1 改善基础类: 尽管extends关键字暗示着我们要为接口"扩展"新功能,但实情并非肯定如此.为区分我们的新类,第二个办法是改变基础类一个现有函数的行为.我们将其称作"改善"那个函数. 为改善一个函数,只需为衍生类的函数建立一个新定义即可.我们的目标是:"尽管使用的函数接口未变,但它的新版本具

我是一个普通运维,我就这样拯救了一个百亿互金平台

本文转载于:http://www.ityouknow.com 作者:纯洁的微笑 多年前,又是周六客服打电话过来,平台官网不能访问,app完全无法打开,客户在QQ群和微信群中各种反馈,说平台是不是跑路了?客服的多条400热线完全被打爆,电话已经接不过来- 前言 一直以来总是想以什么方式去记录下自己在互联网金融行业的这段经历,趁着自己还记得清楚,还能找到一些资料原型,一方面可以分享出来供大家参考,但是更重要就是多年以后可以根据这些文章回忆起自己的那段激情岁月.想了很久但一直没有实施,后来觉得应该从架

百亿互金平台救火故事

多年前,又是周六客服打电话过来,平台官网不能访问,app完全无法打开,客户在QQ群和微信群中各种反馈,说平台是不是跑路了?客服的多条400热线完全被打爆,电话已经接不过来- 前言 一直以来总是想以什么方式去记录下自己在互金行业的这段经历,趁着自己还记得清楚,还能找到一些资料原型,一方面可以分享出来供大家参考,但是更重要就是多年以后我可以根据这些文章回忆起来自己的那段激情岁月. 想了很久但一直没有实施,后来觉得应该从架构的角度来梳理一篇文章,就写了从零到百亿互联网金融架构发展史这篇文章:最后认为只

云计算中我们是否需要LAMP的PaaS?

LAMP是因特网的一个重要平台,但是当前的云计算提供商似乎没有将LAMP包括在PaaS之内.云计算的世界里是否需要LAMP呢? Geva Perry,作为Heroku,GigaSpaces以及其他公司的顾问,最近提出了"谁来建设LAMP云"的问题,并在最后就我们是否需要一个LAMP的PaaS云征求读者的意见. Perry分析了大多数云提供者并得出结论:LAMP,特别是当这个P指得是PHP时,在PaaS云中是缺失的.SalesForce.com与WMWare最近推出了面向开发者的称为VM

手机电子书下载论坛的建站心得

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 某日,一朋友介绍一站长给我名曰:合作建站.简单交流后,该站长的目的可以概括为几句话:他搞到了一台服务器;我做站,他提供服务器;网站盈利后,我拿70%的份额,他拿30%的份额. 乍一听,似乎条件不错,但仔细分析下来,就有些问题了.从他口气上来看,基本上是我出力,他等着收钱.不过他又加上了一句:实在有技术上的难题,他可以提供.(不过从后来的表现

Win2000下进程隐藏的一种方案

十分抱歉,匆匆写了几句代码有点bug,即"ZwOpenSection(&g_hMPM,SECTION_MAP_WRITE|SECTION_MAP_WRITE,&attributes)"使得第一次运行返回失败,请删除原文,改正为: pjf (jfpan20000@sina.com) 上次在CVC提到了这东西,因为很简单觉得没必要多说什么,但有人要求写全,所以补充几句: 很多帖子对此论题作了分析,比如APIHOOK.系统服务HOOK等等,至于远线程注入没有自己的进程,本不算

解决表单中第一个非隐藏的元素获得焦点的一个方案_表单特效

form中又许多元素,是用例如form.element[x] 来表示: 一个元素的类型: 一个元素的类型是用 element.type 来表示 有了上面的一些了解,现在就让我们来解决第一个非隐藏元素获得焦点的方案: 首先定义 一个对象 作为方法的应用者: var f=new Object(); 然后: 复制代码 代码如下: f.getTheFirstFocus=function(){ if (document.forms.length > 0){ for (var i=0; i < docum