当前位置: 首页 > 知识库问答 >
问题:

封装是否有助于并行开发多个模块?

姚钊
2023-03-14

经过这么多的提问,我了解到,

封装是关于保护不变量和隐藏实现细节。

抽象与分离接口和实现有关。

从课堂java培训中,我了解到,封装有以下优点,

为什么封装是你的朋友?

[1] 实现独立于功能。拥有接口文档的程序员可以独立实现模块或ADT的新版本。新的、更好的实现可以取代旧的实现。

[2] 封装防止Doug编写损坏模块内部数据的应用程序。在现实编程中,封装缩短了调试时间。很多

[3]ADT可以保证它们的不变量被保留。

[4]团队合作。一旦严格定义了模块之间的接口,每个程序员就可以独立地实现一个模块,而无需访问其他模块。一个大型、复杂的编程项目可以分成几十个部分。

[5] 文件和可维护性。通过定义一个明确的接口,您可以让其他程序员更容易地修复您离开公司几年后出现的错误。许多bug是模块之间无法预料的交互作用的结果。如果每个接口和每个模块的行为都有明确的规范,那么bug就更容易跟踪。

[6] 当你的项目不起作用时,就更容易找出该责备哪位队友。

问题一:

Wrt Point1(上面)说,一个新的,更好的实现可以取代旧的。这是抽象而不是封装的目标。我说的对吗?

问题二:

Wrt第4点(上文),封装如何帮助程序员独立实现模块而无需访问其他模块?模块的并行实现与封装有什么关系?因为封装是关于在变体中进行保护。这个答案也支持我的论点

共有2个答案

狄卓君
2023-03-14

要回答这个问题,我们必须澄清“抽象”和“封装”的含义。

维基百科对抽象的定义如下:

抽象在其主要意义上是一个概念化的过程,通过这个过程,一般规则和概念从具体例子、字面(“真实”或“具体”)能指、第一原则或其他方法的使用和分类中衍生出来。“抽象”是这个过程的产物,这个概念充当所有从属概念的超范畴名词,并将任何相关概念连接为一个组、字段或类别。

对于数学:

数学中的抽象是提取数学概念的基本本质的过程,消除对它最初可能与之相连的现实世界对象的任何依赖,并对其进行概括,使其具有更广泛的应用,或与等价现象的其他抽象描述相匹配

和计算机科学:

在计算机科学中,抽象是一种管理计算机系统复杂性的技术。它的工作原理是确定一个人与系统交互的复杂程度,将更复杂的细节隐藏在当前级别之下。

总之,抽象是概括的过程,抽象是这个过程的结果。

通过泛化某些东西,我们使其更广泛地适用(可重用)。例如,如果我有一个对人排序的方法,和一个对猫排序的方法,我可以推广一个对任何可以成对比较的东西进行排序的方法。这种方法有许多应用。这是一个有用的抽象概念。

通过概括某件事,我们对一整组事情都一视同仁,不再关心我们在想哪件具体的事情。在上面的例子中,我抽象了要排序的对象的种类,并抽象了它们的内部表示。

因此,抽象与信息隐藏的概念密切相关,维基百科对此定义如下:

在计算机科学中,信息隐藏是将计算机程序中最有可能发生变化的设计决策分离开来的原理,从而在设计决策发生变化时保护程序的其他部分不受广泛修改。保护包括提供一个稳定的接口,保护程序的其余部分不受实现的影响(最有可能更改的细节)。

换句话说,信息隐藏是一种使用编程语言功能(如私有变量)或显式导出策略来阻止客户端访问类或软件组件的某些方面的能力。

也就是说,信息隐藏是一种强制抽象的方法。我们不仅允许我们的呼叫者进行抽象思考,我们还通过隐藏他们不应该思考的具体事物的知识,迫使他们进行抽象思考。

至此,我们终于可以讨论封装了,Wikipedia对封装的定义如下:

封装是将数据和函数打包到单个组件中。在大多数面向对象编程语言中,使用类支持封装特性,尽管也存在其他替代方案。它允许通过构建一堵不可穿透的墙来选择性地隐藏对象中的属性和方法,以防止代码意外损坏。

也就是说,封装是一种信息隐藏(我们隐藏字段或方法)。

考虑到这一理论,请回答您的问题:

Wrt Point1(上面)说,一个新的,更好的实现可以取代旧的。这是抽象而不是封装的目标。我说的对吗?

由于封装可以用于强制抽象,因此它可以促进抽象的使用,从而有助于获取抽象的好处。事实上,这就是封装的目的。

