UML软件工程组织

从 WFC 转移到 .NET Framework
Dr. Bruce E. Krell
SWA Engineering, Inc.

2003 年 5 月

摘要:针对 Visual Studio® .NET、Microsoft® Visual J#® .NET 的 Microsoft Java 语言开发工具,使程序员可以使用 Java 语言访问 .NET Framework 并构建应用程序。Visual J# .NET 不仅功能丰富而且可以提高生产率。本文提供了 Windows 基础类 (WFC) 库和 .NET Framework 类库的体系结构和功能集的概述和对比。(本文还包含英文链接。)

目录

简介
WFC 的当前状态
WFC 体系结构
.NET Framework 体系结构
体系结构对比
J++/WFC 和 J#/.NET Framework 类之间的类似与不同之处
转换的优点
结论

简介

随着 Visual J++® 6.0 数年前的发行,Java 程序员可以使用一个称为 Windows 基础类 (WFC) 的库来提供更为丰富的用户界面。此库还为后端编程访问硬件和其他外部接口提供了更为强大的功能,使 Java 程序员可以获得更高的生产率并缩短产品投放市场的时间。随着 Visual J# .NET 的发行和其提供的对 .NET Framework 的访问,开发人员获得了更为丰富的功能并提高了生产率。

本文为开发人员提供了将 J++ 应用程序迁移到 J# 和 .NET Framework 的背景信息。它还提供了对 WFC 和 .NET Framework 类体系结构的高级而有用的对比,便于更好地了解从 J++ 和 WFC 切换到 Visual J# .NET 和 .NET Framework 的影响和好处。

WFC 的当前状态

比较两个基本体系结构之前,有几个重要的注意事项需要说明。将 J++ 应用程序迁移到 Visual J# .NET 时,大多数 WFC 应用程序只会运行百分之九十五左右的时间而不发生更改。J# 的确提供了对 WFC 功能、J/Direct® 和大多数能在 Visual J++ 6.0 中找到的其他特定于 Microsoft 的类的支持。但是,此支持却存在局限性。Visual Studio .NET 的可视设计功能无法应用于由 WFC 定义的组件。例如,这意味着您不能将这些组件从工具栏中拖放到调色板上以快速创建应用程序。此外,WFC 库将完全保持它们现在所实现的样子,因为 Microsoft 不打算在将来以任何方式来改进 WFC。事实上,WFC 类在未来版本的 J# 类库中重要性可能会降低。最重要的是,作为开发人员,您应该利用使用 .NET Framework 类的诸多优点(将在本文的余下部分中进行介绍)。

WFC 体系结构

WFC 库是一组软件包。这些软件包包括一个或多个类,这些类将方法和功能组织成有用的组。下表中包含了一些较为重要的软件包的汇总。

软件包名称 软件包功能
com.ms.wfc.app 支持应用程序操作(例如线程)。
com.ms.wfc.core 提供 WFC 类的基础(例如组件和事件)。
com.ms.wfc.data 访问 ActiveX 数据对象和数据格式。
com.ms.wfc.data.ui 实现和支持数据绑定控件。
com.ms.wfc.html 通过对象模型访问动态 HTML 元素。
com.ms.wfc.io 提供用于文件和数据流的类。
com.ms.wfc.ui 提供用户界面组件的类。
com.ms.wfc.util 包括各种实用程序(例如数据转换)。
com.ms.wfc.ui.Pen、
com.ms.wfc.ui.Brush 等等
用于利用各种绘图工具的类(例如笔)。

在上表提到的软件包中有三个值得特别留意。com.ms.wfc.ui 软件包可以提供用户界面。此软件包包含窗体和标准控件(例如按钮、文本框和标签)。另一个重要的软件包是 com.ms.wfc.data。当某个程序使用此软件包内的类时,该应用程序可以方便地访问数据库(例如 Microsoft Access 和 Microsoft SQL Server)。另一个对应用程序程序员有用的软件包是 com.ms.wfc.html。此软件包包含允许 Web 服务器和组件从结构化的、编译的 Java 语言源代码中以编程方式生成 Web 页界面的类。

WFC 体系结构的另一个重要方面是 WFC 提供的继承层次结构。以下是此层次结构的部分示例。

图 1:窗体类的类层次结构

WFC 中,只有层次结构的三个层次可以将程序员直接带至窗体类。与任何继承层次结构一样,叶类(窗体)接收原型类提供的所有方法和属性。请注意,所有属性均使用 setget 方法实现。此外,窗体类本身提供自动滚动工作区内容的功能,只需通过提供的 set 方法来设置 AutoScroll 属性即可。程序员控制实际窗体大小的能力继承于父控件类。

.NET Framework 体系结构

.NET Framework 类的基本元素是程序集。程序集提供了将类和方法组织成可传递的组件的方法,类似于 WFC 中的软件包概念。一般来说,程序员可以将程序集简单地看作存放类集合的黑匣。

