210301_B책_새 줄로 그루핑

정재현·2021년 3월 1일
0

TIL2

목록 보기
1/79

어제 의도치않은 휴식을 가졌다..
13일만의 휴식이였다.

오늘은 2.6 <새 줄로 그루핑> 을 들어간다.

enum DistanceUnit {
 MILES, KILOMETERS;
 
 static final double MILE_IN_KILOMETERS = 1.60934;
 static final int IDENTITY = 1;
 static final double KILOMETERS_IN_MILE = 1 / MILE_IN_KILOMETERS;
 
 double getConversionRate(DistacneUnit unit) {
  if (this == unit) {
   return IDENTITY;
  }
  if (this == MILES && unit == KILOMETERS) {
   return MILE_IN_KILOMETERS;
  } else {
   return KILOMETERS_IN_MILES;
  }
 }
}

오늘의 위의 예제 코드로 진행한다.
getConversionRate를 이용하며, 저번에 배운 매직넘버도 상수로 변환하여 코드시맨틱은 좋아보이는데.
뭐가문제일까?

코드 블럭이 서로 붙어있으면 보통 한 덩어리로 간주하는데, 별개 블록으로 새 줄로 분리하면
코드 이해도를 향상시킬 수 있습니다.
무엇보다 getConversionRate 안의 코드가 한덩어리로 되어있는데
먼저 확인해야할 것은 정말 여백이 없어도 되느냐? 이다.
코드 분석을 해보면 첫번째 if는 같은 단위인지 확인하고 두번째 if는 변환한다.
빈 줄을 이용해 수직으로 분히라면 읽는 사람이 유지보수하는 사람이 좀 더 명확히 이해할 수 있다.

지은이의 경험에 비추어보면 연관된 코드와 개념은 함께 그루핑하고 서로 다른 그룹은
빈 줄로 각각 분리해야 한다고 한다.

또한 먼저 눈치챘지만 상수인 IDENTITY를 와 다른 상수들을 나눠줄 필요가 있다.

enum DistanceUnit {
 MILES, KILOMETERS;
 
 static final int IDENTITY = 1;
 static final double MILE_IN_KILOMETERS = 1.60934;
 static final double KILOMETERS_IN_MILE = 1 / MILE_IN_KILOMETERS;
 
 double getConversionRate(DistacneUnit unit) {
  if (this == unit) {
   return IDENTITY;
  }
  
  if (this == MILES && unit == KILOMETERS) {
   return MILE_IN_KILOMETERS;
  } else {
   return KILOMETERS_IN_MILES;
  }
 }
}

정말 간단하고 별볼일 없어보이지만 이런 세세한 디테일이 코드의 완성도를 높이는 것이라고 생각한다.

로버트 C.마틴은 자신의 저서 <클린코드>에 수직 서식화를 신문에 비유했는데,
훌륭한 기사는 제목(클래스명)으로 시작해 섹션 머릿말(공개 멤버, 생성자, 메서드)에 이어
세부 내용(비공개 메소드)이 나온다고 한다.
코드를 이렇게 조직하면 코드를 읽어 내려가기만 해도 이미 클래스를 훨씬 더 쉽게 이해할 수 있다.
또한 클래스에서 기능을 찾기도 훨씬 쉬워진다.

오늘의 코멘트: 세세한 디테일이 코드의 완성도를 높이는 것!

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

0개의 댓글