UNL类图表
类的标准UML图表或标记是有三个间隔的矩形。从类图表的顶部开始,第一个间隔包含类的名称,第二个包含类的属性,第三个包含类的方法。类的方法告诉我们类能做什么。
图2显示了第一个间隔是类名称Vehicle的类图表。类名称的标准名称约定是类名称的第一个字母大写。如果类的名称包含一个以上单词,类名称中的每个单词的第一个字母大写。例如,遵循名称约定的类名称包括Vehicle、PassengerCar和IncomeStatement。在类名称的单词之间没有空格。

图2:Vehicle 类的UML类图表示例
类属性
在我们的例子中,第二个间隔有6个整形属性。在更复杂的例子中,类可能有很多的属性。Visual Basic .NET倾向于把这些属性作为类的"所有物"。每个属性可以设置不同的值。总的来说,属性的当前值描述了类对象的状态。例如,如果CurrentGear的值为4,CurrentSpeed的值为55,那么认为Vehicle对象每小时移动55英里是合理的。因此,对象的状态是速度为55英里/小时向前移动。我们可以打一个比方,对象的属性类似句子中的名词。
加号和减号
你可能注意到了第二个间隔的每个条目的前面都有一个减号。在第三个间隔中有些条目有加号,有些有减号。加号标识此项在该类外部是可以使用的。换句话说,加号意味着我们能使用这些项影响类对象的状态。因此加号表示类的公共(Public)元素。
如果某个条目的前缀是减号,意味着该项只能在类自己内部使用。该项在类的外部不可见,也不能访问。因此减号标识类的私有(Private)元素。
作为一条通用的规则,使类的项私有是很好的,它符合尽可能隐藏数据的目标。通过封装数据,我们最小化了类之外的其它程序的部分不经意地改变数据的机会。这使查找程序错误更简单。
因此加号和减号标识类中的每个元素的访问说明符(还有第三种访问说明符"保护的",用#标识)。你可以认为加号定义了你与类对象交互的途径,减号表明只有在类里面可以使用的部件。
类方法(操作)
第三个间隔列举了类中可用的操作。尽管UML符号把这些项称为操作,但是使用Visual Basic .NET时,倾向于把这些操作作为方法引用。方法告诉程序员他们必须怎样与类交互。如果你查看第三个间隔种的项,每种的意思都是某类型的行为。如果属性是句子中的名词,那么方法就是动词。
我们经常听到其它程序员把方法作为类的过程。尽管这样并没有真正的错误,但是你要记得过程可以存在于类的外部,但方法一般约束到特定的类对象。
带参数的类方法
有时方法需要外部的信息来执行它的事务。例如,在图1中,我们看到了下面的代码行:
+SetSpeed(DesiredSpeed:Integer):Integer
加号说明SetSpeed()是公共的方法,因此它可以用于与某个类对象连接。在括号之间我们看到有一个数据值被传递到Vehicle类的SetSpeed()方法中。这个数据值的名称为DesiredSpeed,是一个整型数据类型。
在反括号的后面有一个冒号(:),后面有单词Integer。这意味着SetSpeed()会返回一个整型值到程序希望使用SetSpeed()方法的其它步骤。尽管这个时候我们不能肯定它,但是这个返回值可能用于显示我们是否能够设置速度,并且不会出错,例如,如果Vehicle 对象没有运行的话SetSpeed()可能就不能工作。同样,如果当前的传动装置是Reverse,把速度设置为150可能也不是明智的。
现在看下面两行:
-IncreaseSpeed(DesiredSpeed:Integer):Integer
-DecreaseSpeed(DesiredSpeed:Integer):Integer
这两行看起来与它们的目的和使用相似。实际上,这种类似应当作为技巧,它可能会帮助你简化工作。我们可以使用下面的代码代替这两个方法:
-ChangeSpeed(DesiredSpeed:Integer):Integer
在知道如果DesiredSpeed是正值的时候,表示我们希望提高的速度,如果是负值表明我们希望降低的速度。例如,考虑下面的代码要做什么:
Dim MyVehicle as New Vehicle
Dim ObjectSpeed as integer
' 执行某些事务的代码
ObjectSpeed = MyVehicle.GetSpeed()
ObjectSpeed = MyVehicle.ChangeSpeed(-ObjectSpeed)
首先我们建立了一个称为MyVehicle的Vehicle对象。接着我们调用MyVehicle对象的GetSpeed()方法。注意点(称为点操作符)是如何把对象名称与方法名称分开的。所有的Visual Basic .NET对象都使用这种语法格式。
我们假定机动车正在以55英里/小时的速度运行。ObjectSpeed的值被指定为55。如果我们把当前的速度的相反值(-55)传递给ChangeSpeed()方法,我们是在让车子停下来。
我知道目前这个例子中的很多语法细节你并不了解。不要担心。现在你只需要知道UML类图表是什么以及它所传达的信息类型。
为什么有些方法用减号做了标记?很明显这意味着它们是私有方法,不允许在类的外部使用。这些方法是类自己用于完成事务的内部使用的辅助方法。例如OkToShiftGears()方法可能检查CurrentGear和CurrentSpeed值,看变换齿轮是否安全。如果CurrentSpeed为55,现在把齿轮转变为Reverse并不是好主意。因此ChangeGear()可能调用OkToShiftGears()帮助决定改变齿轮是否安全。
UML类图表的背后的想法是给你一条快速、简洁的表述类做什么工作,以及你作为程序员希望怎样与它交互。如果你认为类是"黑盒",减号就表示盒子内部的东西,类的用户不能干涉它;加号就表示你用于与类的属性和方法交互的途径。换句话说,类的公共项定义了类对象的接口,以及你如何与它交互。
编程技巧
记住是公共(Public)方法表明程序员必须如何使用该类。只要你不改变这些方法的使用方式,与这些程序的接口就不会改变。这保持了类的一致性。
另一方面,你可以把私有方法改变为想要的内容并且不需要担心因为你改变了他们工作的方式而受到其它的程序员的责备。实际上,他们永远没有办法看到或使用私有方法。通常这意味着应该保持公共方法尽可能简单并使用私有方法管理手头的事务的细节。
总结
在本文中你看到了实际上任何编程问题都可以被归纳为五个简单的步骤。你也看到了如何把这五个步骤作为设计程序的出发点。你看到了如何使用每个步骤的横向优化给程序设计添加细节。最后,我们把UML类图表作为更常规的方法学来思考程序设计。
花费几分钟思考一下类和对象。如果有时间,你能想到希望的类并使用五个步骤概括它的设计。这完成以后,把该设计转换为UML类图表。考虑你在设计中建立的接口并问问自己它是否足够完成类的事务,是否足够简单,足够容易使用。这是设计过程中你必须经常问自己的问题。
随着经验的增加类和程序设计会更容易。尽管目前它看起来象魔术,但是你很快会享受它的。