程序集名称 程序集功能
System.Threading、System.Event 支持应用程序操作(例如线程和事件)。
System.Windows.Forms 提供 Windows 类的基础(例如窗体)。
System.Data 访问 ADO.Net 数据对象和数据格式。
System.Windows.Forms.DataGrid 实现和支持数据绑定控件。
System.Web.UI 通过对象模型访问 HTML 元素。
System.IO 提供可用于文件和数据流的类。
System.Windows.Forms
.Button、System.Windows.Forms.ListBox 等等
提供用于用户控件和界面组件的类。
System.Math、System.Convert 包括各种实用程序(例如数据转换)。
System.Drawing 用于利用各种绘图工具的类(例如笔)。

类似于 WFC 中的软件包列表,上表包含了 J# 应用程序程序员最常用的主要 .NET Framework 程序集的列表。此程序集列表与为 WFC 提供的列表相比,前者十分有希望。名为 System.Windows.Forms 的程序集提供了一组类,这些类允许程序显示带有伴随的子控件组的窗口。另一程序集 System.Data,允许访问 ADO.NET 数据对象,提供对几乎所有可以想象的数据存储(包括 Access、SQL Server、Oracle、开放式数据库连接 [ODBC]、OLE DB 甚至原始 XML)的更为简单的编程访问。新的改进的程序集 System.Web,为基于 Web 的组件提供在呈现给用户的 Web 页中生成 HTML 元素的功能。Web 窗体类(统称为 ASP.NET),基于做出请求的客户端类型动态生成标记。例如,如果浏览器支持 DHTML 和客户端脚本,ASP.NET 将使用该支持呈现更丰富的窗体体验。但是不具备更高级支持的客户端查看该页面时,ASP.NET 仍会使用 HTML 的早期版本正确呈现该窗体。此功能将“自动”提供给开发人员,因为开发人员设计该页面后将由 ASP.NET 窗体控件来处理正确呈现。

下图跟踪通向 System.Windows.Forms.Form 类的继承层次结构。通过继承层次结构,在应用程序中使用该类的程序员可以使用同一功能组。

图 2:窗体类的类层次结构

此层次结构中的类揭示了 .NET Framework 类的一些重要含义。大量原型类转向窗体类,表明 .NET Framework 类是一组比 WFC 更为丰富、功能更强的改进的类。在窗体类的编程层次,J# 程序员可以使用所有的相同功能。

体系结构对比

大多数 J++ 程序员可能会担心从 J++/WFC 切换到 J#/.NET Framework 需要学习整个新库和功能组。下表提供了对 WFC 和 .NET Framework 中主要编程元素的快速对比,应该能解除您的疑虑。

元素 WFC .NET
模块 com.ms.wfc.app.Application System.Windows.Forms.Application
窗口 com.ms.wfc.ui.Form System.Windows.Forms.Form
事件 com.ms.wfc.ui.PaintEvent System.Windows.Forms.Control.Paint
事件处理程序 com.ms.wfc.ui.PaintEventHandler System.Windows.Forms.PaintEventHandler
绘图文本 com.ms.wfc.ui.Graphics System.Drawing.Graphics

例如,考虑在两个上下文中均提供的程序员用来创建向用户显示窗口的程序的功能。在 WFC 中,从 com.ms.wfc.ui.Form 类的派生为 J++ 应用程序提供了一个基本窗口和一个基础消息处理泵。使用 System.Windows.Forms.Form 类,在 J# 中也提供了类似的功能。这两个类之间在用法和行为方面的唯一区别在于通向窗体类的上下文中的前缀。

此表中展示的另一个重要示例是事件处理程序元素。此表包含一个实例化的方法的委托名称,该方法用以处理自定义绘图要求。对于这些事件处理程序,WFC 和 .NET Framework 都使用委托概念以及相同的签名和参数。因此,J++ 程序员在熟悉上下文前缀中的更改后就可以很容易地从 WFC 转换到 .NET Framework 类。

J++/WFC 和 J#/.NET Framework 类之间的共同点和不同点

除了前面体系结构讨论中描述的 J++/WFC 和 J#/.NET Framework 类之间的共同点和不同点之外,两者之间还有其他有用的对比。

许多应用程序要求能够直接访问基础 Win32 API。在 WFC 中实现此功能的机制被称为 J/Direct。访问基础 API 方法利用了 dll.import 指令。该机制是如此有用,以致公共语言运行库 (CLR) 也提供了此功能。此功能被称为 P/Invoke。因为声明调用了 System.Runtime.InteropServices.DLLImport,所以它有所更改,但是使用方法与 WFC 中的使用方法类似。

重用是所有编程环境中的重要元素。因为 C++ 和 Visual Basic 中已经通过 ActiveX 实现了大量可重用组件,WFC 和 .NET Framework 类都提供了使用这些组件的功能。在 WFC 中,一个名为 JActiveX 的工具已集成到 Visual J++ 中。一个名为 aximp 的类似工具也集成到了 Visual J# .NET 中。这些工具的运行方式类似。两种工具均生成一个本地包装类,该类可以使程序员通过编程方式访问基础控件而不必担心任何宿主问题。顺便说明一下,由 JActiveX 生成的包装类使用 WFC 类 com.ms.wfc.ui.AxHost。类似地,Aximp 使用 .NET Framework 中的 System.Windows.Forms.AxHost 来包装 ActiveX 控件。

