Swift结构:协议(带有asoc。类型)v / s组成

时间:2017-08-22 17:44:45

标签: swift struct protocols linear-algebra

我正在重构一个线性代数库。它包括Vector,Matrix和Tensor结构。到目前为止一切顺利,但由于其中三个概念上是 Tensors ,它们共享许多属性和底层行为。因此,我正在尝试重构,以便能够在它们之间共享更多代码和测试。

但我对Swift相当新,而且我不确定我是否应该使用Protocols:

  • 具有关联类型的TensorProtocol(“T”)。
  • 对TensorProtocol的扩展,它将所有常见行为实现为协议的“默认”。
  • Tensor,Matrix和Vector符合TensorProtocol。

这种方法的优点是可以在一个地方共享常见行为,并且可以覆盖以进行自定义。

缺点是:

  1. TensorProtocol不允许我指定内部逻辑。如果我想公开协议,我只能拥有公共变量。
  2. 我认为我无法聚合测试结构?因为带有AT的协议不能用作变量类型。
  3. 因此,我想到了第二种选择:

    • TensorSkeleton结构,包含结构内部Tensor的所有行为。
    • TensorProtocol,仅定义Tensor的API。
    • Tensor,Matrix和Vector,所有这些都包含TensorSkeleton,并使用它来符合TensorProtocol。

    这种方法允许我:

    1. 重用三个结构的所有Tensor逻辑。
    2. TensorSkeleton可以拥有比协议更精细的设计。由于它是一个结构,它可以有内部和私有字段和函数。
    3. 测试TensorSkeleton(至少对我而言)比测试协议更容易。通过测试,我可以保证使用它的所有结构。
    4. 但它有两个缺点:

      1. 它仍然不允许我聚合测试(与第一种方法相同),并且......
      2. 这个型号与我发生冲突。我来自C#,这将通过抽象类和类继承(Matrix:Tensor等)来解决。我的担忧是否合理?我从来没有使用过模型,其中继承的特征是通过组合而不是类继承传递的。 我知道线性代数对象更适合作为结构,但我仍然对这种设计有疑问。
      3. 非常感谢,对不起,我很抱歉。祝你有美好的一天。

0 个答案:

没有答案