部件设计的一般准则

来源:互联网 发布:数据融合技术及其应用 编辑:程序博客网 时间:2024/04/29 20:50

2004年12月14日  22:34:14

绝大多数面向对象的编程工具通过继承来提供多态性。对小规模的开发任务来说,这是一种很有效的技术,但大规模的系统中,这种方法是有问题的。

更严重的是,过分强调继承驱动多态性往往导致大量的资源从开发任务到前沿设计任务的转移,在最终用户可能发现─ 通过掌握的经验─ 系统是否真地完成了期望的目的之前,却没有解决积压的开发任务或缩短时间。所以,快速原型工具和快速应用程序开发 (RAD) 比 OOP 工具得到更广泛的接受。

Visual Basic 遵循 COM,强调多接口是提供多态性的一种更灵活的途径。这样,软件可以一个接口一个接口地渐进开发,而不是原来那样通过一个很长的设计过程从所有必须的先例派生。

注意   C++ 或其它面向对象语言的用户习惯于查看类的分层结构图。类的分层结构图描述继承关系。就是说,这种图说明一个对象如何从一个较为简单的对象派生出来,并继承其行为。与之相对照,对象模型则是描述包含关系的分层结构。就是说,对象模型说明诸如 Worksheets 这样的复杂对象如何包含其它对象集,如 Button、Picture 和 PivotTable 等。可以用 Visual Basic、Visual C++ 以及其它支持 COM 和 ActiveX 的工具创建对象模型。

一旦整个对象被划分,则需要一种将各个组成部分组织起来的方法。如果从 TreeView 控件中分出 Node 对象,但又不能说明它们之间的关系,那么将一无所获。对象模型可以方便地为该部件的用户提供这种组织方法。


  1. 确定部件应提供的功能。
  2. 根据部件的逻辑功能确定需要哪些对象。
  3. 设计部件要显示的窗体。
  4. 为部件提供的每一个类设计接口─ 即类的属性、方法和事件。 创建部件工程并测试。
  5. 实现该部件所需的窗体。
  6. 实现每个类的接口,为接口成员函数提供浏览器字符串,以及添加到帮助主题的链接。
  7. 每添加一个接口元素或功能,就在测试工程中加入代码来测试该新功能。
  8. 编译该部件,并用所有可能的目标应用程序对其进行测试。


1.一个进程外部件是一个 .exe 文件,在其自己的进程中运行,且使用自己的执行线程。因此,客户端与进程外部件之间的通信被称为进程间进程外通信。
2.进程内部件,如 .dll 或 .ocx 文件,与客户端运行在同一个进程中。由于属性和方法调度不必跨越进程,所以提供了最快捷地访问对象的方法。但是,进程内部件必须使用客户端的执行线程。
3.控件部件(.ocx 文件)是进程内部件.

命名的学问

为类模块及其属性、方法和事件选择的名字组成了访问该部件的接口。在给这些元素及其参数命名时,应当遵循以下的简单规则,以方便使用该部件的用户。

  • 尽可能使用完整的单词,例如“SpellCheck”。缩写可以有多种形式,因此会引起混乱。如果整个单词太长,就使用其完整的第一个音节。
  • 使用大小写混合来命名标识符,将每个单词或音节的首字母大写,例如 ShortcutMenus 或 AsyncReadComplete。
  • 描述一个概念时,选择用户可能会使用的单词,例如,使用 Name 而不是 Lbl。
  • 使用恰当的复数形式给集合类的名字命名,例如 Worksheets、Forms、或 Widgets。如果集合所包含的对象的名字是以“s”结尾,则在名字后添加 Collection,例如 SeriesCollection。
  • 可以按照本章后面“给部件提供命名的常数”中的介绍,在命名枚举常数时使用前缀。
  • 使用一致的动作/对象或对象/动作的顺序给方法命名。即使用 InsertWidget、InsertSprocket 等,或者总是将对象放在前面,如 WidgetInsert 和 SprocketInsert。

重要 不能把下列名称当作属性名或方法名来用,因为它们都属于下一级的 IUnknown 和 IDispatch 接口: QueryInterface、 AddRef、 Release, GetTypeInfoCount、 GetTypeInfo、 GetIDsOfNames 和 Invoke。使用这些名称将导致编译错误。

1.Instancing 属性的值决定该类是私有的(即只在部件内使用),还是可供其它应用程序使用的。

  • Private 意味着其它应用程序不能访问关于该类的类型库信息,也不能创建它的实例。私有对象只能在部件内部使用。
  • PublicNotCreatable 意味着只有在该部件首先创建对象后,其它应用程序才能使用该对象。其它应用程序不能用 CreateObject 函数或者 New 操作符来创建该类的对象。
  • MultiUse 允许其它应用程序创建该类的对象。部件的一个实例可以提供任意数目的以这种方式创建的对象。

    进程外部件可以给多个客户端程序提供多个对象;进程内部件则可以为其客户端程序和其进程中的任何其它部件提供多个对象。

  • GlobalMultiUse 与 MultiUse 类似,只增加一点:可以把属性和方法视为简单的全局函数来调用。这种方式不必显式地创建该类的对象,它将自动被创建。
  • SingleUse 允许其它应用程序从该类创建对象,但是客户端创建的该类的每一个对象都会启动部件的一个新的实例。不允许在 ActiveX DLL 工程中使用。
  • GlobalSingleUse 与 SingleUse 类似,除了可以把该类的属性和方法视为简单的全局函数来调用之外。不允许在 ActiveX DLL 工程中使用。

类模块和工程类型

Instancing 属性的取值在某些工程类型中有限制。各个工程类型中允许的取值见下表:

Instancing 取值ActiveX EXEActiveX DLLActiveX 控件
PrivateYesYesYes
PublicNotCreatableYesYesYes
MultiUseYesYes 
GlobalMultiUseYesYes 
SingleUseYes  
GlobalSingleUseYes  

 


 

 

原创粉丝点击