问题标签 [information-hiding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
encapsulation - 抽象 VS 信息隐藏 VS 封装
你能告诉我软件开发中的抽象和信息隐藏有什么区别吗?
我很困惑。抽象隐藏了细节实现,而信息隐藏抽象了某物的全部细节。
更新:我为这三个概念找到了一个很好的答案。请参阅下面的单独答案以获取从那里获取的几个引文。
c++ - 为什么要使用“PIMPL”成语?
背景资料:
PIMPL Idiom (指向 IPLementation的指针)是一种实现隐藏技术,其中公共类包装了在公共类所属的库之外无法看到的结构或类。
这对库的用户隐藏了内部实现细节和数据。
在实现这个习惯用法时,为什么要将公共方法放在 pimpl 类而不是公共类上,因为公共类的方法实现将被编译到库中并且用户只有头文件?
为了说明,此代码将Purr()
实现放在 impl 类上并包装它。
为什么不在公共类上直接实现 Purr 呢?
python - 为什么 Python 的“私有”方法实际上不是私有的?
Python 使我们能够通过在名称前添加双下划线来在类中创建“私有”方法和变量,例如:__myPrivateMethod()
. 那么,如何解释这一点
这是怎么回事?!
我会为那些不太明白的人解释一下。
我用公共方法和私有方法创建了一个类并实例化它。
接下来,我调用它的公共方法。
接下来,我尝试调用它的私有方法。
这里的一切看起来都不错;我们无法调用它。事实上,它是“私人的”。嗯,实际上并非如此。在对象上运行dir()揭示了 Python 为所有“私有”方法神奇地创建的新神奇方法。
这个新方法的名字总是一个下划线,然后是类名,然后是方法名。
封装这么多,嗯?
无论如何,我总是听说 Python 不支持封装,那么为什么还要尝试呢?是什么赋予了?
information-hiding - 什么是嵌套函数?它们是干什么用的?
我从未使用过嵌套函数,但在几种语言中看到过对它们的引用(以及嵌套类,我认为它们是相关的)。
- 什么是嵌套函数?
- 为什么?!?
- 您可以用其他任何方式都无法做到的嵌套函数做什么?
- 如果没有嵌套函数,这很难或不优雅,你能用嵌套函数做什么?
我假设嵌套函数只是将所有内容视为对象的工件,如果对象可以包含其他对象,那么它就会遵循。
嵌套函数是否具有范围(通常,我认为语言对此有所不同)就像函数内的变量具有范围一样?
如果您不确定您的答案是否与语言无关,请添加您所引用的语言。
-亚当
language-agnostic - 通过信息隐藏进行有效封装的绝妙例子?
”抽象和封装是互补的概念:抽象关注对象的可观察行为……封装关注引起这种行为的实现……封装通常通过信息隐藏来实现,即隐藏所有信息的过程对象的秘密对其本质特征没有贡献。” - Grady Booch面向对象分析和设计
你能告诉我一些通过信息隐藏封装的好处的令人信服的例子吗?
security - 混淆或隐藏服务器到客户端状态更新
我实际上并没有自己编写这个软件,但我突然想到我不知道如何解决这个问题。作为解释这个问题的最佳方式,我将描述一个假设的多人第一人称射击游戏的特定场景......
- 玩家 A 躲在一些朝西的灌木丛中
- 玩家 B 正从东面偷袭玩家 A,或潜入玩家 A 身后
为这个游戏编写的一个流行的“hack”是让玩家 A 有一个雷达来显示玩家 B 的位置,即使他在屏幕上看不到玩家 B,而且游戏不支持雷达。这种破解是可能的,因为服务器正在向特定范围内的所有玩家(可能在玩家 A 的剪裁平面内)向玩家 A 的客户端发送信息。(据我所知)服务器尝试仅向玩家 A 的客户端发送玩家 A 视野内玩家的信息是不现实的。因为服务器必须将所有附近玩家的信息发送到玩家 A 的客户端,玩家 A 可以编写一个 hack,在他的屏幕上覆盖一个雷达,通过观察发送到客户端的数据并提取敌方玩家状态更新来填充该雷达。我认为这些通常被称为“雷达”或“
有没有办法在发送给客户端的信息中混淆或隐藏敌方玩家的状态更新?据我了解,加密对于实时解决方案不可行?即使服务器只能在玩家 A 的视野范围内发送玩家的状态更新,这仍然允许玩家 A 的 hack 显示玩家躲在伪装或掩护物体后面(大概是透明的)。
我唯一能真正想到的就是实施某种类型的“punkbuster”解决方案。也就是说,让玩家 A 的客户端定期扫描非法进程。这个想法是任何流行的黑客都会受到监控。不受欢迎的黑客攻击会影响足够小的玩家群,以至于他们太小而无法追踪。
language-agnostic - 将 *interface* 或 *object* 作为参数传递给函数会更好吗?
我试图说服一位同事,函数应该将接口作为参数,而不是对象本身。我认为小对象可以很好地传递,但对于大对象,我会给它们一个接口,只是传递 i/f,而不是全部。
请注意,这些大类中只会有一个——i/f 永远不会用于不同的对象。这仅仅是为了隐藏对象的实现。
你同意将一个大类分成一个接口是好的做法吗?
这样做有什么缺点吗?
例子:
refactoring - 在进行代码重构时需要隐藏多少信息?
需要隐藏多少信息?在删除记录之前,我有样板代码,如下所示:
注意:样板代码是代码生成的,包括“使用(var cmd = new NpgsqlCommand(...)”
但我正在认真考虑重构样板代码,我想要一个更简洁的代码。这就是我设想重构代码的方式(使用扩展方法变得更好(不是唯一的原因;))
我希望执行标量和样板代码进入扩展方法。
对于我上面的代码,它是否需要代码重构/信息隐藏?我的重构操作看起来太不透明了吗?
delphi - 在 Delphi 中使用框架来隐藏 GUI 信息
在过去的 3 年里,我一直在兴趣/职业层面上学习 Delphi。我很高兴地说,我现在已经进步到可以带着恐惧和尴尬回顾我早期的代码了。所以我现在正在浏览我的一些早期应用程序并重写/重构它们。
我试图摆脱的一个坏习惯是从另一个单元访问一个表单上的组件。为了实现这一点,我一直在尝试使用框架作为信息隐藏的方法。因此,我没有创建一个带有组件的表单,而是创建一个框架来保存所有表单组件,然后将框架放置在表单上,将框架声明移动到私有声明中,
然后在表单初始化部分注册框架
然后我在表单单元的公共部分声明我需要的属性,它可以访问框架及其组件。
我还使用框架来合并经常重复的组件组。
这似乎适用于我想要的目的(隐藏 Myframe 及其组件),但是其他人有这种方法的经验吗?
使用框架有什么缺点吗?我真的从这样做中获得任何好处吗?在框架内使用嵌套框架有什么问题吗?在 Delphi 中使用框架是否有任何好的实践指南?关于隐藏在 Delphi 中的 GUI 信息,是否有更好/更简单的方法来实现相同的效果?
血红蛋白
image - 如何在 jpg 或 gif 照片中隐藏信息?
如何在不破坏图像的情况下在 jpg 或 gif 等照片文件中写入一些信息?当然没有在照片上显示它,因为整个想法是在任何人都无法检测到的照片文件中发送信息(在某种程度上提供安全/隐私)!