问题标签 [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.

0 投票
3 回答
354 浏览

actionscript-3 - 通过构建简洁的库来隐藏复杂性

我正在开发一个包含一堆互锁部分(服务器、客户端、库等)的产品,其中一个是一个微型库,用户将链接到他们自己的客户端代码(有点像 Flickr API 或谷歌地图 API)。一旦他们包含了那个库,所有的互锁位都会神奇地连接在一起。所以 API 的简单性是一个主要的、重要的目标。

我向用户公开的 API 总共有两个类和七个公共方法。简单的豌豆,柠檬汁。

但简单是一种精心制作的错觉。我分发的库实际上依赖于另一个库,它自己有 136 个类(以及一千多个公共方法)。在构建过程中,我将这两个库链接到一个可交付成果中,以方便 API 使用者的集成和部署。

我现在面临的问题是,我不希望最终用户(集成我的软件以增强他们自己的功能的应用程序开发人员)被所有这些额外的麻烦所困扰,淹没在不必要的复杂性洪流中。

从外面看,这个库应该看起来正好包含两个公共类,正好有七个公共方法。

您如何在自己的项目中处理此类事情?我对与语言无关的解决方案以及针对不同语言、编译器和构建工具的各种技术感兴趣。

在我的具体情况下,我正在为带有 SWC 库文件的 flash 平台(AIR/Flex/Actionscript)进行开发。构建方法类似于 Java 平台,其中所有类都捆绑到具有相同可见性的压缩代码模块中(从概念上讲,Actionscript SWC 文件与 Java JAR 文件几乎完全相同)。

.NET 没有用于类和方法的“内部”修饰符吗?这正是我正在寻找的东西,如果有人知道隐藏 SWC 边界之间类的可见性的棘手技术,我很想听听。

0 投票
5 回答
1013 浏览

abstraction - 信息隐藏与隐藏的依赖关系

在过程(或功能、模块等)设计中,有哪些常见的最佳实践来平衡对信息隐藏的需求和过程接口中适当的抽象级别与引入隐藏依赖项所固有的问题?

更具体地说,假设我编写了一个名为 getEmployeePhoneNbr(employeeId) 的过程。在内部,该过程是通过查询以employeeId 为键的数据库表来实现的。我想隐藏那些实现细节,但现在该过程依赖于一个外部文件,如果环境发生变化,这会阻碍它的使用。

任何时候过程使用外部资源(文件、数据库等)时都会发生相同的情况。在过程中硬编码该资源的使用感觉是错误的,但我不确定替代方案是什么。

请注意,我不是在使用面向对象的语言。在可能的范围内,我最感兴趣的是广泛适用于任何类型语言的响应。

谢谢,马特

0 投票
11 回答
13975 浏览

java - 在java中运行的程序之间存储数据的最佳方式?

在 Java 中运行的程序之间存储数据的最佳方式是什么?我已经知道您可以使用文本文件并以这种方式存储信息,但我想知道是否有更好的方法来存储程序在程序运行之间生成的信息。

另外,有什么办法可以保证信息的安全吗?具体来说,我想让最终用户无法访问它。

0 投票
4 回答
525 浏览

javabeans - JavaBeans 的设计如何与信息隐藏相匹配?

两个学期前,我有一位教授说:

你们中的一些人被告知总是为所有私有实例变量包含 setter 和 getter 方法。我说这打破了信息隐藏,并经常导致无法强制执行不变量的系统。

现在,这听起来对我来说是正确的。但是,包括这些类型的 setter/getter 不是创建 JavaBeans 的核心部分吗?如果是这样,为什么?如果不是,我对 JavaBeans 有什么误解?

0 投票
2 回答
1090 浏览

oop - 封装是抽象的子集吗?

由于封装和抽象都与信息隐藏有关,我可以将封装理解为抽象的子集吗?

0 投票
2 回答
136 浏览

c# - 您如何隐藏除一次课程之外的所有数据?

我正在尝试修复我最近在我们的某些软件中遇到的设计缺陷,而无需重新编写整个软件。有一个 .exe 具有一个消息侦听器线程,该线程从某个服务器接收数据,然后将其写入一个单独的 DLL 中的类(我们称之为 StaticDataClass),该类存储它接收到的所有数据(大部分是静态的)在启动时从数据库中提取)。此类还提供其他类可用于检索数据的方法。问题是存储(设置)方法都是公共的,因此任何其他类都可以覆盖这些数据并破坏整个应用程序。除了可执行文件本身包含的对象之外,我有什么好方法可以保护所有对象的数据(使 set/store 方法不可见)?

