2

目前我正在研究 C# 中的向量类,现在我要说到点子上了,我必须弄清楚,我想如何实现两个向量之间的插值函数。起初我想将这些函数直接实现到向量类中......

public class Vector3D
{
    public static Vector3D LinearInterpolate(Vector3D vector1,
        Vector3D vector2, double factor) { ... }

    public Vector3D LinearInterpolate(Vector3D other, double factor { ... }
}

(我总是同时提供:一个静态方法,两个向量作为参数,一个非静态方法,只有一个向量作为参数)

...但后来我有了使用扩展方法的想法(例如,在一个名为“插值”的单独类中定义),因为插值实际上并不是仅可用于向量的东西。所以这可能是另一种解决方案:

public class Vector3D { ... }

public static class Interpolation
{
    public static Vector3D LinearInterpolate(this Vector3D vector,
        Vector3D other, double factor) { ... }
}

因此,这里有一个示例,您将如何使用不同的可能性:

{
    var vec1 = new Vector3D(5, 3, 1);
    var vec2 = new Vector3D(4, 2, 0);
    Vector3D vec3;

    vec3 = vec1.LinearInterpolate(vec2, 0.5); //1
    vec3 = Vector3D.LinearInterpolate(vec1, vec2, 0.5); //2

    //or with extension-methods

    vec3 = vec1.LinearInterpolate(vec2, 0.5); //3 (same as 1)
    vec3 = Interpolation.LinearInterpolation(vec1, vec2,
        0.5); //4
}

所以我真的不知道哪个设计更好......我也不知道这样的事情是否有最终的规则,或者它是否只是个人更喜欢的东西......但我真的很想听听你的意见,什么更好(如果可能的话,为什么;))。

4

1 回答 1

0

这些答案中有很多优点设计 API 的最佳实践和指南

但是这里的事情如下:如果可以通过使用类的公共 API 在外部实现任何东西,则不要将其实现为成员函数。不过,我不记得我在哪里读到的(可能是 Eric Lippert 那个家伙)。

更新

就是那个斯科特迈耶斯的家伙。什么时候函数应该是成员函数?. 对不起埃里克!

注释后的示例

按照 Scott 的建议,我将在名为or作为非扩展的单独静态类中实现 , 等LinearInterpolation。之后,我会尝试使用该 API 提出代码示例——可能是很多实际的单元测试。如果 API 是可用的、高效的和简洁的,那应该会给我一种良好而可靠的感觉。如果结果很笨拙:违背 Scott 的建议。只要确保首先获得证据。DotProductVectorMathVectorAlgorithms

于 2013-11-10T19:43:56.280 回答