Kata18的快速解决方案:传递依赖

戴夫(Dave)的第18张kata请求我们建立一个简单的传递依赖分析器。 代码下载以及我对本系列其他片的解决方案。

关于依赖项的一个隐患是,它们是可传递的-如果A依赖于B并且B依赖于C,那么A也依赖于C。因此,让我们编写一些代码来计算一组项目的完整依赖项。 该代码将一组行作为输入,其中第一个标记是项的名称。 其余的标记是此第一项所依赖的事物的名称。

对于kata的第一部分,最好将数据结构可视化为树

在图中,A依赖于B,C,D和E。

为了使代码域特定,我为Node和DirectDependencies创建了一个类型别名。 这使得在使用代码时可视化我们所指的内容变得更加容易。

  typealias节点=字符串 
  typealias DirectDependencies = [节点:[节点]] 

add方法用于加载节点及其依赖项,并将其存储在allDirectDependencies字典中。

当调用findAllDependencies(node :, directDependencies :)时,我们递归地“沿着树走”,从传入的节点开始,并跟踪所有直接依赖项。

在我们遇到循环依赖的情况之前,这种方法可以正常工作。 哪里

A依赖于B

B依赖于C

C依赖于A

有两种方法可以处理这种情况,第一种是检测它,但是只对每个节点进行一次评估以避免无限循环。 第二个(以及我所讨论的)是说循环依赖项是无效状态,并引发异常。

我创建一个allDependencies属性,在调用findAllDependencies方法时将其添加到初始节点。 每次通过递归循环时,我都会检查是否找到的所有indirectDependencies已存在于allDependencies中。 如果没有,我将它们添加到集合中。 如果是这样,我会跳出循环并返回DependencyError.Circular类型的错误。

有关此Kata的完善功能实现,请查看Josh Smith的解决方案。