210221_B책_코드 대칭성 이루기

정재현·2021년 2월 21일
0

TIL

목록 보기
73/80

오늘은 1.8 <코드 대칭성 이루기> 를 진행한다.
코드의 이해도가 얼마나 중요한지 앞의 챕터들을 진행하면서 알게되었는데,
조건 분기를 대칭적 방법으로 구조화하면 코드를 쉽게 이해하고 파악할 수 있다고 한다.
나중에 누가 유지보수를 하든 기능을 더 빨리 간편하게 찾을 수 있다.

예제 코드는 같은 코드를 계속 이어간다.

CruiseControl cruiseControl;

void authorize(User user) {
	Objects.requireNonNull(user);
      if (user.isUNKOWN()) {
          cruiseControl.logUnauthorizedAccessAttempt();
      } else if (user.isASTROANUT()) {
          cruiseControl.grantAccess(user);
      } else if (user.isCOMMANDER()) {
          cruiseControl.grantAccess(user);
          cruiseControl.grantAdminAccess(user);
      }
}

계속 쓰던 코드를 if else문으로 변경했다.
우선 위 코드에 버그는 없다.
다만 조건과 명령문이 계속 연이어 나온다는 것이 문제점!
=>(이런 코드 정말 많이 사용하는데, 대칭성을 생각하진 못했었다...)
이렇게 되면 모든 조건과 명령문을 한 번에 읽고 이해해야 한다.
위 코드는 중첩이 별로 없는 작은 예제이므로 별로 어렵지 않지만
구조적으로 복잡하고 큰 단위의 코드라면 이해하기가 힘들어지므로 매우 힘들어진다.

본질적인 문제는 <코드의 대칭성>의 부재이다.
코드의 대칭성을 살펴볼 때는 3가지를 생각해본다.
1. 모든 분기가 비슷한 관심사를 표현하는가?
2. 병렬구조를 띠는가?
3. 세가지 분기 모두 대칭인가?

위의 조건으로 따져봤을 때 정답은 'no'
첫 번째 분기는 접근을 거절하고, 두 번째와 세 번째의 분기는 접근을 부여한다. 대칭이 아닌것..!
권한을 부여하는 코드와 권한을 부여하지 않는 코드가 섞여 있었던 탓에 코드에 비대칭성이 생겼었다.

코드를 대칭적으로 바꿔보면,

CruiseControl cruiseControl;

void authorize(User user) {
	Objects.requireNonNull(user);
      if (user.isUNKOWN()) {
          cruiseControl.logUnauthorizedAccessAttempt();
          return;
      }
      
      if (user.isASTROANUT()) {
          cruiseControl.grantAccess(user);
      } else if (user.isCOMMANDER()) {
          cruiseControl.grantAccess(user);
          cruiseControl.grantAdminAccess(user);
      }
}

두 코드를 서로 다른 코드 블록으로 분리해서 코드 대칭성을 향상시켰다!!
첫 번째 코드블록에서 숭인되지 않은 접근을 처리한 뒤, return 시켜서 메소드를 종료시키고.
두 번째 코드블록에서는 승인된 접근 유형 두가지만 들어있으니 대칭을 이룬다.

이러한 대칭성을 이룬 구조는 코드가 말하는 바를 더 명확하게 만들어준다.
역시 버그도 찾기 쉬워지겠지?
앞으로 코딩할 때 대칭성에 유의하면서 해야겠다.

이렇게 1장이 종료되었다.
최근 업계에서는 새로운 코드를 짜는 것에 비해서 기존의 코드를 업그레이드, 유지보수하는데에 많은 시간이 쓰인다고 한다.
실제로 나 또한 프로젝트가 마무리되면 기존의 업무를 최적화하는 업무를 진행하게 될텐데,
이번에 1장에서 배운 내용들을 상기시키며 업무에 임해야겠다.

오늘의 코멘트: 알기면 하면 되는 것이 아니라 계속해서 사용해서 내 것으로 만들어야한다!

profile
"돈받고 일하면 프로다"

0개의 댓글