【问题标题】:Calculate the Martin-Metrics for packages计算包的 Martin-Metrics
【发布时间】:2021-06-29 09:11:57
【问题描述】:

计算见:https://101.jqassistant.org/calculate-metrics/index.html

  • Ca(传入耦合): 此组件外依赖于此组件内的类的类的数量。简而言之:传入依赖项的数量。
  • Ce(传出联轴器) 此组件内的类数取决于此组件外的类。简而言之:传出依赖项的数量。

给出的是汽车模拟应用程序的 UML 图。每一层都代表自己的包。

计算四个包的 Martin-Metrics。

除了初始化之外,这是分层架构的正确示例。因此再次计算传入和传出耦合,这次没有初始化包。

哪个数字暗示这三个包可能形成正确的分层架构?

我想知道我的解决方案是否正确,以及我的计算是否正确。

【问题讨论】:

  • 不知道,但是您在关联之外的类中放置的调用是错误的。类图不对行为建模。您可以只命名关联或在它们旁边放置注释以表明它们的用途。但这只是糟糕的设计。

标签: oop architecture uml metrics


【解决方案1】:

如何在 UML 图中找到依赖关系?

直接依赖关系用虚线箭头记录。

依赖关系也可以从关联(以及聚合和组合)中扣除:

  • 当存在未指定的可导航性且没有关联端所有权时,我们无话可说:关联可以拥有端并管理链接。
  • 我们可以假设可导航关联和拥有关联端(点表示法)的依赖关系:关联至少需要知道箭头或点端的类。
  • 对于反向依赖,我们不能肯定地说什么,以防在相反方向上未指定可导航性;它可以导航或不导航。我们可以假设不存在依赖关系,因为这里没有正式标识依赖关系。

我们假设图表是全面的,并且确实显示了所有相关的类。

图表和指标中的依赖项清单

库存:

  • SensorBus 直接依赖于Dashboard。注意依赖notifies()的标签很奇怪。是否是使用依赖(即操作notifies() 使用Dashboard 作为参数,但它从哪里获取此参数)?
  • 初始化中的Startup 依赖于DashboardSensorBusCar
  • UI 中的Dashboard 依赖于Locale
  • 功能层中的SensorBus依赖于SensorCar,以及同一个包中的WeatherLocale
  • 硬件层中的Car 依赖于同一个包中的Sensor
  • 硬件层中的Sensor 依赖于同一个包中的SensorType

根据您的定义,这导致我们:

                      Ca    Ce
----------------------------------
Initialization         0     3
UI                     2     1
Functional layer       2     3 !!
HW layer               2 !!  0

是的:HW 包之外的 2 个类依赖于 HW 类。
是的:功能层,SensorBus 依赖于 3 个外部类:CarSensorDashboard

背景材料中的问题

您链接文档中使用的措辞对 Ce 含糊不清:

  • 该组件内依赖于该组件外的类的类数”与定义的第二部分相矛盾,因为它不对应于“流出的流”。
  • 正确的定义更像是“一个包中的类所依赖的其他包中的类的数量”(来源:wikipediathis blog

另外,计算的包级别有问题:

  • CaCe 定义明确,因为类易于应用,因为您只需计算依赖项的一侧或另一侧的唯一类。
  • 对于组件和包,我们还应该继续计算类吗?或者我们应该在包的同质级别上工作,即计算与其他包的依赖关系? Martin 和大多数作者都选择了课程。但这似乎不一致:如果我有一个包含一个暴露嵌套类的类的包,则依赖项将计算顶级类(因为嵌套类只是封闭类的一个细节),而具有直接提供相同功能的包的相同设计类而不是嵌套它们会计算更多的类和更高的 Ca 或 Ce。

【讨论】:

  • 你能解释一下为什么HW layerCa = 2 而不是Ca = 3SensorBusCarSensor 我只算一次,还是什么原因?
  • @Mr.Hankey 根据定义,我们必须计算硬件组件外部依赖于内部类的类的数量。我计算了 SensorBus(它只是一个外部类,即使它出现在两个依赖项中)和 Startup。歧义是非正式的简短定义,它建议计算依赖项而不是类。为什么是类而不是依赖项?因为 Ca 旨在量化变化传播。例如,如果我大幅更改硬件,我可能需要在其他地方更改什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 2020-10-09
  • 2015-09-08
  • 1970-01-01
  • 2021-10-05
  • 2019-06-21
  • 1970-01-01
相关资源
最近更新 更多