【问题标题】:C# vector class - Interpolation design decision [closed]C# 向量类 - 插值设计决策 [关闭]
【发布时间】:2013-11-11 04:45:14
【问题描述】:

目前我正在研究 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
}

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

【问题讨论】:

  • 另一种选择是制作扩展方法,或者将static 从您的第一个代码块中取出。
  • 我认为程序员将是一个更好的地方来发布这个问题 - programmers.stackexchange.com
  • 如果您在设计方面需要帮助,我认为查看 XNA 或其他库/框架可能很有用。在 XNA 上,插值被定义为 Vector3 类的静态函数,如您所见 here
  • @FabioMarcolini:谢谢:)。我知道 XNA 的设计,但我不知道使用扩展方法是否会更好,即使这些人因找出“最佳”设计而获得报酬,而且他们不做任何事情一整天:P。
  • 程序员更适合概念性问题,比如设计模式等。

标签: c# vector extension-methods interpolation


【解决方案1】:

这些答案Best practices and guidelines for designing an API

有很多好处

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

更新

是斯科特·迈耶斯的那个人。 When should functions be member functions? 。对不起埃里克!

cmets 后的示例

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

【讨论】:

  • 我想我没有这么说。扩展方法专为难以或不可能向类型添加方法但可以基于类型的公共表面创建方法的情况而设计。在这种情况下,原始发布者可以向类型添加方法,并且该实现也可以利用私有细节。在我看来,这里的问题是插值操作是否适用于向量以外的对象。在那种情况下,我会说:当你有三个现实的例子时,进行抽象。以前没有。
  • @LumpN:好的,与 Scott Meyer 相关,我应该使用非成员方法(嗯,它是 C++,但我们暂时不要关心它),因为一切都可以用我的矢量类的“公共接口”(我现在是吗?)?但是,下一步是否也将“Normalize”和“DotProdut”等方法实现为非成员方法?事实上,在 C# 中,所有内容都需要存储在类中:是我的向量类中的静态方法还是更“非成员”的外部方法?
  • @EricLippert 哇,我没想到你会出现(这么快)。请原谅我粗鲁的电话。对我来说,你非常酷。雇用我! ;) 关于主题:将功能实现为非成员非扩展与非成员扩展方法(模拟成员功能)之间似乎有一条细线。我想知道扩展是否应该被视为 Meyers 建议中的成员。 FAIC?
  • @Benjamin 你是对的。 4个选项。我已经相应地更新了我的答案。选项 4 似乎是耦合度最低的,因此促进了封装(参见 Meyers)。为此而努力。在考虑之前证明与其他选项相比可用性降低。
  • 别担心,我没有被冒犯。这确实是一个有点棘手的电话,我可以看到斯科特迈耶斯的论点的优点。也许我会写一篇文章讨论利弊。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2014-05-26
相关资源
最近更新 更多