通过将功能变成一个功能,不仅构成一个例子封装或者你需要使用对象都封?

我试图理解这个概念的封装。我认为如果我从这样的事情:

n=n+1

这是执行在野外作为一部分大体的代码然后我把它,并把它放在一个函数如此之一,然后我有封装,除了逻辑的一种方法:

addOne(n)
    n = n + 1
    return n

或是更多的情况,它是唯一封如果我躲藏的详细信息addOne从外面的世界-如果它是一个目的方法和我使用一个接修改的私人/保护?

有帮助吗?

解决方案

也许你是混乱的抽象与封装,它是理解在更广泛的背景下对象的取向。

封装适当地包括所有三个以下:

  • 抽象
  • 执行隐藏
  • 分的责任

抽象的一个组成部分的封装。在你的例子你有抽象的添加功能,从主体的代码,在其它一旦居住。你做到这一点通过确定一些共同的代码-认识到一个概念(外)在特定情况下(数添加一个变量n)。因为这种能力,抽象使得一个封装的部件--的一个方法或对象的可重复使用。

同样重要的概念封,是实现躲藏。这就是为什么封装的是讨论竞技场的对象的取向。执行保护隐藏一个对象从其用户反之亦然。在OO,这可以通过提出一个界面的公共方法的用户的对象,同时执行对象的发生内的私人方法。

这有两个好处。第一,通过限制进入你的对象,可避免的情况下用户的目的可以保留对象的无效状态。第二,从用户的角度看,当他们用你的对象,他们仅仅是松散耦合对它的-如果你改变你的执行情况后来,他们不会受到影响。

最后,司responsility-在更广泛的背景下OO的设计-是什么,必须考虑到的地址进行封装正常。这是没有用的封装的随机收集的职能责任需要清洁、逻辑上的定义,以便有少重叠或歧义的可能。例如,如果我们有一个卫生间的对象,我们会想到墙关闭其领域的责任从我们的厨房对象。

在一个有限的意义上,虽然,你是正确的这一功能,让我们说,'模块化'的某些功能通过抽象。但是,正如我已经说过,'封'作为一术语被理解在更广泛的背景下对象的取向适用一种形式的模块化,以满足三个标准上面列出的。

其他提示

我将是第一个与什么似乎是答案趋势不同意。是的,一个函数封装实现的一些数额。你并不需要一个对象(我想你用它来指类)。

请参阅迈尔斯的太

当然它是。

例如,才动作其参数的方法将被认为是比在全局静态数据进行操作的方法“更好包封的”。

封装已经存在了很长OOP之前:)

一个方法是没有更多的封装比汽车的一例良好的驾驶的示例。封装是不是关于synax,这是一个合乎逻辑的设计问题。对象和方法能够表现出好的和坏的封装。

去想它最简单的方法是代码是否隐藏/从抽象没有必要知道关于执行/护理代码的其他部分的细节。

让我们回到车例如: 自动变速器提供了良好的封装:作为司机,你关心的前进/后退和速度。 手动变速器是坏的封装:从驱动器的角度来看低/高的速度所需要的特定齿轮通常是不相关的向驾驶员的意图

没有,对象不是需要用于封装。在非常广泛的意义,“封装”只是意味着“隐藏从视图中的范围”,在这方面的方法包封它的实现细节。

这并不真正意味着你可以走出去,说你的代码是精心设计的,因为你将其划分成方法,虽然。由500种的公共方法的程序是不是在一个1000行的方法来实现该相同节目也好不了多少。

在建项目,无论你使用面向对象技术或没有,你需要考虑在封装许多不同的地方:隐藏方法的实现细节,从代码,不需要隐藏数据知道这一点,从而简化了对模块的接口,等等。

<强>更新:要回答您的更新的问题,无论是“把代码中的方法”和“使用接入修饰语”是封装逻辑的不同的方式,但在不同的级别每一个行为

把代码中的方法的隐藏代码的各条线组成该方法使得呼叫者不需要关心的那些线;他们只担心方法的签名。

上的类作为检举的方法(比如说)“私人”隐藏了方法,使得一个消费者的不需要担心;他们只担心你的类的公共方法(或属性)。

这是一个组件级事

检查的出:

  

在计算机科学中,封装是一个定义的接口后面的软件组件的内部机制和数据结构的遮盖,以这样的方式使组分的用户(软件件等)只需要知道组件做什么,不能让自己依靠的是怎样做的细节。的目的是实现一种用于改变电势:该组件的内部机构而对其他部件的影响来改善,或者该部件可以与支持相同的公共接口的不同的一个来替换

(我不太明白你的问题,让我知道,如果该链接不包括你的疑惑)

