首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“封装”是否有助于并行开发多个模块?

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

Stack Overflow用户
提问于 2015-08-02 08:14:40
回答 2查看 289关注 0票数 0

在经历了这些问题之后,我了解到,

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

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

在java 培训教室里,我了解到,封装具有以下优点:

为什么封装是你的朋友? 1实现与功能无关。拥有接口文档的程序员可以独立地实现新版本的模块或ADT。一个新的、更好的实现可以取代旧的实现。 2封装防止Doug编写破坏模块内部数据的应用程序。在实际编程中,封装减少了调试时间.很多。 3 ADT可以保证它们的不变量被保留。 4团队合作。一旦您严格定义了模块之间的接口,每个程序员就可以独立地实现一个模块,而无需访问其他模块。一个大型、复杂的编程项目可以分解成几十个部分。 5文档和可维护性。通过定义一个明确的接口,您可以使其他程序员更容易修复在您离开公司多年后出现的bug。许多bug是模块之间不可预见的交互的结果。如果每个接口和每个模块的行为都有明确的规范,那么bug就更容易跟踪。 当你的项目不起作用时,就更容易找出该怪哪个队友了。

问题1:

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

问题2:

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

EN

回答 2

Stack Overflow用户

发布于 2015-08-02 08:23:56

(1)接口应该被广义地解释;因为它有一些特定的技术含义,所以我倾向于使用合同一词(从“按合同设计”)来表示相同的东西。它是关于如何与特定模块(或某种模块)交互的正式规范。一个很好的例子是Collections;List通常是一个ArrayList,但是它可以是一个LinkedList、一个ImmutableList,或者是一些更有异国情调的东西,比如一个延迟加载的数据库代理。在我的代码中,我几乎从不关心它的具体类型;我只是与List接口交互。

(2)如果使用了实际的Java接口(或等效接口),那么在开发过程中很容易创建要使用的组件的模拟或脚手架版本。例如,我刚刚实现了一个发送电子邮件的系统。当我让系统的其他部分准备好实际发送订单时,我使用了一个假邮件服务,它只是写日志消息,假装发送邮件。这样,我就可以测试系统中本应调用邮件服务的部分是否正常工作,而不是实际发送邮件。

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

票数 0
EN

Stack Overflow用户

发布于 2015-08-23 14:00:38

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

维基百科定义抽象如下:

抽象在其主要意义上是一个概念过程,通过这个过程,一般规则和概念是从特定示例、字面(“真实”或“具体”)符号、首要原则或其他方法的使用和分类中派生出来的。“抽象”是这一过程的产物--作为所有从属概念的超范畴名词的概念,并将任何相关概念作为一个组、字段或范畴连接起来。

用于数学

数学中的抽象是指提取数学概念的内在本质,消除对原本可能与之相联系的现实世界对象的依赖,并加以推广,使其在其他类似现象的抽象描述中有更广泛的应用或匹配。

计算机科学

在计算机科学中,抽象是一种管理计算机系统复杂性的技术。它的工作方式是建立一个人与系统交互的复杂程度,从而抑制当前级别以下更复杂的细节。

总之,抽象是泛化的过程,抽象是这个过程的结果。

通过推广某些东西,我们可以使它更广泛地应用(可重用)。例如,如果我有一种分类人的方法和一种分类猫的方法,我可以推广一种方法来对任何可以两两比较的事物进行排序。这种方法有很多的应用。这是一个有用的抽象。

通过概括某一事物,我们对待一整组事物都是一样的,而不再关心我们正在考虑的具体事情。在上面的示例中,我对要排序的对象类型进行了抽象,并抽象出了它们的内部表示。

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

在计算机科学中,信息隐藏是将最有可能发生变化的计算机程序中的设计决策分离开来的原则,从而保护程序的其他部分不受设计决策改变时的广泛修改。保护包括提供一个稳定的接口,以保护程序的其余部分不受实现(最有可能发生更改的细节)的影响。 换句话说,信息隐藏是一种防止类或软件组件的某些方面被客户端访问的能力,可以使用编程语言特性(如私有变量)或显式导出策略。

也就是说,信息隐藏是强制抽象的一种方法。我们不仅允许调用者以抽象的方式思考,我们还通过隐藏他们不应该考虑的具体事情的知识来迫使他们这样做。

有了它,我们终于可以讨论封装,维基百科的定义如下所示:

封装是将数据和功能打包到一个组件中。在大多数面向对象的编程语言中,使用类支持封装的特性,尽管还有其他的替代方法。它允许在对象中选择性地隐藏属性和方法,方法是建立一个无法穿透的墙,以防止代码意外损坏。

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

考虑到这一理论,关于你们的问题:

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

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

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31769882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档