封装与信息的隐藏

封装和信息隐藏 文章目录3.1 信息隐藏原则3.1.1 封装与信息隐藏3.1.2 接口扮演的角色3.2 创建对象的基本模式3.2.1 门户大开型对象3.2.2 用命名规范区别私用成员3.2.3 作用域、嵌套函数和闭包3.2.4 用闭包实现私用成员3.3 更多高级对象创建模式3.3.1 静态方法和属性3.3.2 常量3.3.3 单体和对象工厂3.4 封装之利3.5 封装之弊3.6 小结 为对象创建私用成员是任何面... 阅读详情

封装与信息的隐藏




显示了肆虐一时的SARS病毒结构图。可以看出,病毒可以分成三个层次:一层坚硬的壳层,壳层外呈触角状的蛋白体,以及壳层内部的遗传物质。显然这种构造使得SARS病毒得以隐藏和保护自身内部结构,这是病毒经过漫长时间的演化形成的有效生存机制。  
无独有偶,面向对象的软件设计中,对象也可以分成三层,一层由各个方法构成的壳层,暴露在壳层外的各个接口,以及受到保护的内部属性,参见图4.2。  
   
   
图4.1、SARS病毒模型。(www.who.org)            图4.2、对象由属性和方法组成,对象向外界提供接口以供操作对象内部属性和触发对象的行为。    
对象的这种结构,使得封装(Encapsulation)与信息隐藏(Information  Hiding)变得可能。封装和信息隐藏常常被混为一谈,但它们并不是一回事。  
4.1    封装  
到底什么是封装呢?让我们还是从四十年前谈起吧。  
如本书在第1章中介绍的,世界上第一个具备面向对象特征的语言是Simula。是Simlua第一次引入了真正意义上的封装。  
在六十年代,模块化编程是基本的设计手段,模块化也是Simula的基本设计思想,只是Simula的模块化非常有特色:模块的设计不是建立在过程之上的,而是建立在真实世界中的物体基础之上的。  
每一个真实的物体都有一些需要模型化的行为,每一个真实的物体都有一些关于其状态的信息。这些物体相互作用,形成了Simula需要描述的模拟系统。Simula的设计师决定以最为接近真实物体的办法进行模拟系统的设计,这样一来,按照真实物体的组织来组织模块,就是顺理成章的了。  
将数据和作用于数据之上的操作绑在一起形成模块,这就是封装。  
一场对象技术的革命就是这样开始的。这场革命开始于封装。  
一个例子:棋盘上的点  
对象是对真实世界中的物体的抽象化,但对象不是照搬真实世界中物体。对象技术中的建模不是把真实世界照搬到软件系统中,对象技术首先要将真实世界理想化、简单化、抽象化,然后把这个改变了的影像搬进软件系统中。  
读者一定建国围棋棋子和棋盘吧,本节就考察一下如何为围棋棋盘上的点建模。  
                 
图4.1、围棋的一间跳、点三三。            图4.2、Point类的类图  
下面的Point类描述在棋盘上的一个点,它带有两条数据,分别代表横纵坐标。这个类可以用UML描述,参见图4.2。  
代码清单4.1、Point类描述棋盘上的点  
public  class  Point  {  
       public  single  x;  
       public  single  y;  
}  
与点相联系的操作有下面这些:  
            移动(move):将这个点对象移动到另一个位置,就好比把一个围棋子从棋盘上的一个点移动到另一个点。  
            计算距离(distance):与这个点与另一个点的距离。围棋手需要计算的比这个要复杂得多。  
要实现这些方法,需要一个新的工具类,不妨称作PointUtil如下  :  
代码清单4.2、操作点的工具类  
public  class  PointUtil  {  
       public  double  distance(Point  p1,  Point  p2){  
               return  Math.sqrt(  (p1.x  -  p2.x)  *(p1.x  -  p2.x)  +  (p1.y  -  p2.y)*(p1.y  -  p2.y));  
       }  
       public  void  move(Point  p,  double  x,  double  y){  
                 p.x  =  x;  
               p.y  =  y;  
       }  
}  
如果要移动一个点,就把这个点传入PointUtil对象的move方法,同时需要传入的还有新的坐标。这个PointUtil对象会把Point对象移动到新的坐标。  
如果要计算一个点到另一个点的距离,就需要把两个点对象传入到PointUtil对象的distance方法中,这个方法会返还你想知道的距离。譬如下面的代码就设定了两个点,并计算出他们的距离:  
代码清单4.3、如何计算两个点之间的距离。  
       public  static  void  main(String[]  args){  
Point  p1  =  new  Point();  
               Point  p2  =  new  Point();  
 
               p1.x  =  10.0F;  
               p1.y  =  20.0F;  
 
               p2.x  =  100.0F;  
               p2.y  =  200.0F;  
 
               PointUtil  putil  =  new  PointUtil();  
               System.out.println(putil.distance(p1,  p2));  
       }  
