什么是组件?

13

我听过Java Posse播客,里面经常讨论组件(注意,组件不完全是对象)。他们对Java没有组件而感到遗憾,并将其与具有此功能的.NET进行对比。组件显然使开发应用程序(不仅限于GUI应用程序)更加容易。

从讨论中可以看出,组件具有某些特性,例如解耦(将一个组件替换为另一个只是一种管道技术),涉及属性,还涉及事件和委托。

因此,以下是问题:

./ 有人能解释一下什么是组件(以及为什么Java Beans不是组件)吗?

./ 有人能解释一下它们如何帮助开发吗?

./ 如果它们非常有用,为什么Java没有它们呢?

6个回答

3
软件工程电台有一期专门讨论这个话题:http://se-radio.net/podcast/2008-02/episode-87-software-components。总的来说,软件组件可以通过元数据来描述其自身的依赖关系和服务。我不知道你为什么会听说Java没有组件,因为你肯定可以想象出一个Java架构,其中组件可以通过元数据来描述自己。我猜这只是因为Java平台定义本身并没有真正的组件架构。更新:确实,我们不需要想象这样的架构,因为正如其他人指出的那样,Java Beans或Servlet可以被认为是基于组件的架构。

感谢您指出这个链接,我一定会去看看。至于为什么我不认为组件不存在...嗯,在这一点上,我还不清楚它们是什么,所以我不会做任何断言。问问Joe Nuxoll吧,他似乎很热衷于说它们(尚)不存在。 - Scott James
Joe Nuxoll是Java Posse(http://www.javaposse.com/)的演讲者之一,强烈推荐这个播客给任何对Java开发感兴趣的人。 - Scott James
当我听到这个播客时,当他说:“有一个组件市场,人们创建组件,然后将它们放入全球存储库中,人们可以从中获取并组装自己的系统... 我不相信这个想法可以实现,我不认为会发生。”时,我感到很困惑。那么像Maven Central Repository或Node JS的NPM这样的存储库呢? - Miguel Gamboa

3

“组件”这个术语在面向对象编程中是最模糊和最常用的之一。

大多数人会认为一个组件由一组类组成,这些类相互协作以实现一个或多个接口。其中一个类扮演“前端”的角色,即它实现了接口但将工作委托给组内的其他类。正如您所说,组件应该是可替换的,而不影响系统的其余部分。

组件化架构的一个很好的例子是COM。它是一个很好的例子,因为它被广泛使用并且被严格规定。但请注意,对此架构的需求基于C++编译和部署模型的不灵活性。

在Java中,您可以对类进行很多操作,而不会破坏与系统其余部分的二进制兼容性。因此,没有太大的必要构建刚性的、基于组件的架构。但这完全取决于您如何定义这个术语,例如,任何使用依赖注入构建的项目都可以算作“基于组件的”。


2
尽管在Java的开端,组件的概念经常与Gui组件相关联,但软件工程中组件的通用意义超越了这个概念。
简单来说,组件是可重用的软件片段。就像积木一样,我们将它们组合起来构建整个应用程序。 现代环境中软件组件的关键洞见是元数据,它描述了组件的内容并启用了重复使用
1996年,JDK 1.0成为第一个提供具有元数据组件的托管运行时环境。在这种情况下,组件是包含字节码和元数据的.class文件。然而,根据Java规范,.class文件仅包含一个类型定义。因此,要将一组类型作为组件部署,我们可以使用包含多个.class文件的Jar存档。
另一方面,在提供可重用组件相同思想的.NET平台上,一个组件可能包含多个类型定义。在这种情况下,组件(在.NET中称为程序集)是.dll或.exe文件。

1

这取决于你所说的“组件”是什么意思。在许多不同的上下文中,这个术语可以有很多不同的含义,因此很容易让人感到困惑。尽管如此,以下是我对这个主题的理解:

组件与对象不同(尽管对象通常用于表示和构建组件)。它们之间的区别在于:

  1. 对象往往只是“东西”,而组件是行动者。区别在于组件是进程的一部分,而对象代表某种抽象概念。
  2. 组件有助于确保代码重用和可插拔性,因为它们基本上是小型的“子程序”(有时是自己的程序),理想情况下可以适应其他组件的工作。
  3. 你会在“无共享”消息传递系统中更多地看到组件,比如ErlangKamaelia,主要是因为这些类型的框架更适合面向组件的设计。

有很多关于组件化设计的好例子,但我首选的是UNIX。UNIX的基本思想是它更像是一组小程序的集合,这些小程序被设计成可以相互配合工作,而不是由几个更加庞大的程序组成。


1

软件分为几个组。这里是Java的块。

  • 语句。
  • 方法函数。多个语句。
  • 类。多个属性和方法函数。
  • 文件。一个或多个类。一个类是文件中的公共类,其他类隐藏在文件中。
  • 包。多个类。这些形成层次结构。

"组件"、"层"、"层"和其他哲学上的分组通常是概念性的。VB COM环境对组件有一种形式主义。其他人把它们当作想法来处理。

Beans是类。单个类可以成为组件吗?也许。组件通常是一堆类。有时只有两个——一个正式的接口和一个实现。

组件帮助您专注于类、包、分组等的逻辑分组。

由于组件是概念性的,每种语言都或多或少地拥有它们。组件的语言形式主义很少。它们并不是真正需要的。这是一种你用来构建思维结构的想法或原则。

您可以通过接口、元数据和其他众多功能来谨慎地定义"组件"方法。


0

我不特别了解.NET组件,但从Java的角度来看,我会说组件是应该具有定义接口/使用原则的某些功能单元。虽然Java没有组件作为语言概念,但在我看来Java中有组件。技术组件例如:

  • EJBs
  • Servlets

功能组件例如:

  • 应用程序自动更新
  • 公式机制,可以在数据模型上进行计算

架构组件可以是JAR文件或OSGi包。

当然,总有诠释的余地 ;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接