你能告诉我在软件开发中抽象和信息隐藏有什么区别吗?
我很困惑。 抽象隐藏了详细的实施和
信息隐藏抽象的东西的整个细节。
更新:我找到了这三个概念的好答案。 请参阅下面单独的答案,从中获取几个引用。
去源头! Grady Booch说(在面向对象的分析和设计,第49页,第二版):
Abstraction and encapsulation are complementary concepts: abstraction
focuses on the observable behavior of an object... encapsulation
focuses upon the implementation that gives rise to this behavior...
encapsulation is most often achieved through information hiding, which
is the process of hiding all of the secrets of object that do not
contribute to its essential characteristics.
换句话说:抽象=对象外部;封装(通过信息隐藏实现)=内部对象,
例:
在.NET Framework中,System.Text.StringBuilder类提供字符串缓冲区的抽象。此缓冲区抽象允许您使用缓冲区而不考虑其实现。因此,您可以将字符串附加到缓冲区,而不考虑StringBuilder如何在内部跟踪指向缓冲区的指针以及在缓冲区变满时管理内存(通过信息隐藏进行封装)。
RP
OP通过他发现的几个引用更新了他的问题,即Edward V. Berard撰写的题为"抽象,封装和信息隐藏"的文章。我正在重新发布一个稍微扩展和重新格式化的OP更新版本,因为它本身应该是一个答案。
(所有引用均来自上述文章。)
抽象:
"One point of confusion regarding abstraction is its use as both process and an entity. Abstraction, as a process, denotes the extracting of the essential details about an item, or a group of items, while ignoring the inessential details. Abstraction, as an entity, denotes a model, a view, or some other focused representation for an actual item."
信息隐藏:
"Its interface or definition was chosen to reveal as little as possible about its inner workings." [Parnas, 1972b]
"Abstraction can be […] used as a technique for identifying which information should be hidden."
"Confusion can occur when people fail to distinguish between the hiding of information, and a technique (e.g., abstraction) that is used to help identify which information is to be hidden."
封装:
"It […] refers to building a capsule, in the case a conceptual barrier, around some collection of things." [Wirfs-Brock et al, 1990]
"As a process, encapsulation means the act of enclosing one or more items within a […] container. Encapsulation, as an entity, refers to a package or an enclosure that holds (contains, encloses) one or more items."
"If encapsulation was 'the same thing as information hiding,' then one might make the argument that 'everything that was encapsulated was also hidden.' This is obviously not true."
结论:
"Abstraction, information hiding, and encapsulation are very different, but highly-related, concepts. One could argue that abstraction is a technique that help us identify which specific information should be visible, and which information should be hidden. Encapsulation is then the technique for packaging the information in such a way as to hide what should be hidden, and make visible what is intended to be visible."
Abstraction通过提供基本功能层来隐藏实现细节。
Information Hiding正在隐藏受该实现影响的数据。使用private和public属于此。例如,隐藏类的变量。
Encapsulation只是在编程中将所有类似的数据和函数放入例如Class的组中;网络中的Packet。
通过使用Classes,我们实现了所有三个概念 - Abstraction,Information Hiding和Encapsulation
请不要简单概念复杂化。
封装:将数据和方法包装到单个单元中是封装(例如,类)
抽象:这是一种仅包含基本事物而不包括背景细节的行为。 (例如界面)
例子和更多信息GOTO:
http://thecodekey.com/C_VB_Codes/Encapsulation.aspx
http://thecodekey.com/C_VB_Codes/Abstraction.aspx
这里批准了定义
P.S。:我还记得Sumita Arora的一本名为C ++的书中的定义,我们在第11课阅读了这本书;)
牛津英语词典(OED)给出的抽象意义最接近于此处的意思是"思想中的分离行为"。一个更好的定义可能是"代表某些东西的基本特征,而不包括背景或不必要的细节。"
信息隐藏是软件组件(例如类)的用户仅需要知道如何初始化和访问组件的基本细节的原则,并且不需要知道实现的细节。
编辑:在我看来,抽象是决定应该隐藏的实现的哪些部分的过程。
所以它不是抽象的VERSUS信息隐藏。这是隐藏VIA抽象的信息。
抽象化
抽象是表示essentail细节而不包括背景细节的行为。抽象类只有方法签名,实现类可以有自己的实现,这样复杂的细节就会对用户隐藏。抽象侧重于外部视图。换句话说,抽象是从实际实现中分离接口。
封装
封装解释了将数据成员和方法绑定到单个单元中。信息隐藏是封装的主要目的。通过使用私有,公共,受保护等访问说明符来实现封装。类成员变量是私有的,因此无法直接访问外部世界。封装侧重于内部视图。换句话说,封装是一种用于保护对象中的信息不受其他对象影响的技术。
正如您所说,抽象隐藏了实现的细节。
你抽象的东西足够高,你只需要做一些非常简单的事情来执行一个动作。
信息隐藏隐藏了实现细节。编程很难。你可以有很多事情需要处理和处理。您可能需要/需要保持非常接近的变量。隐藏信息可确保没有人通过使用您公开暴露的变量或方法意外破坏某些内容。
这两个概念在面向对象的编程中非常紧密地联系在一起。
抽象 - 这是识别对象基本特征的过程
没有包含无关紧要和繁琐的细节。
封装 - 将数据和函数封装到一个单元中的过程。
抽象和封装是相关但互补的概念。
抽象是一个过程。封装是实现抽象的机制。
抽象集中于对象的可观察行为。封装侧重于导致此行为的实现。
信息隐藏 - 隐藏对象的实现细节的过程。这是封装的结果。
抽象:抽象是用于识别对象的外部视图的概念/技术。仅提供所需的界面。
信息隐藏:它是对抽象的补充,因为通过信息隐藏抽象实现。隐藏除外部视图之外的所有其他内容。
封装:将数据和相关功能绑定到一个单元中。它有助于抽象和信息隐藏。允许在单元上应用成员访问等功能以实现抽象和信息隐藏
封装:将数据成员和成员函数绑定在一起称为封装。封装是通过类完成的。
抽象:隐藏实现细节表单用法或从视图中称为抽象。
例如:
int x;
我们不知道int将如何在内部工作。但我们知道int会起作用。那就是抽象。
请参阅Joel关于漏洞抽象法的文章
JoelOnsoftware
基本上,抽象可以让您自由地思考更高层次的概念。一个非编程的类比是,我们大多数人都不知道我们的食物来自何处,或者它是如何产生的,但事实上我们(通常)不必担心它会使我们自由地做其他事情,比如节目。
至于信息隐藏,我同意干扰。
只需添加有关InformationHiding的更多详细信息,发现此链接是非常好的源代码示例
InformationHiding is the idea that a design decision should be hidden from the rest of the system to prevent unintended coupling. InformationHiding is a design principle. InformationHiding should inform the way you encapsulate things, but of course it doesn't have to.
Encapsulation is a programming language feature.
我也对抽象和封装这两个概念感到非常困惑。但是当我在myjavatrainer.com上看到抽象文章时,我清楚地知道抽象和封装是苹果和橘子,你不能真正比较它们,因为两者都是必需的。
封装是对象的创建方式,抽象是对象在外部世界中的查看方式。
要抽象一些东西,我们需要隐藏细节或隐藏我们需要抽象它的细节。
但是,它们都可以通过封装来实现。
因此,信息隐藏是一个目标,抽象是一个过程,封装是一种技术。
抽象允许您将复杂过程视为一个简单的过程。例如,标准"文件"抽象将文件视为连续的字节数组。用户/开发人员甚至不必考虑集群和碎片问题。 (抽象通常表现为类或子例程。)
信息隐藏是为了保护您的抽象免受恶意/无能用户的侵害。通过将某些状态(例如硬盘驱动器分配)的控制限制为原始开发人员,大量的错误处理变得多余。如果除文件系统驱动程序之外没有其他人可以写入硬盘驱动器,则文件系统驱动程序确切地知道已写入硬盘驱动器的位置以及位置。 (这个概念的通常表现形式是OO语言中的private和protected个关键字。)
抽象仅仅意味着这样一种技术,其中只有软件的基本细节对用户可见,以帮助用户使用或操作软件,因此不显示该软件的实现细节(使其不可见)。
封装是具有包含一个或多个项目的包的技术,因此一些信息(特别是程序细节)变得可见并且一些对用户不可见,因此封装是通过信息隐藏来实现的。
综上所述。抽象是为了可观察的行为(外部),封装是为了隐形(内部),但这两者是真正互补的。
很短的
封装: - 信息隐藏
抽象: - 实施隐藏
Abstraction允许您专注于what the object does,而封装意味着how an object works
在逐一阅读上述所有答案后,我无法阻止自己发布
abstraction involves the facility to define objects that represent abstract"actors" that can perform work, report on and change their state, and"communicate" with other objects in the system.
然而封装从上面可以清楚地看出 - >
The term encapsulation refers to the hiding of state details, but extending the concept of data type from earlier programming languages to associate behavior most strongly with the data, and standardizing the way that different data types interact, is the beginning of abstraction.
参考维基
封装:绑定数据和作用于它的方法。这允许隐藏其他类中的所有其他方法的数据。
示例:MyList类,可以添加项目,删除项目以及删除所有项目
方法add,remove和removeAll作用于无法从外部直接访问的列表(专用阵列)。
抽象:隐藏不相关的行为和数据。
如何实际存储,添加或删除项目是隐藏的(抽象的)。
我的数据可以保存在简单数组,ArrayList,LinkedList等中。
此外,如何实现这些方法是从外部隐藏的。
封装 - 以受控方式强制访问内部数据或阻止成员直接访问。
抽象 - 隐藏某些方法的实现细节称为抽象
让我们借助一个例子来理解: -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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
} |
现在用于抽象定义一个只能被访问且用户不知道的方法
该方法的主体是什么以及它是如何工作的
让我们考虑上面的例子,我们可以定义一个计算矩形区域的方法区域。
1 2 3 4
| public int area()
{
return length*breadth;
} |
现在,只要用户使用上述方法,他就会得到的区域不是计算方式。我们可以考虑println()方法的一个例子,我们只知道它用于打印,我们不知道它是如何打印数据的。
我已经写了一篇详细的博客,你可以看到以下链接了解更多信息
抽象与封装
值得注意的是,这些术语具有标准化的IEEE定义,可以在https://pascal.computer.org/上进行搜索。
抽象化
一个对象的视图,该对象侧重于与特定目的相关的信息,并忽略其余信息
制定观点的过程
抑制不相关细节以建立简化模型或该过程结果的过程
信息隐藏
软件开发技术,其中每个模块的接口尽可能少地揭示模块的内部工作和其他模块被阻止使用有关模块的信息不在模块的接口规范中
在单个模块中包含设计或实现决策,以便从其他模块中隐藏决策
封装
软件开发技术,包括在模块内隔离系统功能或一组数据和操作,并为模块提供精确的规范
这样一种概念,即对类的职责的名称,含义和价值的访问与对其实现的访问完全分开
认为模块具有与其内部不同的外部,它具有外部接口和内部实现