现在我正在玩弄一个只定义公共 getter 的接口,然后让一个单例类实现该接口,然后 Instance 属性将返回接口类型,因此他们将只能使用接口中声明的 get 方法. 但是当可执行文件启动时,它会以某种方式获得对 StaticDataClass 对象而不是接口类型的实际引用,因此它也能够调用 store/set 方法。

这并不完全证明,但它可以防止一些不熟悉系统的开发人员认为可以使用这些公共存储方法,因为 Visual Studio 智能型使它们在编码时可见。相反,他们将不得不尝试通过将对象转换为包含存储方法的类型来打破它。

有没有更清洁的方法来做到这一点?

0 投票
2 回答
243 浏览

information-hiding - 隐藏信息如何帮助模块化?

信息隐藏如何帮助解耦构成系统的模块?

0 投票
8 回答
2609 浏览

c# - 您将私有方法的单元测试放在哪里?

C# 类中私有函数的单元测试放在哪里?

维基百科中的一篇文章建议:

  • 将测试与他们正在测试的成员放在同一个类中
  • 使用部分类

就个人而言,这些方法似乎都不合适,我更喜欢将单元测试完全放在一个单独的项目中。

对此有什么想法吗?

(我知道关于是否应该测试私有方法存在相当多的争论。我想听听双方的争论。)

0 投票
5 回答
6839 浏览

asp.net-mvc - 如何在我的项目中实现一个健壮的每请求会话模式,同时专注于信息隐藏?

我目前正在构建一个 ASP.NET MVC 项目,其中 NHibernate 作为其持久层。

目前,已经实现了一些功能,但只使用本地 NHibernate 会话:访问数据库(读取或写入)的每个方法都需要使用“using()”子句实例化自己的 NHibernate 会话。

问题是我想利用 NHibernate 的延迟加载功能来提高我的项目的性能。

这意味着在呈现视图之前,每个请求都有一个打开的 NHibernate 会话。此外,必须支持同时请求(同时多个会话)。

我怎样才能尽可能干净地做到这一点?

我在网上搜索了一下,了解了 session-per-request 模式。我看到的大多数实现都使用某种 Http*(HttpContext 等)对象来存储会话。此外,使用 Application_BeginRequest/Application_EndRequest 函数很复杂,因为当我只想为每个请求实例化一次会话时,它们会为每个 HTTP 请求(aspx 文件、css 文件、js 文件等)触发。

我担心的是我不希望我的视图或控制器能够访问 NHibernate 会话(或者,更一般地说,NHibernate 命名空间和代码)。这意味着我不想在控制器级别或视图级别处理会话。

我有几个选择。哪一个看起来最好?

  • 使用在控制器操作之前和之后触发的拦截器(如在 GRAILS 中)。这些将打开和关闭会话/交易。这在 ASP.NET MVC 世界中可能吗?
  • 在 Web 上下文中使用 NHibernate 提供的 CurrentSessionContext Singleton。以这个页面为例,我认为这是很有希望的,但这仍然需要控制器级别的过滤器。
  • 使用 HttpContext.Current.Items 存储请求会话。再加上 Global.asax.cs 中的几行代码,可以轻松地为我提供请求级别的会话。但是,这意味着将在 NHibernate 和我的视图(HttpContext)之间注入依赖关系。

非常感谢你!

0 投票
5 回答
166 浏览

language-agnostic - 在类中公开列表的最合适方法是什么?

想象以下模型:

  • 一个有很多
  • A Row有许多单元格

以“面向对象的方式”处理这些类的更好接口是什么?

1 - 提供对属性/单元格的访问(不一定公开底层数据结构,但创建例如类 RowCollection...)

2 - 或者直接在TableRow类中提供方法

3 - 以上都不是...