[coding] if~else문을 리펙토링 해보았다.

Elen li·2021년 12월 5일
0

1. 문제

성별, 체질량 지수, 허리둘레의 값을 받으면, '진단' 텍스트를 반환해야하는 일이 생겼다.

2. 처음은 if~else 문으로...

  1. if ~ else문이 너무 길어졌다.
  2. 가독성이 좋지 않다.
  3. 값이 하나가 달라지면 전부 다 수정을 해줘야한다. (유지보수 힘들다...)
  Result checkRecentStatus(int gender, double bmi, double abdomen) {
    if (gender == Gender.male.index) {
      return Result.measureError;
    }

    if (bmi < 18.6) {
      if (abdomen >= 80) {
        return Result.lessAndAbdomenOver;
      }
      return Result.lessWeight;
    }

    if (bmi > 18.5 && bmi < 23) {
      if (abdomen >= 85) {
        return Result.normalAndAbdomenOver;
      }

      return Result.normalWeight;
    }

    if (bmi >= 23 && bmi < 25) {
      if (abdomen >= 85) {
        return Result.overAndAbdomenOver;
      }

      return Result.overWeight;
    }

    if (bmi >= 25 && bmi < 30) {
      if (abdomen >= 85) {
        return Result.firstObesityAndAbdomenOver;
      }
      return Result.firstObesity;
    }

    if (bmi >= 30 && bmi < 35) {
      if (abdomen >= 85) {
        return Result.secondObesityAndAbdomenOver;
      }
      return Result.secondObesity;
    }

    return Result.highObesity;
  }

3. 반복되는 코드를 체크해봤다.

  1. if(abdomen){}이 매 분기마다 반복된다는 것을 알았다.
  2. 반복되는 코드를 함수로 다시 뺐다.
  3. 사실 이 함수도 어딘가 깨끗하지 않다. 수정 방법이 더 있을텐데...
bool isOverAbdomen(double bmi, double abdomen) {
  if(abdomen >= 85) {
    return true;
  } else if(bmi < 18.5 && abdomen >= 80) {
    return true;
  }

  return false;
}

4. if문으로 반복된다 -> 반복문을 사용해볼까?

  1. ~이상 && ~미만의 값이 겹치면서 반복이 되었다.
  2. 이 값들을 어떻게 정의내릴 수 있을 지 고민을 해봤다.
  3. 값들의 범위에는 ~이상 ~미만의 규칙이 있었고, 이 값들을 리스트에 넣어 한정시켰다.
  4. for 문으로 값들을 반복시키고, 각 항목에 맞는 값들을 리턴시켜보기로 했다.
int showIntStatus(double bmi, double abdomen) {
  int resultIndex = Result.lessWeight.index;

  List list = [18.5, 23, 25, 30, 35];

  for(var x in list) {
    if(bmi < x) {
      return isOverAbdomen(bmi, abdomen) ? resultIndex + 1 : resultIndex;
    }
    resultIndex = resultIndex + 2;
  }

  return resultIndex;
}

enum Result {
  measureError,
  lessWeight,
  lessAndAbdomenOver,
  normalWeight,
  normalAndAbdomenOver,
  overWeight,
  overAndAbdomenOver,
  firstObesity,
  firstObesityAndAbdomenOver,
  secondObesity,
  secondObesityAndAbdomenOver,
  highObesity,
}

이보다 더 좋은 리펙토링이 분명 있겠지?
그래서 끊임없이 공부가 필요하다 ㅜㅜ

profile
Android, Flutter 앱 개발자입니다.

0개의 댓글