封装的抽象的概念,意味着你隐藏实现细节。面向对象的,但使用ecnapsulation的一个例子。另一个例子是称为模块-2,使用(或使用)执行的模块和模块定义的语言。定义模块藏在实际执行,因此提供封装。

封装用的时候可以考虑别的一个黑盒子。对象是一个黑盒子。你知道他们提供的方法,但它们不是如何实现的。

[编辑] 至于更新问题的例子:这取决于你如何窄或宽的定义封装。您AddOne例子并不隐瞒什么,我相信。这将是信息隐藏/封装如果您的变量将是一个数组的索引,你会打电话给你的方法MOVENEXT,也许有另一种功能的setValue和getValue。这将允许人(一起可能与其他一些功能)与他们使用数组是意识到在浏览您的结构以及设置和获取变量。如果您的编程语言将支持其他或更丰富的概念,你可以改变MOVENEXT,的setValue和getValue的实施与不断变化的意义和接口。对我来说是封装。

让我们简化这个有点用一个比喻:你把你的车钥匙,并启动。你知道,有不仅仅是密钥来了,但你不知道的的知道的什么的是有事情。对你来说,关键的转=电机启动。关键的(即,例如,函数调用)的接口隐藏起动电机的旋转发动机的实施,等等...(执行)。的这是封装。你不必知道什么是引擎盖下回事幸免,你很高兴吧。

如果你创建了一个人工的手,说,把你的钥匙,这是不会封装。你打开额外的中间人克鲁夫特的关键不隐藏任何东西。这就是你的榜样让我想起了 - 这不是封装实现细节,尽管两者都是通过函数调用来完成的。在这个例子中,任何人都拿起你的代码不会感谢你。他们,其实,更可能的俱乐部你与你的人工手。

你能想到的隐藏信息的任何方法(类,函数,动态库,宏)可用于封装。

封装是其中的属性的处理(数据成员)和在组合在一起作为单个实体指作为一个类对象的行为(成员函数)。

开放分布式处理的参考模型 - 由国际标准化组织写入 - 定义了以下概念:

实体:任何所关心的具体或抽象的事

对象:实体的模型。对象的特征是它的行为和,双重,通过它的状态。

行为(一个对象的):用一组约束的动作时,可能会发生在他们的集合

接口:一个由该对象一起的一组约束的交互的子集的时可能出现它们上的对象的行为的抽象

封装:包含在一个对象中的信息是可访问的,只有通过在由对象所支持的接口的交互的属性

这些,你会明白,是相当广阔的。然而,让我们来看看,是否将一个函数内的功能逻辑上可以视为对这些条款的封装构成。

首先,函数显然的一个模型中,“感兴趣的东西,”,因为它代表欲望执行的算法你(大概)和该算法涉及一些问题,你正在试图解决(并且因此是一个模型的话)。

做一个函数有行为?答案当然是肯定的:它包含了动作的集合(可以是任何数量的可执行语句),它们的功能必须从某处被调用之前,它可以执行的约束下执行。函数可能不会自发地在任何时候被调用,而不致病因素。听起来像法律术语?完全正确。但是,让我们在犁地,不过。

的函数是否具有一个接口?答案当然是肯定的:它有一个名字和形式参数的集合,这反过来又映射到包含在该函数中的可执行语句,一旦调用函数的名称和参数表被理解为唯一标识的可执行文件的集合无需主叫方的规定与实际报表中运行的语句。

是否一个函数具有这样的性质,包含在功能信息是可访问的,只有通过在由所述对象支持的接口的交互?嗯,那么,就可以了。

由于一些信息是经由其接口访问,有些信息必须被隐藏,并且在函数内不可访问。 (属性这样的信息呈现出被称为信息隐藏,其中通过帕尔纳斯主张模块应该被设计为隐藏既困难决定和可能改变的决定来定义。)因此,在函数内部隐藏?什么样的信息

要看到这一点,首先要考虑规模。一些类将被公开(因此是在包的接口),有的只会是包私有的(因此信息隐藏在包内):声称,例如,Java类可以在一个封装内封装很容易。在封装理论上,类构成节点和包形成包封的区域,与整体形成封闭曲线图。的类和包的图被称为第三曲线图。

声称函数(或方法)本身被封装类别内它也很容易。同样,某些功能将是公开的(因此是类接口的一部分)和一些将是私有的(和类中,因此信息隐藏)。的函数和类的图表称为第二曲线图。

现在我们来到的功能。如果功能是封装的手段它们本身就应该包含一些信息公开的其他功能和一些信息,是信息隐藏在函数中。那会是什么信息呢?

一个候选由麦凯布给我们。在圈复杂他的划时代的论文,托马斯麦凯布描述了“图表中的每个节点对应于一个代码块中的程序源代码其中流动是连续的,所述的弧对应于程序所采取的分支。“

