在C#中使用单精度坐标值创建自定义3D Point
类时,我必须编写一种方法来计算两点之间的距离。然后我想到了A -> B
图表符号意思"从A到B",我想到了重载>
运算符,因为没有意义思考A点是& #34;更大"而不是B点(此外,->
运算符不能重载)。
所以我创建了以下方法:
/// <summary>
/// Calculates the Manhattan distance between the two points.
/// </summary>
public static float operator>(Point p1, Point p2)
{
return Math.Abs(p1.X - p2.X) +
Math.Abs(p1.Y - p2.Y) +
Math.Abs(p1.Z - p2.Z);
}
/// <summary>
/// Calculates the euclidean distance between the two points.
/// </summary>
public static double operator>=(Point p1, Point p2)
{
return Math.Sqrt(Math.Pow(p1.X - p2.X, 2) +
Math.Pow(p1.Y - p2.Y, 2) +
Math.Pow(p1.Z - p2.Z, 2));
}
这导致代码如下:
var manhattan = A > B;
var euclidean = A >= B;
代码似乎是混淆的,但是一旦掌握了它,它就很容易阅读,并且比使用A.DistanceTo(B)
更短。
问题是,我应该完全避免使用这种代码吗?如果是这样,原因是什么?我非常关心清洁代码,我不确定这可以被视为 clean 。如果您认为有时允许此类代码,您能提供示例吗?
答案 0 :(得分:3)
通常你应该避免使用这种代码(除非它是更深入的DSL的一部分)。
覆盖具有意外行为的常见运算符和方法会使得很难获取,理解和调试代码。
想象一下,你正在读一本书,虽然这些文字看起来像英文,但是作者通过在后面的附录中做了一些笔记来改变几个关键词的含义,所以你不断地来回翻看句子意味着你的想法。
代码应该写成人类阅读。你完成这项任务越容易,你所包含的意外就越少,就会越好。