2015-04-28 49 views
2

我有这个重复的代码,我不确定我如何只用1种方法。重复2种方法制作成1种方法

public int isWonVertical() 
    { 
     for (int i = 0; i < columns; i++) 
     { 
      resetCounter(); 
      for (int j = 0; j < rows; j++) 
      { 
       if (raster[j, i] == 1) counterPlayer1++; 
       else counterPlayer1 = 0; 

       if (raster[j, i] == 2) counterPlayer2++; 
       else counterPlayer2 = 0; 

       if (counterPlayer1 == tokenStreak) return 1; 
       if (counterPlayer2 == tokenStreak) return 2; 
      } 
     } 
     return 0; 
    }//isWonVertical 


public int isWonHorizontal() 
    { 
     for (int i = 0; i < rows; i++) 
     { 
      resetCounter(); 
      for (int j = 0; j < columns; j++) 
      { 
       if (raster[i, j] == 1) counterPlayer1++; 
       else counterPlayer1 = 0; 

       if (raster[i, j] == 2) counterPlayer2++; 
       else counterPlayer2 = 0; 

       if (counterPlayer1 == tokenStreak) return 1; 
       if (counterPlayer2 == tokenStreak) return 2; 
      } 
     } 
     return 0; 
    }//isWonHorizontal 

返回resetCounter()我都可以放在1种方法。但是,如何确保for循环对于垂直/水平不同。我假设这是给参数提供的,然后检查是否给出了“垂直”或“水平”作为参数。但我不确定如何使这个实际工作。

谢谢。

+0

你是否在为性能做这件事?方法是否单独调用? 'counterPlayerx'是否需要成为班级(或任何你拥有的)? –

+2

我不确定你需要。你用两种不同的方法提出了两个不同的问题,这似乎是正确的。如果有的话,您可以将每种方法中的一些重复代码重构为第三种。 – aw04

+0

@Cᴏʀʏ是的表现,但更多的是“不要两次写同一个代码”。 counterPlayerX只用于我使用这些方法的类。 – JSadones

回答

5
public int isWon(DirectionEnum enum) 
    { 
     int counter1 = enum == DirectionEnum.IsVertical ? columns : rows; 
     int counter2 = enum == DirectionEnum.IsHorizontal ? columns: rows; 
     for (int i = 0; i < counter1 ; i++) 
     { 
      resetCounter(); 
      for (int j = 0; j < counter2; j++) 
      { 
       if (raster[i, j] == 1) counterPlayer1++; 
       else counterPlayer1 = 0; 

       if (raster[i, j] == 2) counterPlayer2++; 
       else counterPlayer2 = 0; 

       if (counterPlayer1 == tokenStreak) return 1; 
       if (counterPlayer2 == tokenStreak) return 2; 
      } 
     } 
     return 0; 
    } 
+4

这可能会更好,因为'isWon(DirectionEnum direction)';命名是混乱的。如果你能够对角地赢得胜利(或其他“布尔”无法处理的东西),会发生什么。 –

+0

**栅格**也有所不同,所以我假设也为**栅格**创建了2个变量? – JSadones

+0

@JSadones在两种情况下栅格都是相同的类型吗?只需将其作为附加参数传入即可。 – aw04

0

他的两个参数,一个用于内部阵列,一个用于外部。然后你的客户(呼叫代码)需要决定使用内部还是外部,行或列的内容

public int isWon(outerArray, innerArray) 
{ 
    for (int i = 0; i < outerArray; i++) 
    { 
     resetCounter(); 
     for (int j = 0; j < innerArray; j++) 
     { 
      if (raster[i, j] == 1) counterPlayer1++; 
      else counterPlayer1 = 0; 

      if (raster[i, j] == 2) counterPlayer2++; 
      else counterPlayer2 = 0; 

      if (counterPlayer1 == tokenStreak) return 1; 
      if (counterPlayer2 == tokenStreak) return 2; 
     } 
    } 
    return 0; 
} 
+0

缺点是,这不能提供一个清晰的API,因此可以改进。 – jarz