I encountered a bit of code recently that screams out for refactoring. Problem is, I'm not sure of the most effective way to do this.
The context: this is a tic-tac-toe game that Paul Nelson and I paired on, in order to explore mobile device programming (Paul has an iPhone, I have a BlackBerry). Paul's not here right now to pair, unfortunately, hence the blog request (a really slow way of virtual pairing).
Here's the relevant code:
private boolean isRowWinner(int row) {
for (int column = 0; column < SIZE; column++)
if (grid[row][column] != currentPlayer)
return false;
return true;
}
private boolean isColumnWinner(int column) {
for (int row = 0; row < SIZE; row++)
if (grid[row][column] != currentPlayer)
return false;
return true;
}
private boolean isDescendingDiagonalWinner() {
for (int i = 0; i < SIZE; i++)
if (grid[i][i] != currentPlayer)
return false;
return true;
}
private boolean isAscendingDiagonalWinner() {
for (int i = 0; i < SIZE; i++)
if (grid[i][SIZE - 1 - i] != currentPlayer)
return false;
return true;
}
The field grid is simply a 3x3 matrix of Player references; Player is an enum; currentPlayer is a Player reference.
What's the most effective way to simplify these four methods, seemingly rampant with duplication? I'm not looking for a "clever" solution; I'm looking for one that still retains high levels of expressiveness.
UPDATE: tests and code
February 2004 March 2004 May 2004 September 2004 October 2004 January 2005 February 2005 September 2005 October 2005 November 2005 December 2005 January 2006 February 2006 March 2006 June 2006 August 2006 January 2007 February 2007 March 2007 April 2007 September 2007 October 2007 November 2007 December 2007 January 2008 February 2008 March 2008 April 2008 May 2008 June 2008 July 2008