让我们以顺序执行作为信息单元,其可以在函数内被封装的McCabian块。由于函数中的第一个块总是要执行的第一个也是唯一保证块,我们可以考虑的第一个块是公共的,因为它可能被其它函数调用。所有的函数内的其它块,然而,不能由其它函数调用(除了语言,其允许跳进功能中等流动)等这些块可被视为信息隐藏功能之内。

考虑到这些(也许稍微脆弱)的定义,那么我们就可以说是:把一个函数内的功能并不构成对封装。函数内的块的封装是第一曲线图。

有一个caveate,但是。你会考虑一个程序包,其每一个类被公众封装?根据上述定义,它通过测试,你可以说,界面包(即所有的公共类)确实提供包的行为对其他包的子集。但在这种情况下,子集是整个包的行为,因为没有类信息隐藏起来。因此,尽管regorously满足上述定义,我们认为它不符合定义的精神,这是肯定的东西必须是信息隐藏待索真正的封装。

同样是你给的exampe如此。我们当然可以考虑N = N + 1是一个单一的McCabian块,因为它(和return语句)是执行单一,连续流。但进入其中,你把这个函数从而只包含一个块,而该块是函数的唯一的公共块,因此不存在你提出的函数中没有信息隐藏块。因此,它可满足封装的定义,但我要说的是,它不符合精神。

所有这些,当然,是学术除非你能证明益处,例如封装。

有两种力的是激励封装:语义和逻辑

语义封装仅仅意味着基于所述节点(要使用的总称)包封的含义封装。所以,如果我告诉你,我有两个包,一个叫“动物”,一个叫“矿泉水”,然后给你三个类狗,猫和山羊,并要求打包到这些类应该被封装,然后,给没有其他的信息,你会权利要求,该系统的语义将表明这三个类来的,“动物”,包内封装,而不是,是完全正确的“矿物”。

在其他动机的封装,但是,是逻辑。

的系统的结构的系统和其中驻留的包封区域的每个节点的精确和详尽标识; Java系统的特定配置为 - 在第三图形 - 以识别该系统的所有类,并指定其中每个类所在的包

要逻辑上封装一个系统意味着,以确定取决于它的配置,然后可以配置系统,使得属性在数学上最小化了系统的一些数学属性。

封装理论提出,所有包封图形表达边缘(MPE)的最大可能数量。在类和包Java系统中,例如,将MPE是可以在系统的所有类之间存在的源代码相关性的最大可能数量。在同一封装内的两个类不能是信息隐藏彼此等两者可以潜在地形成在彼此depdencies。在单独的包的两个包私有类,然而,可以不形成在彼此的依赖性。

封装理论告诉我们,这样的MPE被最小化,我们应该有多少个包有一个类的给定数。因为负担原则的弱形式规定,转化实体的集合的最大潜力负担转化实体的最大潜在数量的功能,这可能是有用的 - 换句话说,更多的潜在源代码依赖你之间你的班,做任何特别的更新更大的潜在成本。最小化MPE因此最小化更新的最大潜在成本。

给定n的类和每卷装P的公共类的要求,封装理论表明,包的数量,R,我们应该有最小化MPE是由以下等式给出:R = SQRT(N / P)

这也适用于你应该有功能的数量,给予总数,N,McCabian块的系统。函数总是只有一个公共块,如我们上面提到的,并且因此对于功能,R,次数为在系统中的方程简化为:R = SQRT(n)的

诚然,很少考虑练封装时,但它在类/包水平容易地完成在他们的系统块的总数。除此之外,最大限度地减少MPE几乎完全entuitive:它是通过减少公共类的数量,并试图在包均匀分布类(或至少避免有大多数包有,比方说,30个班进行,并与500班一个怪物pacakge,在这种情况下,后者的内部MPE可以很容易地压倒所有其他的MPE)。

从而封装涉及撞击语义和逻辑之间的平衡。

都非常有趣。

在严格面向对象的术语,一个可能会想说"不",一个"单纯的"功能没有足够强大以所谓的封...但是 在现实世界 明显的答案是"是的,一个功能封装一些代码"。

为OO纯粹主义者,谁毛在这种亵渎,考虑一个静态的匿名类与任何国家和单一的方法;如果AddOne()功能是不封装,那么无论是这类!

只是迂腐的、封装是一种形式的抽象,没有,反之亦然。;-)

这不是通常非常有意义可言封装不参考性质,而非的方法 - 你可以把访问控制的方法,当然,但它是很难看到是怎么回事是其他比无意义的,没有任何数据作用域所封装的方法。也许你可以做一些参数验证,但我怀疑这将是曲折的。

所以,不,你最有可能不使用封装,只是因为你把一个方法的一类,而不是它作为一个全球性的功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top