哪个代码更干净,更快,更优雅/更可取?有没有这样做的功能?

时间:2011-08-06 15:50:24

标签: c# xna

我写了这两个用于校正矩形。例如,如果矩形具有以下属性:

X:32,Y:32,宽度:-32,高度:-32

这将使矩形X:0,Y:0,宽度:32,高度:32

if (r.Width < 0)
{
    r.X -= Math.Abs(r.Width);
    r.Width = Math.Abs(r.Width);
}
if (r.Height < 0)
{
    r.Y -= Math.Abs(r.Height);
    r.Height = Math.Abs(r.Height);
}

这是#2

r.X -= Math.Abs(Math.Min(0, r.Width));
r.Width = Math.Abs(r.Width);

r.Y -= Math.Abs(Math.Min(0, r.Height));
r.Height = Math.Abs(r.Height);

他们都工作得很好。我的问题是哪个?我觉得第一个可能更快,更可读,但第二个代码行更少。而且,我觉得这可能是已经发明的东西。是否有一种方法可以在.NET或XNA Framework中执行此操作?

谢谢!

编辑:有人发布了第二种方式的缩短版本,我非常喜欢并将其合并到此:

r = new Rectangle(r.X + Math.Min(0, r.Width), r.Y + Math.Min(0, r.Height), Math.Abs(r.Width), Math.Abs(r.Height));

老实说,我更喜欢更少的线路,我不认为这太复杂了。如果有的话,我可以发表评论或将其封装到具有描述性名称的方法中。

2 个答案:

答案 0 :(得分:3)

如果你知道r.Width和r.Height是&lt; 0为什么你需要对他们进行Abs?删除它,它会更快,更简单。

if (r.Width < 0)
{
    r.X += r.Width;
    r.Width = -r.Width;
}
if (r.Height < 0)
{
    r.Y += r.Height;
    r.Height = -r.Height;
}

恕我直言,你写这篇文章的第二种方式简直就是丑陋。你不看它,立刻意识到它在做什么。记住KISS。

编辑:我理解你喜欢你的代码尽可能少,所以我重新设计了上面的代码:

if (r.Width < 0) { r.X += r.Width; r.Width = -r.Width; } if (r.Height < 0) { r.Y += Height; r.Height = -r.Height; }

同样简单 - 并且只需一行代码!线路上的角色甚至比你的替代品还要少......

行数通常不是编程美的一个很好的衡量标准 - 但当然这是你的代码所以你必须选择带给你最大乐趣的东西。

答案 1 :(得分:1)

第一个更具可读性,它也应该稍快一点,因为如果没有任何事情可以做得更少。

在检查值是否为负数后,您知道它们是否定的,因此您不需要任何Math.Abs

if (r.Width < 0) {
    r.Width = -r.Width;
    r.X -= r.Width;
}
if (r.Height < 0) {
    r.Height = -r.Height;
    r.Y -= r.Height;
}

为了完整起见,第二个也可以写成Math.Abs次呼叫,因为你知道Math.Min当它不为零时出现的信号:

r.X += Math.Min(0, r.Width);
r.Width = Math.Abs(r.Width);
r.Y += Math.Min(0, r.Height);
r.Height = Math.Abs(r.Height);