我正在重构一个线性代数库。它包括Vector,Matrix和Tensor结构。到目前为止一切顺利,但由于其中三个概念上是 Tensors ,它们共享许多属性和底层行为。因此,我正在尝试重构,以便能够在它们之间共享更多代码和测试。
但我对Swift相当新,而且我不确定我是否应该使用Protocols:
- 具有关联类型的TensorProtocol(“T”)。
- 对TensorProtocol的扩展,它将所有常见行为实现为协议的“默认”。
- Tensor,Matrix和Vector符合TensorProtocol。
这种方法的优点是可以在一个地方共享常见行为,并且可以覆盖以进行自定义。
缺点是:
- TensorProtocol不允许我指定内部逻辑。如果我想公开协议,我只能拥有公共变量。
- 我认为我无法聚合测试结构?因为带有AT的协议不能用作变量类型。
醇>
因此,我想到了第二种选择:
- TensorSkeleton结构,包含结构内部Tensor的所有行为。
- TensorProtocol,仅定义Tensor的API。
- Tensor,Matrix和Vector,所有这些都包含TensorSkeleton,并使用它来符合TensorProtocol。
这种方法允许我:
- 重用三个结构的所有Tensor逻辑。
- TensorSkeleton可以拥有比协议更精细的设计。由于它是一个结构,它可以有内部和私有字段和函数。
- 测试TensorSkeleton(至少对我而言)比测试协议更容易。通过测试,我可以保证使用它的所有结构。
醇>
但它有两个缺点:
- 它仍然不允许我聚合测试(与第一种方法相同),并且......
- 这个型号与我发生冲突。我来自C#,这将通过抽象类和类继承(Matrix:Tensor等)来解决。我的担忧是否合理?我从来没有使用过模型,其中继承的特征是通过组合而不是类继承传递的。
我知道线性代数对象更适合作为结构,但我仍然对这种设计有疑问。
醇>
非常感谢,对不起,我很抱歉。祝你有美好的一天。