2011-08-06 18 views
1

我写了这两个修正矩形。例如,如果一个矩形具有以下属性:哪些代码更干净,更快,还是更优雅?有没有这样做的功能?

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)); 

老实说,我宁愿少线路更多,我不认为这是太复杂了。如果有任何事情,我可以发表评论或将其封装到具有描述性名称的方法中。

回答

3

如果你知道r.Width和r.Height是< 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; } 

一样简单 - 和所有在一行代码!它甚至更少的字符就行了比你的替代....

线数一般不编程之美的好办法 - 但当然这是你的代码,所以你得走了什么给你带来最快乐。

+0

我同意你的程度。是的,我认为上面的例子更清晰可读,但这是一个独立的项目,任何人都不会看到。无论哪种方式,我理解的代码,如果我在一条线上,我真的不必看它或考虑它。这有点像将某些东西封装到一个类中。你可以忽略它,忘记它并思考其他事情。当然这种行为可以通过将上面的代码放入一个方法并给它一个描述性名称来模拟,我也不一定反对。 –

+0

是的,第二个想法,我想我会与您的代码在您的帖子的顶部,并将其放置到一个方法。谢谢! –

+0

够公平 - 我尽可能缩短开发代码的编码 - 但是我打了它,因为其他人会看到我的代码(我会计算未来我在这方面忘记了代码如何作为另一个人的作用)。 –

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); 
+0

谢谢,我已经解决了这个问题:r = new Rectangle(rX + Math.Min(0,r.Width),rY + Math.Min(0,r.Height),Math.Abs​​(r.Width), Math.Abs​​(r.Height)); –