
Разработка ПО на профессиональном уровне v.2
.0.pdf
Рефакторинг
public void lifeCycle(boolean[][] board, int size)
{
boolean[][] buf=new boolean[size][size]; for (int x=0;x<size;x++)
{
for (int y=0;y<size;y++)
{
int neighbours = 0;
neighbours+=x>0 && y>0 && board[x-1][y-1]?1:0; neighbours+=x>0 && board[x-1][y]?1:0; neighbours+=x>0 && y<size-1 && board[x-1][y+1]?1:0; neighbours+=y>0 && board[x][y-1]?1:0; neighbours+=y<size-1 && board[x][y+1]?1:0; neighbours+=x<size-1 && y<0 && board[x+1][y-1]?1:0; neighbours+=x<size-1 && board[x+1][y]?1:0;
neighbours+=x<size-1 && y<size-1 && board[x+1][y+1]?1:0;
Шаг 2

Рефакторинг
if(board[x][y])
{
if(neighbours<2 || neighbours>3) buf[x][y]=false;
else
buf[x][y]=true;
}
else
{
if(neighbours==3)
buf[x][y]=true;
else
buf[x][y]=false;
}
}
}
for(int i=0;i<size;i++) for(int j=0;j<size;j++)
board[i][j]=buf[i][j];
}
Шаг 2

Что надо уметь программисту?
●функция должна делать только одну операцию и делать это хорошо;
Сфокусированность |
Связанность |
Cohesion |
Coupling |
Высокая
Низкая

Что надо уметь программисту?
●функция должна обладать высокой сфокусированностью и низкой связностью;
Сфокусированность |
Связанность |
Cohesion |
Coupling |
Высокая
Низкая

Рефакторинг
private boolean getNewCellState(boolean oldState, int neighbours)
{
if(oldState)
{
if(neighbours<2 || neighbours>3) return false;
else
return true;
}
else
{
if(neighbours==3) return true;
else
return false;
}
}
private void copyMatrix(boolean[][] from, boolean[][] to, int size)
{
for(int i=0;i<size;i++) for(int j=0;j<size;j++)
to[i][j]=from[i][j];
}
Шаг 3

Рефакторинг
public void lifeCycle(boolean[][] board, int size)
{
boolean[][] buf=new boolean[size][size]; for (int x=0;x<size;x++)
{
for (int y=0;y<size;y++)
{
int neighbours = 0;
neighbours+=x>0 && y>0 && board[x-1][y-1]?1:0; neighbours+=x>0 && board[x-1][y]?1:0; neighbours+=x>0 && y<size-1 && board[x-1][y+1]?1:0; neighbours+=y>0 && board[x][y-1]?1:0; neighbours+=y<size-1 && board[x][y+1]?1:0;
neighbours+=x<size-1 && y < 0 && board[x+1][y-1]?1:0; neighbours+=x<size-1 && board[x+1][y]?1:0; neighbours+=x<size-1 && y<size-1 && board[x+1][y+1]?1:0; board[x][y]=getNewCellState(board[x][y], neighbours);
}
}
copyMatrix(buf, board, size);
}
Шаг 3

Рефакторинг
public void lifeCycle(boolean[][] board, int size)
{
boolean[][] buf=new boolean[size][size]; for (int x=0;x<size;x++)
{
for (int y=0;y<size;y++)
{
int neighbours = 0;
neighbours+=x>0 && y>0 && board[x-1][y-1]?1:0; neighbours+=x>0 && board[x-1][y]?1:0; neighbours+=x>0 && y<size-1 && board[x-1][y+1]?1:0; neighbours+=y>0 && board[x][y-1]?1:0; neighbours+=y<size-1 && board[x][y+1]?1:0;
neighbours+=x<size-1 && y < 0 && board[x+1][y-1]?1:0; neighbours+=x<size-1 && board[x+1][y]?1:0; neighbours+=x<size-1 && y<size-1 && board[x+1][y+1]?1:0; board[x][y]=getNewCellState(board[x][y], neighbours);
}
}
copyMatrix(buf, board, size);
}
Шаг 3

Что надо уметь программисту?
Больше одинаковых строк кода
Больше мест, куда надо внести изменения
Больше времени на |
Больше вероятность |
изменения |
совершить ошибку |

Что надо уметь программисту?
Дублирование кода - это не просто одинаковые символы
neighbours+=x>0 && y>0 && board[x-1][y-1]?1:0; neighbours+=x>0 && board[x-1][y]?1:0; neighbours+=x>0 && y<size-1 && board[x-1][y+1]?1:0; neighbours+=y>0 && board[x][y-1]?1:0; neighbours+=y<size-1 && board[x][y+1]?1:0;
neighbours+=x<size-1 && y < 0 && board[x+1][y-1]?1:0; neighbours+=x<size-1 && board[x+1][y]?1:0; neighbours+=x<size-1 && y<size-1 && board[x+1][y+1]?1:0;

Рефакторинг
public void lifeCycle(boolean[][] board, int size)
{
boolean[][] buf=new boolean[size][size]; for (int x=0;x<size;x++)
{
for (int y=0;y<size;y++)
{
List<Point> neighbours = getNeighbours(x,y);
List<Point> legalNeighbours
=filterNeighbours(neighbours, size); int aliveNeighbourCount
=countAliveNeighbours(legalNeighbours, board); board[x][y]
=getNewCellState(board[x][y], aliveNeighbourCount);
}
}
copyMatrix(buf, board, size);
}
Шаг 4