2011-08-06 15 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)); –

相關問題