有两种设计师往往会给出类似于上面的这种设计。  
熟悉过程性设计概念,初学对象技术的设计者常常会给出类似上面的设计。这种对责任的划分方法明显地带有过程式设计的痕迹,因为虽然设计中也使用了类,给人的感觉是如果Java允许把方法放到类外边去,设计者可能会更高兴。Java语言强制设计师使用类,但是使用了类,并不能保证一个设计就真正体现了对象思想的。  
另一类设计者试图原封不动地在软件系统中重现真实世界,他们会认为这是一个好的设计:这难道不是对现实世界的真实描述吗?在现实世界中,围棋子会自己走路吗?难道不是外力移动棋子?棋子难道知道计算距离吗?难道不是一个计算器什么的负责计算距离吗?  
不错,在现实世界中是这样的。但是这个现实世界不是一个理想化的,而是一个蹩脚的现实世界,你不想把这样的现实世界原封不动地搬进软件模型中。  
在一个理想化的世界中,围棋子难道不应当自己会移动吗?外界只需要传送一个消息给棋子,棋子就自动到位。这虽然是想象中的事情,但是并非距离现实很远,只需要借助于一定的电子科技,完全可以在改进的棋子和棋盘上实现这一点。难道你不想把这个聪明的棋子和棋盘当作原型加以引进吗?  
如何划分责任是面向对象的设计与过程性设计的基本区别。如果一个对象包含了某项操作所需的全部数据的话,那么这项操作就应当属于这个对象,而不是属于另一个不能提供所需数据的对象。上面所讨论的move方法需要改变的是Point对象的两个属性:x和y,而这两个属性就在Point对象内,为什么不把move方法交给Point对象呢?  
基于同样的道理,计算一个点与另一个点的距离,需要两个点的坐标,而坐标本就是Point对象的属性,为什么不把这项计算任务交给Point对象呢?当然,这就意味着PointUtil类根本就没有用处,可以取消。

封装与信息隐藏:Python面向对象编程实践 本文深入探讨了Python面向对象编程中的封装与信息隐藏。通过分析函数 isinstance 的使用、子类化与替换原理、以及数据属性的封装,揭示了如何通过合理的编程实践实现代码的模块化和安全性。同时,文中还讨论了Python中信息隐藏的机制以及生成器的概念,并通过示例代码展示了它们的实际应用。 阅读详情

相关推荐

软件开发的安全实践:模块化、封装与信息隐藏

本文探讨了软件开发中安全性的关键实践,重点分析了模块化、封装以及信息隐藏的概念。通过明确组件的单一功能、独立性和高内聚低耦合性,软件工程师能够构建出既易于维护又安全可靠的系统。同时,讨论了在高度互联的世界中,相互怀疑、限制和遗传多样性等概念的重要性,以及如何通过同行评审来加强软件质量。

weixin_36178216的博客 448

数据封装与数据抽象

  所有的 C++ 程序都有以下两个基本要素: 程序语句(代码):这是程序中执行动作的部分,它们被称为函数。 程序数据:数据是程序的信息,会受到程序函数的影响。 封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全。数据封装引申出了另一个重要的 OOP 概念,即数据隐藏。 数据封装是一种把数据和操作数据的函数捆绑在一起的机制。 ...

weixin_43542624的博客 609

面向对象编程:封装、继承与信息隐藏

本文深入探讨了面向对象编程中的封装、继承和信息隐藏等核心概念。通过代码示例和理论分析,解释了如何通过中间类和isinstance函数来实现灵活的类继承结构。同时,文章强调了在设计类时应遵守的替换原理,并讨论了信息隐藏的重要性以及如何在Python中实现信息隐藏。通过实际的编程练习和案例分析,文章揭示了面向对象编程实践中的最佳实践和潜在陷阱。

weixin_34471637的博客 266

信息隐蔽原则是软件开发中“分而治之”思想的体现,通过封装细节、暴露接口,将复杂系统拆解为可独立维护的模块