但是,没有抽象的封装不会促进实现交换,这是正确的。这种封装未能达到其目的;它被滥用了。

也就是说,您引用的文章默认封装已被正确使用。

封装如何帮助程序员在不访问其他模块的情况下独立实现模块?模块的并行实现与封装有什么关系?因为封装是关于在变体中进行保护。

如果不变量是通过封装来保护的,调用代码可能不需要知道这个不变量。如果是,则该不变量已被抽象掉,调用代码的开发不受该不变量的影响,即其他模块可以独立于该不变量而开发。

岳毅
2023-03-14

(1)界面应该被广义地解释;因为它有一些特定的技术含义,我倾向于倾向于术语合同(从“合同设计”)来表示同样的事情。它是如何与特定模块(或某种模块)交互的正式规范。一个很好的例子是集合应用编程接口;一个List通常是一个ArrayList,但是它可以是一个LinkedList,一个ImmutableList,或者一些更奇特的东西,比如懒加载数据库代理。在我的代码中,我几乎从不关心它是哪个特定的类型;我只是与List接口交互。

(2) 如果使用了实际的Java接口(或等效接口),则很容易创建组件的模拟或支架版本,以便在开发过程中使用。例如,我刚刚实现了一个发送电子邮件的系统。当我让系统的其余部分准备好实际发出发送命令时,我使用了一个伪造的邮件服务,它只是写日志消息假装发送邮件。通过这种方式,我可以测试我的系统中应该调用邮件服务的部分是否在实际发送邮件的情况下正常工作。

在更大的范围内,我使用SpringMVC来处理我的应用程序的Web层。SpringMVC与ServletAPI交互,以与Servlet容器(本质上就是Web服务器本身)接口。Spring团队不需要知道关于服务器的任何其他信息;不同的团队已经编写了几个不同的servlet容器(Tomcat、Jetty、Undertow、WebLogic),但是由于每个人都使用一个公共接口,所以他们不必进一步协调他们的开发工作。

 类似资料:
  • 英文原文:http://emberjs.com/guides/templates/development-helpers/ 开发助手 Handlebars和Ember中定义了一些可以简化开发模板的助手。这些助手可以方便的将变量输出到浏览器的控制台中,或者在模板中激活调试。 日志 {{log}}助手可以方便的将当前渲染上下文中的变量、表达式输出到浏览器的控制台中: 1 {{log 'Name is

  • 在学习了并发之后,我一直计划在项目中使用并发。现在我没有在多线程或并发上做太多工作,所以决定在实际项目中使用它之前学习并进行一个简单的概念验证。 以下是我尝试过的两个例子: 现在,在每种方法运行了20多次之后进行分析 第一次并发平均需要451毫秒 第二个无并发的平均时间为290毫秒 现在我了解到这取决于配置、操作系统、版本(java7)和处理器。但这两种方法都是一样的。还了解到,当计算量很大时,并

  • 问题内容: 我正在寻找一个简单的基于进程的python并行映射,即一个函数 它将在不同进程上的[data]的每个元素上运行函数(嗯,在不同的内核上,但是AFAIK,在python中的不同内核上运行的唯一方法是启动多个解释器),并返回结果列表。 是否存在这样的东西?我想要一些 简单的 东西,所以一个简单的模块会很好。当然,如果不存在这样的东西,我会为一个大图书馆而定:-/ 问题答案: 我似乎您需要的

  • 爱是恒久忍耐,又有恩慈;爱是不嫉妒,爱是不自夸,不张狂,不作害羞的事,不求自己的益处,不轻易发怒,不计算人的恶,不喜欢不义,只喜欢真理;凡事包容,凡事相信,凡事盼望,凡事忍耐。(1 CORINTHIANS 13:4-7) 多态和封装 “多态”和“封装”是OOP的重要特征——前面说的“继承”也是。但是,对于Python而言,对这两个的理解也有很多不同。建议读者“吃百家宴”,到网上搜一搜有关话题,不少

  • 问题内容: 我读过猫鼬每个集合最多只能打开一个连接,并且没有选择来更改它。 这是否意味着缓慢的mongo查询将使所有后续查询都等待? 我知道node.js中的所有内容都是非阻塞的,但是我想知道慢速查询是否会延迟所有后续查询的执行。以及是否有办法改变这一点。 问题答案: 如果使用mongoose.connect()的默认方法,则它仅使用一个连接。要解决此问题,您可以创建多个连接,然后将指向同一架构的