2014-08-29 177 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