与继承合作——节省您的时间和理智!| Mendix

跳到主要内容

与继承合作——节省您的时间和理智!

您是否曾对多个实体进行建模,并意识到它们非常相似,具有许多共同的属性?使用继承可以节省您的时间并使您的项目更易于维护!在这篇文章中,我将向您展示什么是继承以及如何最有效地使用它。

基本认识

让我们从下面显示的新建域模型开始。如您所见,实体之间共享许多属性:

实体

在这里我复制了三个属性——Name、Year 和 NumberOfPassengers。由于这三个属性在 Car 和 Boat 实体之间是通用的,因此我可以将它们移动到一个新实体,我将其称为 Vehicle。我将使用这个新实体作为我的“通用”实体。创建 Vehicle 实体后,只需打开 Car 和 Boat 实体并选择 Vehicle 作为我的通用实体,即可轻松设置通用实体。

集合泛化

现在我已经设置了这种关系,我的汽车和船实体(“专业”实体)可以访问所有车辆属性!这使我可以设置我的汽车和船的名称并在一个地方进行管理。但需要注意的是,这并不意味着我的车辆可以访问我的船和汽车的属性。这是一种单向关系。

创建专业实体

在上一节中,我设置了域模型,创建了 Vehicle 实体并设置了继承关系。现在,我需要允许创建实体。有两种常用方法可以做到这一点:

  1. 为车辆的每种专业化创建一个按钮
  2. 为车辆创建一个按钮,用于指定专业化

第一个选项最容易实现,但用户体验不是最好的。以下是该实现的 UI:

UI-选项-1

每个按钮都会调用一个非常相似的微流来创建专门的对象 - 车辆,汽车或船(请注意,我仍然可以创建不是汽车或船的车辆 - 比如摩托车)。

这种方法非常简单,但有很多多余的微流程和按钮。想象一下,如果您有十个专业化,因此有十个按钮调用十个不同的微流程。这会创建一个混乱而混乱的页面。

这就是第二个选项变得有趣的地方!

选项​​2的

只有一个按钮,这个页面就好多了。这个按钮创建通用的车辆实体,然后我可以从该页面中选择要创建的专业化。

车型

选择车辆类型后,点击“下一步”并创建专门实体。

从这里开始,您可以轻松创建适当的专业实体并复制任何相关详细信息。但请确保删除通用实体(车辆),以免创建任何重复或脏数据。现在我已经创建了实体,我需要一种方法来显示和管理我的车辆。

显示和管理

显示和管理车辆列表的一种简单方法是使用列表视图。这在使用继承时特别有用,因为您可以为每个专业化设置不同的模板。

模板

使用模板让我可以在一个地方显示特定于船只或汽车的信息,而不必创建复杂的页面。它还允许您专门针对某些类型,而不针对其他类型。所有未创建特定模板的专业化都将使用“默认模板”。

现在我可以查看这些项目了,我需要创建“编辑”和“删除”按钮。同时,我还需要考虑继承关系,并优化可重用性。由于“船”也属于“车辆”,因此“船”的“编辑”和“删除”按钮可以包含“船”或“车辆”参数——但仅使用“车辆”参数才能在所有三个实体上重复使用。编辑时,我需要使用继承拆分。

绿色菱形是我的继承拆分。执行拆分后,我必须将我的车辆转换为专门的实体(如果适用)。完成此操作后,我就可以开始使用该实体作为其专门版本。对于删除,我不需要进行继承拆分。由于我删除的是实体,因此专门版本无关紧要——无论我删除的是船还是汽车,我都只是删除它。

这是一个很好的教训,但可能很难理解。除非我需要使用专门的版本(即编辑专门实体上的字段或显示需要它的页面),否则我不需要执行继承拆分。

数据网格和模板网格本身支持上述编辑功能。与我们在列表视图上设置模板的方式类似,我们可以使用默认的“编辑”按钮选择专业化的页面。

編輯頁面

除了数据网格、模板网格和列表视图的正常权衡之外,我现在还有特定于继承的权衡。列表视图允许显示特定数据,但我必须管理更多逻辑。对于数据网格和模板网格,平台管理我的一些逻辑,但我只能显示存储在通用实体上的信息。

现在我已经介绍了如何使用专业化来创建和管理实体,请尝试一下!请记住,使用继承有其优点和缺点,因此在使用之前请务必权衡这些优点和缺点。以下是一些一般经验法则:

  1. 切勿使用超过两层继承,因为这可能会导致性能问题。
  2. 仅在合乎逻辑的地方使用继承 - 我可能有一栋建筑、一辆汽车和一个人,它们都有姓名、年龄和地址字段,但如果将它们带入一个通用实体,这可能会造成混淆!

选择你的语言