您能告诉我软件开发中抽象和信息隐藏之间的区别是什么吗?
我很困惑。抽象隐藏细节实现,而信息隐藏则抽象事物的整个细节。
更新:我为这三个概念找到了一个很好的答案。请参见下面的单独答案从采取了一些引文出现。
您能告诉我软件开发中抽象和信息隐藏之间的区别是什么吗?
我很困惑。抽象隐藏细节实现,而信息隐藏则抽象事物的整个细节。
更新:我为这三个概念找到了一个很好的答案。请参见下面的单独答案从采取了一些引文出现。
Answers:
转到源代码!Grady Booch说(在面向对象的分析和设计,第49页,第二版):
抽象和封装是互补的概念:抽象集中于对象的可观察行为...封装着重于引起这种行为的实现...封装通常是通过信息隐藏来实现的,信息隐藏是隐藏所有对象的过程。对物体的本质没有帮助的秘密。
换句话说:抽象=外部对象;封装(通过信息隐藏实现)=内部对象,
示例:在.NET Framework中,System.Text.StringBuilder
该类提供了对字符串缓冲区的抽象。这种缓冲区抽象使您可以使用缓冲区而无需考虑其实现。因此,您可以将字符串追加到缓冲区,而无需考虑StringBuilder
内部如何跟踪缓冲区的指针以及在缓冲区变满时管理内存等事情(通过信息隐藏进行封装)。
rp
OP用他发现的几种引用来更新他的问题,即在Edward V. Berard的文章“抽象,封装和信息隐藏”中。我将重新发布OP更新的稍作扩展和重新格式化的版本,因为它本身就是一个答案。
(所有引用均来自上述文章。)
抽象:
“与抽象有关的一个混淆点是它既是过程又是实体,它既是过程,又是实体,它表示提取一个或一组项目的基本细节,而忽略了无关紧要的细节。实体,表示实际项目的模型,视图或其他一些集中表示。”
信息隐藏:
“选择它的界面或定义是为了尽可能少地揭示其内部运作方式。” -[Parnas,1972b]
“抽象可以[…]用作识别应隐藏哪些信息的技术。”
“当人们无法区分信息隐藏和用于帮助识别哪些信息要隐藏的技术(例如抽象)之间时,就会发生混乱。”
封装形式:
“它[…]是指围绕一些东西建立一个胶囊,在概念性障碍的情况下。” — [Wirfs-Brock等,1990]
“作为一个过程,封装是指将一个或多个项目封装在[…]容器中的行为。封装作为一个实体,是指容纳(包含,封装)一个或多个项目的包装或封装。”
“如果封装是'与信息隐藏相同的东西',那么人们可能会说'封装的所有东西也都被隐藏了。” 这显然是不正确的。”
结论:
“抽象,信息隐藏和封装是非常不同的,但是却是高度相关的概念。人们可以说抽象是一种技术,可以帮助我们识别哪些特定信息应该可见,哪些信息应该被隐藏。封装就是这种技术。用于包装信息的方式,以隐藏应隐藏的内容,并使要显示的内容可见。”
Information Hiding
(或实现隐藏),而通用class
则通过private
访问实现了封装和抽象
请不要使简单的概念复杂化。
封装:将数据和方法包装到一个单元中就是封装(例如,类)
抽象:这是仅代表基本事物而不包含背景细节的一种行为。(例如接口)
有关示例和更多信息,请转到:
http://thecodekey.com/C_VB_Codes/Encapsulation.aspx
http://thecodekey.com/C_VB_Codes/Abstraction.aspx
此处批准的定义
PS:我也记得Sumita Arora在一本名为C ++的书中的定义,我们在第11堂课中读过;)
抽象 -它是识别对象的基本特征而不包含无关紧要的细节的过程。
封装 -这是封装数据和将数据处理为单个单元的功能的过程。
抽象和封装是相关但互补的概念。
抽象是过程。封装是实现抽象的机制。
抽象集中于对象的可观察行为。封装着重于引起这种行为的实现。
信息隐藏 -这是隐藏对象的实现细节的过程。这是封装的结果。
封装:将数据成员和成员函数绑定在一起称为封装。封装是通过类完成的。抽象:从用法或视图中隐藏实现细节被称为抽象。例如:int x; 我们不知道int在内部如何工作。但我们知道int会起作用。那是抽象。
参见乔尔关于泄漏抽象定律的文章
基本上,抽象使您可以自由思考高级概念。一个非编程的类比是,我们大多数人都不知道我们的食物来自何处或如何生产,但是我们(通常)不必担心它的事实使我们可以腾出时间去做其他事情,例如编程。
至于信息隐藏,我同意干扰。
在很短的时间内
封装:–信息隐藏
抽象 :–实现隐藏
Abstraction
让您专注于what the object does
封装how an object works
要抽象某些东西,我们需要隐藏细节或隐藏我们抽象的东西的细节。但是,它们两者都可以通过封装来实现。
因此,信息隐藏是一个目标,抽象是一个过程,封装是一种技术。
只是添加了有关InformationHiding的更多详细信息,发现此链接确实是带有示例的好资源
InformationHide的想法是,应将设计决策隐藏在系统的其余部分中,以防止意外耦合。信息隐藏是一种设计原则。InformationHide应该告知您封装事物的方式,但是当然不必如此。
封装是一种编程语言功能。
抽象和封装都是四个基本的OOP概念中的两个,它们使您可以将现实世界中的事物建模为对象,以便可以在程序和代码中实现它们。许多初学者对抽象和封装感到困惑,因为它们看上去非常相似。如果您问某人什么是抽象,他会说这是一个OOP概念,它通过隐藏不必要的细节来关注相关信息,而当您询问封装时,许多人会说这是另一个OOP概念,它将外界的数据隐藏起来。定义是正确的,因为抽象和封装都隐藏了某些东西,但是关键的区别在于意图。
通过为您提供更抽象的图片(一种10,000英尺的视图),抽象隐藏了复杂性,而封装则隐藏了内部工作,以便您以后可以进行更改。换句话说,抽象在设计级别隐藏细节,而封装在实现级别隐藏细节。
我对抽象和封装这两个概念也感到非常困惑。但是,当我在myjavatrainer.com上看到有关抽象的文章时,对我来说很清楚,抽象和封装是Apple和Oranges,您不能真正比较它们,因为两者都是必需的。
封装是对象的创建方式,抽象是在外部环境中查看对象的方式。
封装:绑定数据和对其进行操作的方法。这样可以隐藏其他类中所有其他方法的数据。例如:MyList
类,可以添加项目,删除项目,并删除所有项目的方法add
,remove
和removeAll
在列表上,不能从外部直接访问行为(私有数组)。
抽象:隐藏不相关的行为和数据。项的实际存储,添加或删除方式是隐藏的(摘要)。我的数据可能保存在简单数组,ArrayList,LinkedList等中。而且,如何实现这些方法从外部隐藏。
封装-强制以受控方式访问内部数据或阻止直接访问成员。
抽象-隐藏某些方法的实现细节被称为抽象
让我们借助示例来理解:-
class Rectangle
{
private int length;
private int breadth;// see the word private that means they cant be accesed from
outside world.
//now to make them accessed indirectly define getters and setters methods
void setLength(int length)
{
// we are adding this condition to prevent users to make any irrelevent changes
that is why we have made length private so that they should be set according to
certain restrictions
if(length!=0)
{
this.length=length
}
void getLength()
{
return length;
}
// same do for breadth
}
现在,为抽象起见,定义一个只能访问且用户不知道该方法的主体是什么以及它如何工作的方法。让我们考虑上面的示例,我们可以定义一个用于计算矩形面积的方法区域。
public int area()
{
return length*breadth;
}
现在,每当用户使用上述方法时,他只会得到面积,而不是面积的计算方式。我们可以考虑一个println()方法的示例,我们只知道它用于打印,而我们不知道它如何打印数据。我已经写了一个详细的博客,您可以在下面的链接中找到更多信息 抽象与封装
值得注意的是这些术语具有标准化的IEEE定义,可以在https://pascal.computer.org/上进行搜索。
抽象
信息隐藏
封装