信息隐蔽原则是软件开发中“分而治之”思想的体现,通过封装细节、暴露接口,将复杂系统拆解为可独立维护的模块。它不仅是面向对象编程的基础,也适用于结构化设计、架构设计等各个层面。在实践中,合理运用访问控制、接口抽象等技术,既能降低开发复杂度,又能提升系统的灵活性和可维护性,是现代软件工程中不可或缺的核心原则之一。这一原则由计算机科学家David Parnas在1972年提出,是模块化设计、封装性的理论基础,也是降低系统复杂度、提高可维护性的关键手段。

[Blog][Domain] programb.blog.youkuaiyun.com 1451

论文阅读4——一种宽频带圆极化微带天线的设计

论文阅读——一种宽频带圆极化微带天线的设计(现在才觉得开始弄懂了一点,懂了一点之后又更糊涂了……)

weixin_64612422的博客 2319

COMSOL新手必看:锂电池仿真从入门到精通的5个实战案例(附模型文件)

本文为COMSOL新手提供锂电池仿真的5个实战案例,涵盖锂枝晶生长模拟、电池热失控预警、SOC估计等效电路模型、电池组液冷系统热管理及SOH衰退模型构建。通过详细步骤和参数设置,帮助用户快速掌握锂电池仿真技术,提升新能源研发效率。附模型文件可直接应用。

wdx01234567的博客 262

c++抽象 封装 继承 多态 模板 数据隐藏 类 详解

抽象:将一类对象的共同特征总结出来构造类的过程 抽象包括数据抽象和行为抽象 数据抽象关注对象的属性 行为抽象关注对象的行为 例如:学生的姓名 年龄 身份证号 为学生的属性 学生会吃饭,会睡觉 为学生的行为 类 类是将抽象转换为用户定义类型的工具,包含了数据表示和操纵数据的方法 类中的数据项通常放在私有部分,组成类接口的成员函数放在公有部分 接口 接口由编写类的人提供的方法组成,c++程序将接口(类定义)放在头文件中 数据隐藏: 将数据放在类的私有部分即数据隐藏,数据隐藏是一种封装,将实现的细节隐藏在私有部分

Fern123g的博客 1203

旋转因子量化仿真

在单bit接收机中,通过量化FFT核函数来简化计算,将复数坐标中旋转因子单位圆上的点近似到正方形四个边上,就能够用累加实现复数乘法,从而避免使用DSP乘法器。通过仿真查看不同阶的核函数简化效果。

CyberInversion的博客 3107

31. 封装与信息隐藏

封装是面向对象编程的核心特性之一,通过将数据与行为捆绑在类中,并利用访问控制实现信息隐藏。它通过private、protected、public等修饰符控制访问权限,仅暴露必要接口,隐藏内部实现细节。典型应用包括数据保护(如银行账户余额)、领域模型设计(如用户密码隐藏)和API简化。封装能提高代码安全性(防止非法修改)、灵活性(内部变更不影响调用方)和可维护性(降低耦合)。最佳实践包括最小化可见性、防御性复制和行为优先设计。

weixin_43484713的博客 1704

Visual Studio Installer下载失败的5种修复方法(含DNS修改/补丁安装)

本文针对Visual Studio Installer下载安装文件失败的问题,提供了从网络层到系统层的深度排查与修复指南。详细介绍了DNS修改、代理配置、防火墙设置、系统服务检查等5种核心修复方法,并包含离线安装与手动补丁等替代方案,帮助开发者彻底解决安装难题。

sprite的博客 1627

基于RYU+Mininet的SDN校园网络实战:从零搭建虚拟化实验环境

本文详细介绍了如何利用RYU控制器和Mininet搭建SDN校园网络实验环境,从Ubuntu虚拟机准备到网络拓扑设计,再到关键网络功能实现。通过实战案例展示SDN在校园网络中的应用优势,包括简化配置、提升效率等,为网络工程师和学生提供了一套完整的虚拟化实验方案。

weixin_30872499的博客 459

信息隐藏与类的封装

C++对C的最根本的改变就是把函数放进了结构之中,从而产生了C++类。类把数据和函数捆绑在一起,其中数据表示类的属性(数据成员),函数表示类的行为,也称为成员函数、方法或者服务。C++提供了关键字public、private、和protected用于声明哪些数据和函数是可以公开访

sdudubing的专栏 1295

Windows 11 IoT企业版LTSC 24H2/25H2中文版安装指南(含OEM激活教程)

本文详细介绍了Windows 11 IoT企业版LTSC 24H2/25H2中文版的安装与OEM激活全流程。从系统镜像准备、硬件兼容性检查到自动化安装配置,再到OEM激活方案(包括SLIC注入和数字许可证激活),为工业自动化、数字标牌等物联网设备提供稳定可靠的系统部署指南。

weixin_29198045的博客 8925

C++封装与信息隐藏:保护类成员

