Question: 在构建Internal Block Diagram(IBD)的时候,发现ItemFlow似乎只能convey特定的Classifier(i.e., DataType, ValueType, Block, and Signal),而不能convey Primitive Type (i.e., Real, Integer, Boolean, and String)。然后就开始了探索之旅。
1. Concepts relationship: Classifier之间的关系
如下所示的继承关系:
Classifier
├── DataType 如自定义的复合数据类型
│ ├── PrimitiveType
│ │ ├── Real
│ │ ├── Integer
│ │ ├── Boolean
│ │ └── String
│ └── (其他自定义的 DataType)
├── Class
├── Interface
├── Signal
├── Block (SysML) 表示更复杂的实体或组件
└── ValueType (SysML) 如定义的物理量(带有单位和量纲的数值类型)
2. ItemFlow的conveyed item
ItemFlow表示两个连接点(分别属于两个模块)之间传递的物理项或信息项。它指定所传递的元素类型必须是Classifier或者其子类,包含DataType, ValueType, Block, Signal。
3. Primitive Type Definition and Application
在SysML和UML中, Primitive Types是一种特殊的DataType,通常用于表示最基础的数据(i.e., Real, Integer, Boolean, and String)。尽管它们是Classifier的子类型(e.g., 继承关系:Classifier-->DataType-->PrimitiveType-->Real),但是SysML明确地限制了Prrimitive Types的使用场景。
- Primitive Types的意图,这些类型主要用于定义属性(properties)或操作(operations)的数据类型,而不是用于在ItemFlow中传递
- ItemFlow的语义要求:SysML设计中倾向于使用明确建模的DataType或ValueType,以便清晰地表达模型中的含义和物理量关系。ItemFlow表示两个连接点(分别属于两个模块)之间传递的物理项或信息项。它指定所传递的元素类型必须是Classifier或者其子类,包含DataType, ValueType, Block, Signal。
因此,在SysML IBD中,ItemFlow不允许直接传递 Primitive Types(如 Real、Integer、Boolean、String),而是需要通过更明确的 DataType 或 ValueType 来表示这些内容。
4. ItemFlow为什么允许使用Primitive Types
建模的严谨性和可读性
- 使用Primitive Types作为conveyed内容,缺乏明确的语义和上下文。比如,Real或者Integer本身无法描述它表示什么物理量或者概念。
- 使用ValueType或自定义的DataType可以为这些数据添加单位,量纲,描述或者约束条件。例如:
- 定义一个ValueType为Length, 单位为米(m),量纲为长度
- 定义一个DateType为Position, 包含多个相关的坐标值
和SysML的建模目标一致
- SysML的核心目标是支持系统工程和物理建模,需要在模型中体现清晰的系统属性和关系
- 限制使用Primitive Types可以使得建模者更精确地定义数据的语义,而不是仅仅依赖基础数据类型
5. 如何处理Primitive Types的需求?(可以将Primitive Types 包装成自定义的 ValueType 或 DataType)
如果确实需要在ItemFlow中传递与Primitive Types类似的内容,可以通过以下方式解决:
- 定义对应的ValueType
# 将Real类型扩展为一个具有单位和量纲的ValueType,如Speed或者Temperature ValueType Speed { unit: m/s dimension: velocity }
- 定义对应的DataType
# 定义一个DataType来传递复杂的数据结构,其中包含属性类型为Real, Integer等字段 DataType Position{ x: Real y: Real z: Real }
6. 总结
在SysML IBD中, ItemFlow的converyed的属性只能使用Classifier(i.e., DataType, ValueType, Block etc.),而不能直接使用UML的Primitive Types (i.e., Real, Integer, Boolean, String)。这种限制的目的是促进建模的严谨性和可读性。可以该将Primitive Types包装成自定义的ValueType或DataType来传递更清晰的语义信息.