코드를 짤때는 모르지만 뒤에 다시 보면 생각보다 중복된 부분들을 쉽게 찾을 수 있다.
오늘은 이런 부분을 한번 고쳐보았다.
중복된 코드는 전반적인 관리 차원에서도 매우 좋지 못하지만,
확장성이 부족한 코드라는 반증이기도 하다.
이번에 중복된 코드를 작성한 부분은 타일 셀을 서로 다른 방식으로 상호작용한 곳이었다.
public void ShowMovableCells(Vector2 startCoord, int maxDistance)
{
ShowCells(startCoord, maxDistance, AddCostForMove, FilterForMove);
}
public void ShowSkillRangeCells(Vector2 startCoord, int maxDistance)
{
ShowCells(startCoord, maxDistance, AddCostForSkill, FilterForSkill);
}
위의 코드는 리팩토링 후의 모습인데, 이처럼 타일 셀을 보여주는 경우가 2가지 있었다.
근데 리펙토링 전에는 ShowCells 부분이 이 메서드에 각각 중복되어 구현되어 있었다.
이 부분을 처리한 방법은 델리게이트였다.
void ShowCells(Vector2 startCoord, int maxDistance, Func<int, int, int> costLogic, Func<Vector2, bool> filter)
{
activeCells.Clear();
FloodFill(startCoord, maxDistance, costLogic, (coord) => {
activeCells.Add(coord);
maps[coord].gameObject.SetActive(true);
});
FilterCells(filter);
}
매개변수로 타일 셀의 비용 처리 로직과 필터링 로직을 전달해서
탐색은 동일한 방식으로 사용하되, 이것을 중간에 처리하는 부분을 다르게 하는 것이었다.
필터링 로직은 다음과 같이 작성했다.
int AddCostForMove(int curCost, int newCost) => newCost > 0 ? curCost + newCost : -1;
int AddCostForSkill(int curCost, int newCost) => newCost > 0 ? curCost + 1 : -1;
int AddCostNaively(int curCost, int newCost) => curCost + 1;
bool FilterForMove(Vector2 coord) => maps[coord].Cost < 0 || maps[coord].unitIndexInCell >= 0;
bool FilterForSkill(Vector2 coord) => maps[coord].Cost < 0;
이렇게 미리 만들어둔 메서드를 다시 아래 코드처럼 매개변수로 넣어주었다.
public void ShowMovableCells(Vector2 startCoord, int maxDistance)
{
ShowCells(startCoord, maxDistance, AddCostForMove, FilterForMove);
}
public void ShowSkillRangeCells(Vector2 startCoord, int maxDistance)
{
ShowCells(startCoord, maxDistance, AddCostForSkill, FilterForSkill);
}
#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL