[개발] 클린코드(Clean Code)

클린 코드 대신 읽어드립니다 _ 2. 의미 있는 이름 (정리, 요약, 후기)

  • -
반응형

 

1. 의도를 분명히 밝혀라.

변수나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야 한다. 변수(혹은 함수나 클래스)의 존재 이유는? 수행 기능은? 사용 방법은? 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말이다.

 

 

 

 

 

 

1)  첫번째 예시

개선 전

int d; // 경과 시간(단위 : 날짜)

 

개선 후

int elapsedTimeInDays;

int daysSinceCreation;

int daysSinceModification;

int fileAgeInDays;

 

 

 

 

 

 

 

2) 두번째 예시

개선 전

읽히기는 하지만, 코드가 하는 일에 대해서 짐작하기 힘들다.

코드의 '맥락'이 코드에 명시적으로 드러나지 않는다.

해석)

getThem이라는 메서드는, list1이라는 배열을 선언한다.

theList만큼 x배열은 반복하는데, x의 0번쨰 인덱스의 값이 4인 경우 list1 배열에 추가한다.

반복문이 다 돌면 list1을 리턴한다.

 

 

 

 

 

 

 

 

_독자들이 알게 된 정보

0_ 지뢰찾기 게임과 관련한 메서드이다.

1_  theList는 게임판을 의미한다.

2_  theList의 0번쨰 값은 '칸의 상태'를 뜻한다.

3_  값 4는 '깃발이 꽂힌 상태'를 의미한다.

4_ list1은 깃발이 꽂힌 경우의 cell값의 정보를 반환한다.

 

 

 

 

 

 

 

첫번째 개선

getThem >>> getFlaggedCells ( 깃발이 꽂힌 상태의 셀 배열을 리턴해주는 메서드 )

list1 >>> flaggedCells ( 깃발이 꽂힌 상태의 셀 배열을 담는 배열 )

x >>> cell ( 셀 베열 )

theList >>> gaemBoard ( 게임판 )

0 >>> STATUS_VALUE ( 칸의 상태 )

4 >>> FLAGGED ( 깃발이 꽂힌 경우 )

 

 

 

 

 

두번째 개선

cell[STATUS_VALUE] == FLAGGED   >>>   cell.IsFlagged ( 셀의 상태가 깃발이 꽂힌 경우 )

해석)

셀에 깃발이 꽂혔을 때의 배열을 얻는 메서드이다.

깃발이 꽂힌 셀의 정보를 담는 배열을 선언해준다.

게임이 실행되고, 셀에 깃발이 꽂힌 경우에, 깃발이 꽂힌 셀의 정보를 담는 배열에 넣어준다.

게임이 종료되면, 깃발이 꽂힌 셀의 정보가 담긴 배열을 반환한다.

 

 

 

 

 

 

 

 

비교)

개선 전                                                                                                           개선 후

 

 

 

 

 

 

 

 

2. 불용어

불용어를 추가한 이름 역시 아무런 정보도 제공하지 못한다. Product라는 클래스가 있다고 가정하자. 다른 클래스를 ProductInfo 혹은 ProductData라 부른다면 개념을 구분하지 않은 채 이름만 달리한 경우다. Info나 Data는 a, an, the와  마찬가지로 의미가 불분명한 불용어다.

명확한 관례가 없다면 변수 moneyAmount는 money와 구분이 안 된다. customerInfo는 customer와, accountData는 account와, theMessage는 message와 구분이 안 된다. 읽는 사람이 차이를 알도록 이름을 지어라.

예시)

getActiveAccount();

getAciveAccounts();

getActiveAccountInfo();

 

ps. 불용어란?

불용어란 주어진 텍스트에서 특정한 목적에 따라 무시되거나 제외되는 단어를 가리킵니다. 이러한 단어들은 일반적으로 문장의 구조를 이해하는 데 도움이 되지 않거나 정보 검색 시에 불필요하게 여겨지는 경우에 해당합니다. 불용어는 예를 들면 '그', '이', '저', '하다', '있다' 등과 같은 자주 사용되지만 문맥에 따라 큰 의미가 없는 단어들을 포함합니다.

 

 

 

 

 

 

 

 

 

 

3. 검색하기 쉬운 이름

개선 전

 

 

 

 

 

 

개선 후

위 코드에서 sum이 별로 유용하진 않으나 최소한 검색이 가능하다. 이름을 의미있게 지으면 함수가 길어진다. 하지만 WORK_DAYS_PER_WEEK를 찾기가 얼마나 쉬운지 생각해보라. 그냥 5를 사용한다면 5가 들어가는 이름을 모두 찾은 후 의미를 분석해 원하는 상수를 가려내야 하리라.

 

 

 

 

 

 

 

 

 

4. 클래스 이름

클래스 이름과 객체 이름은 명사나 명사구가 적합하다. Customer, WikiPage, Account, AddressParser 등이 좋은 예다. Manager, Processor, Date, Info 등과 같은 단어는 피하고, 동사는 사용하지 않는다.

 

 

 

 

 

 

 

 

 

5. 메서드 이름

메서드 이름은 동사나 동사구가 적합하다. postPayment, deletePage, save 등이 좋은 예다. 접근자(Accessor), 변경자(Mutator), 조건자(Predicate)는 javabean 표준에 따라 값 앞에 get, set, is를 붙인다.

 

 

 

 

 

 

 

 

 

6. 한 개념에 한 단어를 사용하라

객체를 사용하면 그 객체가 제공하는 메서드 목록을 보여준다. 하지만 목록은 보통 함수 이름과 매개변수만 보여줄 뿐 주석은 보여주지 않는다. 운이 좋다면 매개변수 이름도 보여준다. 따라서 메서드 이름은 독자적이고 일관적이어야 한다. 그래야 주석을 뒤져보지 않고도 프로그래머가 올바른 메서드를 선택한다.

 

 

 

 

 

 

 

 

7. 의미 있는 맥락을 추가하라.

개선 전

firstName, lastName, street, houseNumber, city, state, zipcode

Q) 만약, state란 변수만 주어진다면 state가 어디에 사용되는지 알 수 있는가?

 

 

개선 후

addrFirstName, addrLastName, addrState

라고 쓰면 맥락이 좀 더 분명해진다.

 

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.