我正在学习UML,需要了解一些关于类图的内容。
例如,我有一个名为person的类,其属性为firstname,surname和date of birth。
那么对象是什么呢?我理解类(包括person和其属性)和属性,但书中也提到了对象,那么对象指的是什么呢?
预先感谢您的帮助。
我正在学习UML,需要了解一些关于类图的内容。
例如,我有一个名为person的类,其属性为firstname,surname和date of birth。
那么对象是什么呢?我理解类(包括person和其属性)和属性,但书中也提到了对象,那么对象指的是什么呢?
预先感谢您的帮助。
Class
的定义就像在9/11之后的双子塔废墟中寻找某物一样 :-( 所以我将OMG发布的UML元模型作为XMI导入EA。然后我们发现:
类
您可以按照以下方式找到该元素:
它的注释如下:
类分类一组对象,并指定表征这些对象的结构和行为的特征。类可能具有内部结构和端口。
因此,看起来一个Class
是从对象派生出来的。这与18世纪的卡尔·林奈所做的事情非常相似。我们暂时可以把这个放在一边,开始寻找那些对象。
对象
试图在元模型中查找Object
元素结果什么也没有。也许这是有充分理由的,因为这涉及到形而上学。卡尔·林奈并不是唯一一个在思考世界分类的人。
顺便说一下:我在EA中创建了一个Class
实例,并最终得到了一个元类型为Object的元素。这是UML 2.0之前的遗物。我查看了UML 1.5并在第3-64页找到了object的定义:
3.39 对象
3.39.1 语义
对象表示类的特定实例。它具有标识和属性值。类似的符号也表示协作中的角色,因为角色具有类似实例的特征。
这已经被解决很长时间了,并且仍然是大多数人心中的想法。IT人员从头开始定义了几个类(考虑到某些要求),当您使用它们时就会有这些对象。这与我们的卡尔处理事情的方式完全相反。现在,在经过12年的UML 1.5之后,我们拥有了UML 2.5,但没有Object的痕迹!
因此,根据UML 2.5,Object不存在。但是我们有ObjectFlow
和ObjectNodes
。所以一定有什么东西。在UML 2.5的第12页上,您会发现:
6.3 UML的语义
6.3.1 模型及其所描述的内容
分类器。分类器描述了一组对象。对象是具有状态和与其他对象关系的个体。对象的状态标识了该对象的分类器属性值。 (在某些情况下,分类器本身也可以被视为个体;例如,请参见子条款9.4.3中关于静态结构特征的讨论。)
稍微往下一点:
UML模型不包含对象、实例或执行,因为这些个体属于被建模的领域,而不是模型本身的内容。UML确实具有直接建模个体的建模构造:实例规范、发生规范和执行规范,分别用于建模对象、实例和执行,以便在特定环境中进行建模。
说实话,我读到这个还挺惊讶的,因为我仍然停留在过去,我们有对象图(像EA这样的UML工具仍允许创建它们)。这可能是混淆的原因。对象太过复杂(自哲学诞生以来就一直在讨论),不能成为UML元素。相反,UML允许使用SD(序列图)等方式来突出对象的某些方面。
总结
这有点像先有鸡还是先有蛋的问题。将现实世界(“对象”)与所建模型(“类”)之间的映射很困难。这取决于您的目标。您是想了解已经存在的东西并勾画出它的行为,还是您发明了一些新的东西,想看看它如何交互?
无论如何,你的问题虽然简单,但却是一个非常好的问题!
我喜欢qwerty_so详细全面的回答。我可以提供一种直观的替代方案吗?
Person
将firstname
、surname
、dateOfBirth
定义为属性。它还定义了这些属性的类型。Person
类的对象,比如说John:Person
或Jane:Person
,对于每个属性都有特定的值。对象John
将具有firstname="John",lastname="Doe",dateOfBirth=1961-10-01
,而对象Jane
将具有firstname="Jane",lastname="Smith",dateOfBirth=1965-02-20
。在流行的编程语言中也可以尝试相同的差异。例如:
// definition of a class, i.e. the general rules
class Person {
private String firstname;
private String lastname;
...
public Person (String first, String last, ...) { ... }
public void doSomething() { ... }
}
// definition of objects, that abide by the classe's rules:
Person Jane = new Person("Jane", "Smith", ...);
Person P2 = new Person("John", "Doe", ...);
// the objects need to have their properties set. But the behaviors of the class can be used without redefining them
Jane.doSomething();