2014-08-29 283 views
-2

我試圖重構我在網上找到的圖片程序的代碼片段,我只是想知道是否有人可以幫助我。原始代碼的作者選擇使用嵌套for循環,我知道這是不正確的。任何想法來幫助我解決它?重構嵌套for循環

for (int x = 0; x < this.width(); x++) { 
    for (int y = 0; y < this.height(); y++) { 
     if (!this.getColor(x, y).equals(typeCastedPicture.getColor(x, y))) { 
      return false; 
     } 
    } 
} 

我最初只是嘗試使用私有方法作爲解決方案;然而,我遇到的問題是因爲它是布爾類型的。我只是不確定如何正確重構,而不會扭曲語義。任何幫助將不勝感激。

該代碼按原樣正確工作;但是,我目前使用eclipse和checkstyle標誌,無論你在嵌套塊中編碼。我只是想看看你們中的任何一個人能否幫助我弄清楚如何在不使用嵌套循環的情況下獲得相同的效果。

+2

幽州:「*原代碼的作者選擇使用嵌套for循環,我知道這是不正確的。*「爲什麼?這段代碼似乎有什麼問題? – 2014-08-29 02:40:01

+1

對我來說看起來非常正確。 – 2014-08-29 02:41:58

+0

您可能在第一個循環中有兩個開放的括號 – Mshnik 2014-08-29 03:09:40

回答

1

是的,這是可能的,但不是沒有使代碼臭。爲什麼嵌套循環在你的情況下很好是因爲你正在迭代n * n矩陣。以系統和直接的方式來做這件事似乎是一個很好的做法。無論如何,如果你只是感興趣,可以考慮我們只需要以線性方式複製嵌套循環行爲。這就是說我們需要解開嵌套的循環。這裏有一個例子...

for (int x = 0, y = 0; x < this.width();) { 
    if (!this.getColor(x, y).equals(typeCastedPicture.getColor(x, y))) { 
     return false; 
    } 
    if (y == this.height() - 1) { 
     y = 0; 
     x++; 
    } else ++y; 
} 

這應該會給出相同的結果。

這可以通過whiledo/while循環完成,但具有足夠的創造性,但需要對標記進行更多的手動控制。嵌套0​​的美妙之處在於它爲您處理。

+0

非常感謝! :)你是唯一一個給出我正在尋找的答案的人。我只是不明白如何在不使用n * n矩陣的情況下在邏輯上實現相同的效果。 – Ashton 2014-08-30 13:28:45

+0

沒問題。其他用戶可能會正確地指出您可能會感到困惑的重要部分;我剛剛回答了這個問題:) @Ashton。 – ChiefTwoPencils 2014-08-30 19:42:25

0
for (int x = 0, width = this.width(); x < width; x++) {  
    for (int y = 0, height = this.height(); y < height; y++) { 
     if (!this.getColor(x, y).equals(
      typeCastedPicture.getColor(x, y))) { 
       return false; 
     } 
    } 
} 

在這裏,我只是調整了代碼,以改善性能有點!除此之外,我沒有看到任何代碼問題。

+0

您100%正確,代碼編譯完成。我只是想重構代碼,以便我沒有使用任何嵌套塊。我目前正在使用eclipse,checkstyle說嵌套塊不是最佳實踐,這就是我試圖重構它的原因。 – Ashton 2014-08-29 03:10:18

0

可能有點重複的答案,但生病嘗試更深入一點。 您的評論建議您希望重構某些內容,因爲嵌套塊不是最佳做法。雖然這是事實,但它不一定是重構它的好理由。

重構應該完成以提高代碼質量。現在對於高質量的代碼有很多意見,但是對於我自己而言,可讀性是一個很重要的因素。除非您遇到市長表現問題,否則始終偏愛可讀性而不是性能(嵌套循環的原因是不好的做法)。

在這種情況下,代碼是完全可讀的並且很容易理解,而且我沒有看到這段代碼是您最大的性能問題,所以我建議將它保留原樣,因爲所有替代方法都會更加困難瞭解。

(如果你有很多的第二循環中操作的我會建議一:

for(...){ 
    for(...){ 
    fooBar(x,y); 
    } 
} 

建設,以保持可讀性)

+0

謝謝你的想法。我明白你來自哪裏,我會繼續考慮。我只是想讓所有checkstyle錯誤消失。非常感謝! :) – Ashton 2014-08-30 13:29:40