目前,我正在用Vector编写一个C#类,现在我要指出的是,我想要实现一个函数/方法来在两个向量之间插值。(显而易见)也是我的第一个解决方案是将其作为向量类本身中的一个方法实现:
public class Vector3D
{
public static Vector3D LinearInterpolate(Vector3D vector1,
Vector3D vector2, double factor) { ... }
public Vector3D LinearInterpolate(Vector3D other, double factor { ... }
}(我决定提供两个向量作为参数的静态方法和一个非静态的方法,其中只有一个向量作为参数)
但后来我想到了使用扩展方法(例如,在一个单独的类中定义的,例如Interpolation ),因为插值并不仅仅限于向量。因此,这可能是另一种方法:
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
}我真的不能决定哪种设计更好。在如何实现与上述方法/功能类似的方法/功能方面,是否存在经验法则,还是说这是一个优先考虑的问题?我真的很想听听你对什么更好--如果可能的话--为什么。
发布于 2013-11-10 23:26:23
也许是我来自Java,但我真的不喜欢扩展方法,除非有很好的理由。
如果您想重用操作代码,解决方案应该是组合。创建一个在Interpolator上操作的IEnumerable<double> (不幸的是,C#似乎缺少与java.lang.Number相当的功能,因此您无法轻松地使该类泛化)。我不认为您的Vector类也实现它是个坏主意。
为了获得额外的分数,请使类成为定义操作的接口,并在对象中注入接口的实例,这样您就可以随意更改实现(如果它们与方法签名匹配,甚至可以使用其他类型的内插)。
发布于 2013-11-12 13:09:34
不要使用静态类、静态方法(包括扩展方法),除非确实需要它们(可能是因为遗留代码,或者是因为扩展了.Net框架对象)。
关于为什么静态不好的深入解释可以找到这里。
对于您的Vector3类,为什么不直接编写一个(非静态)类呢?
public interface ILinearInterpolation
{
void Interpolate(Vector3 a, Vector3 b, double factor);
}现在,您可以针对该接口编写一个实现。
另一种方法是将一个成员方法内插--但是您应该尽量保持类接口简单、小。现在,我同意向量类和矩阵类是一个例外,因为它们比大多数其他类具有更大的固有特性集,因为向量应该能够做很多数学方面的事情;您在注释中提到了标准化()作为一个例子。尽管如此,我觉得插值应该在它自己的类中。
发布于 2013-11-12 14:19:49
我将使用接口和泛型(Vector2、Vector4等)对插值实现类使用相同的实现,然后添加一个扩展方法以使使用更加干净。
public class Vector3
{
//Implementation
}
public interface IInterpolation<T>
{
T Interpolate(T first, T second, double factor);
}
public class LinearInterpolation<T> : IInterpolation<T>
{
T Interpolate(T first, T second, double factor)
{
return first + ((second - first) * t);
}
}
public static Vector3Helper
{
public static Vector3 LinearInterpolation(this Vector3 vector, Vector3 other, double factor)
{
var interpolation = new LinearInterpolation<Vector3>()
return interpolation.Interpolate(vec1, vec2, 0.5);
}
}用法:
Vector3 vec1 = new Vector3(1, 1, 2);
Vector3 vec2 = new Vector3(3, 1, 2);
var interpolation = new LinearInterpolation<Vector3>()
var result interpolation.Interpolate(vec1, vec2, 0.5);或者使用扩展方法:
var result = vec1.LinearInterpolation(vec2 0.5);https://softwareengineering.stackexchange.com/questions/218065
复制相似问题