내일배움캠프 59일차 TIL

김정환·2024년 12월 6일
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);
    }

위의 코드는 리팩토링 후의 모습인데, 이처럼 타일 셀을 보여주는 경우가 2가지 있었다.
근데 리펙토링 전에는 ShowCells 부분이 이 메서드에 각각 중복되어 구현되어 있었다.

공통점과 차이점

  • 공통점
    • 이 코드를 작성할 때, 중복되었던 부분은 BFS를 이용한 타일 셀 표시 구현이었다.
  • 차이점
    • 다른 점은 지금 탐색 중인 타일 셀에서 소모되는 비용처리 부분과
    • 탐색하고 난 후의 셀을 어떻게 필터링할지 기준을 적용하는 부분이었다.

이 부분을 처리한 방법은 델리게이트였다.

    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;
  • 이 부분은 매개변수만을 이용한다면 Func<int, int, int> 형태에 람다식을 써도 됐다.
  • 다만 아래에 전역변수 maps를 쓰는 로직은 함수로 작성해야해서 통일성을 맞추기 위해
    둘 모두 함수 형식을 취했다.

이렇게 미리 만들어둔 메서드를 다시 아래 코드처럼 매개변수로 넣어주었다.

    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

profile
사파 개발자

0개의 댓글

관련 채용 정보