.NET Framework 类在编程功能方面提供了一些明显的和有用的改进。在 J# 中,每个类都是从一个名为 System.Object 的基类中派生的。J# 将 System.Object 作为 java.lang.Object 进行处理,并映射该功能以显示所有的不同点。此支持使得传递至 System.Object 或从其传递以进行分配、参数传递和其他用途成为可能。同一映射也适用于 java.lang.StringSystem.String。您可以使用集合类(例如 System.Collections.ArrayList)来存储一组不同类型的元素,只需简单地将它们复制到 ArrayList 对象中即可。.NET Framework CLR 自动将它们转换为 System.Object 引用,同时维护所有基础公共字段、公共方法、专用字段和专用方法(虽然它们可能不同于在 ArrayList 对象中存储的所有元素)。从 ArrayList 对象中撤回后,J# 应用程序可以只将对象转换回相应的类并使用所有字段和方法。

转换的好处

回顾了对 J++/WFC 和 J# 之间的共同点和不同点的分析后,很多重要结论说明从 WFC 转换到 .NET Framework 编程有巨大的好处。

  • 因为特点和编程方法的相似使学习曲线变短。

    尽管一些程序集的名称已经更改,主要功能(例如窗体和事件)在 J# 中的实现和操作与其在 J++/WFC 中的对应部分一样。经过短时间的学习程序集上下文名称,WFC 程序员可以使用 .NET Framework 立即展开工作。有关编程的很多重要功能(例如重用 ActiveX 控件以及访问本地 Win32 API),几乎保留了相同的使用方法。

  • 丰富的已开发的库和实用程序功能(例如 System.object)使得工作更加高效。

    在 .NET Framework 的开发期间进行了大量的工作,以确保 .NET Framework 类功能强大、灵活并且要比 WFC 实现使用起来更为方便。该实用程序的一个真正强大的示例是 ArrayList 类与对象基类的组合。

  • 通过包装在 Java 和其他语言中重用现有组件可以缩短应用程序投入市场的时间。

    针对新工作将 J++/WFC 转换到 J#/.NET Framework 类无需放弃以前开发的组件。也无需避免使用其他购买的组件。包装类和相应的类生成工具是可用的并且已集成到了 Visual J# .NET 中。

  • 轻松的在编程语言之间转换可以使程序员效率更高。

    通过将 .NET Framework 类用作 J# 中的应用程序的基础,程序员可以更容易地进行编程或理解以各种具有 .NET Framework 功能的语言所编写的代码。此优点源于 .NET Framework 类的统一性。与为 C++ 程序员 (ATL / MFC)、J++ 程序员 (WFC) 以及 Visual Basic 程序员提供单独的库和运行时集不同,所有语言现在都位于“一个屋檐下”并且可以从 Microsoft 构建 .NET Framework 时采用的一致开发努力和客户反馈中受益。随着 .NET Framework 的发展和新版本的问世,此协同作用将继续保留。如果开发人员也选择这样做,就会更加得心应手地从一种语言转换到另一种语言;因为 J# 程序和 Visual Basic .NET 程序之间的区别仅在于句法,并且它们依赖于同一基础体系结构。类似地,任何 .NET Framework 语言的开发人员均可以针对任何方案自由构建应用程序:假定类的体系结构是类似的,从前使用 Windows 窗体的开发人员今后可以很轻易地构建应用程序的 ASP.NET Web 窗体版本。

  • 在 C# 和 Visual Basic .NET 中,明确为 .NET 编写的新组件可以重用。

    各种 .NET Framework 兼容语言中编写有大量组件。利用了 .NET Framework 类的改进功能的这些组件为应用程序提供了许多非常出色的功能。通过将新的开发工作从 J++/WFC 转换到 J#/.NET Framework 类,J# 组件和应用程序可以利用这些新组件的好处而无需进行集成。这样使新 J# 程序可以在较短的开发时间内(与 J++/WFC 相比)提供各种激动人心的功能。

小结

如果要开始新的开发项目,您应该认真考虑从 J++/WFC 转换到 J#/.NET Framework 类。与通过使用 .NET Framework 类而赢得的较短的投入市场的时间相比,在 J# 应用程序中学习使用 .NET Framework 类所用的一点时间是微不足道的。实际的迁移策略超出了本文的范围,而且会因应用程序的不同而大不一样,Microsoft.Public.Dotnet.Vjsharp 中的 Visual J# .NET 新闻组是很好的一个资源。像许多其他专业 J# 开发人员一样,Visual J# .NET 产品小组经常参加该新闻组,所以那里是查找答案的上佳之所。

 

版权所有:UML软件工程组织