本文介绍了C++中封装和信息隐藏的核心概念。封装通过访问修饰符(public、private、protected)控制类成员的访问权限:public成员提供外部接口,private成员保护内部数据,protected成员允许子类访问。文章通过银行账户类的实例演示了如何利用封装保护敏感数据(如账户余额和密码),仅通过验证后的公共接口进行操作。这种机制有效防止了数据被外部直接访问或修改,确保了程序的健壮性和安全性。

fykam的博客 1995

基于 ESP32 的宿舍洗浴热水余量预测与智能排队提醒系统设计与实现

本系统以 ESP32 为主控核心,通过超声波液位传感器实时监测储热水箱剩余水量,配合 DS18B20 温度传感器采集水温数据,建立热水余量预测模型估算可用洗浴时长;同时通过红外人体传感器统计浴室排队人数,结合人均洗浴时长计算预计等待时间,并通过 OLED 屏本地显示 + WiFi Web 服务器远程推送的方式实现排队提醒功能。

weixin_42300449的博客 45

python实现序列比对之Needleman-wunsch算法 (附完整源码)

python实现序列比对之Needleman-wunsch算法 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 464

对java的信息的封装与隐藏的预习

今天对java中信息的封装与隐藏做了一定的预习,通过在网上看视频有了初步的了解,但是也没怎么听明白,,之所以要对属性的封装和隐藏是因为如果直接访问属性的话会对其安全性有影响,比如在下面代码中: 1 public class Student(){ 2 public String name; 3 4 public void getName(){ 5 sy...

weixin_34234823的博客 175

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JS设计模式——3.封装与信息隐藏

封装、信息隐藏与接口的关系 信息隐藏是目的,封装是手段。 接口提供了一份记载着可供公共访问的方法的契约。它定义了两个对象间可以具有的关系。只要接口不变,这个关系的双方都是可以替换的。 一个理想的软件系统应该为所有类定义接口。 创建对象的基本模式 1.门户大开型 var Publication = new Interface('Publication', ['getIsbn', 's...

weixin_30301449的博客 133

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

如何封装JS ----》JS设计模式《------ 封装与信息隐藏

1. 封装与 信息隐藏之间的关系 实质是同一个概念的两种表达,信息隐藏式目的,二封装是借以达到目的的技术方法。封装是对象内部的数据表现形式和实现细节,要想访问封装过额对象中的数据,只有使用自己定义的操作方法。通过封装可以强制实施信息的隐藏。 2. 重新认识创建对象的基本方式 01.用一个函数来做构造器 var Book = function (isbn, title, a...

weixin_34391854的博客 152

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

全局变量的艺术:在STM32开发中如何通过.h文件实现信息隐藏与模块化封装

本文探讨了在STM32开发中通过.h文件实现全局变量的信息隐藏与模块化封装的艺术。文章详细介绍了如何利用.h文件的结构化组织、访问器函数模式和静态全局变量等技巧,有效控制全局变量的作用域和访问权限,从而提升代码的可维护性和安全性,避免常见的全局变量滥用问题。

u0v1w2x3的博客 929

C++ 封装 & 信息隐藏

C++ 封装 & 信息隐藏简介

我是小白呀的博客 6962

有关封装和信息隐藏的误区

<br />本文转自http://www.myext.cn/other/11393.html,版权归作者所有。如有侵权行为,请联系本人删除,谢谢!<br /> <br /> <br /> <br />次介绍Python的面对对象特性 ,其中扯到了封装(Encapsulation)等概念。当时为了不跑题,没有深入聊这些概念。考虑到很多开发人员对这些概念,经常混淆不清。今天再专门来说一下。<br /><br />  ★封装<br />  ◇什么是封装?<br />  从字面意思来看,封装就是把一些相关的 东西打

keepliving 838

Javascript基础知识篇(3): 面向对象之封装和信息隐藏

在"初识Javascript"章节中,提到通过作用域和闭包来隐藏内部细节,并给外部提供访问接口,就初次接触到了信息隐藏的概念了。同时,我们知道在面向对象的高级语言中,创建包含私有成员的对象是最基本的特性之一,提供属性和方法对私有成员进行访问来隐藏内部的细节。虽然JS也是面向对象的,但没有内部机制可以直接表明一个成员是公有还是私有的。还是那句话,依靠JS的语言灵活性,我们可以创建公共、私有和特权成员...

weixin_34265814的博客 496
上一篇: c# 综合测试题
下一篇: 给出两个点的座标可计算出两点间直线距离
JavaAlpha
博客等级 码龄18年 910粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值