chaesoo
so0ob
chaesoo
전체 방문자
오늘
어제
  • 분류 전체보기 (169)
    • 알고리즘 (157)
      • 백준 다시풀기 (8)
      • solved.ac (137)
      • 백준 알고리즘 공부 (12)
    • 활동일지 (5)
    • 개발 (5)
      • Unity (4)
    • 책 공부 (2)
      • clean code (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • solved.ac
  • 문자열
  • 알고리즘
  • 로아 디코봇
  • SW마에스트로 13기
  • BFS
  • 소마13기
  • 디코봇 파이썬
  • 게임개발
  • 클린코드2장
  • 다시풀기
  • 분할정복
  • 분할정복거듭제곱
  • 유니티
  • C++
  • 클린코드
  • dfs
  • 최단거리알고리즘
  • 백준2448
  • 다익스트라
  • 자료구조
  • 백준
  • 디스코드 봇 파이썬
  • 로스트아크 디코 봇
  • 디코 봇
  • 백준미세먼지안녕!
  • 정보처리기사 2021 합격률
  • 구현
  • 플로이드-와샬
  • DP

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
chaesoo

so0ob

[Clean Code] 2장 의미 있는 이름 (1)
책 공부/clean code

[Clean Code] 2장 의미 있는 이름 (1)

2022. 7. 16. 14:52

의도를 분명히 밝혀라

 

좋은 이름으로 절약하는 시간은 크다.

"의도가 분명하게 이름을 지으라"고 말하기는 쉽다.

여기서는 의도가 분명한 이름이 정말로 중요하다는 사실을 거듭 강조한다.

좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다.

그러므로 이름을 주의깊게 살펴 더 나은 이름이 떠오르면 개선하기 바란다.

 

따로 주석이 필요한 이름은 의도를 분명히 드러내지 못한 것이다.

변수나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야한다.

  • 존재 이유
  • 수행기능
  • 사용방법

 

자세히 보기

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

이름 d는 아무 의미도 드러나지 않는다. 경과 시간이나 날짜라는 느낌이 안 든다.

측정하려는 값과 단위를 표현하는 이름이 필요하다.

int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;

의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다.

 

다음 코드는 무엇을 할까?

public List<int[]> getThem(){
	List<int []> list1 = new ArrayList<int[]>();
    for(int[] x: theList)
    	if(x[0] == 4)
        	list1.add(x);
    return list1;
}

코드가 하는 일을 짐작하기 어렵다. 코드의 맥락이 코드 자체에 명시적으로 드러나지 않는다.

위 코드는 암암리에 독자가 다음과 같은 정보를 안다고 가정한다.

  • theList에 무엇이 들었는가?
  • theList 에서 0번째 값이 어째서 중요한가?
  • 값 4는 무슨 의미인가?
  • 함수가 반환하는 리스트 list1을 어떻게 사용하는가?

 

지뢰찾기 게임을 만든다고 가정하자. 그러면 theList가 게임판이라는 사실을 안다.

theList를 gameBoard로 바꿔보자.

 게임판에서 각 칸은 단순 배열로 표현한다. 배열에서 0번째 값은 칸 상태를 뜻한다.

값 4는 깃발이 꽂힌 상태를 가리킨다.

각 개념에 이름만 붙여도 코드가 상당히 나아진다.

public List<int []> getFlaggedCells(){
	List<int []> flaggedCells = new Array<int []>();
    for(int[] cell : gameBoard)
    	if (cell[STATUS_VALUE] == FLAGGED)
        	flaggedCells.add(cell);
   	return flaggedCells;
}

 위에서 보듯, 코드의 단순성은 변하지 않았다. 그런데도 코드는 더욱 명확해졌다.

한 걸음 더 나아가, int 배열을 사용하는 대신, 칸을 간단한 클래스로 만들어도 되겠다.

isFlagged라는 좀 더 명시적인 함수를 사용해 FLAGGED라는 상수를 감춰도 좋겠다.

새롭게 개선한 결과는 다음과 같다.

public List<Cell> getFlaggedCells(){
	List<Cell> flaggedCells = new ArrayList<Cell>();
    for(Cell cell : gameBoard)
    	if(cell.isFlagged())
        	flaggedCells.add(cell);
    return flaggedCells;
}

단순히 이름만 고쳤는데 함수가 하는 일을 이해하기 쉬워졌다.

 

 


그릇된 정보를 피하라

 

널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하면 안된다.

직각삼각형의 빗변(hypotenuse)을 구현할 때는 hp가 훌륭한 약어로 보일지라도 hp라는 변수는 독자에게 그릇된 정보를 제공한다.

 

특수한 의미를 가진 단어를 다른 의미로 사용하면 안된다.

여러 계정을 그룹으로 묶을 때, 실제 List가 아니라면, accountList라 명명하지 않는다.

프로그래머에게 List라는 단어는 특수한 의미다.

 

서로 흡사한 이름을 사용하지 않도록 주의한다.

한 모듈에서 XYZControllerForEfficientHandlingOfStrings라는 이름을 사용하고, 조금 떨어진 모듈에서

XYZControllerForEfficienStorageOfStrings라는 이름을 사용한다면? 차이를 알아채기 힘들 것이다.

 

유사한 개념은 유사한 표기법을 사용한다.

일관성이 떨어지는 표기법은 그릇된 정보다.

코드 자동 완성 기능을 제공할 때, 이름을 몇 자만 입력한 후 자동완성이 가능한 후보 목록이 뜨게 된다.

이때, 유사한 개념이 나온다면 코드 자동 완성 기능은 굉장히 유용해진다.

 

 


의미 있게 구분하라

 

의도가 드러나는 이름을 사용해라.

컴파일러를 통과할지라도 연속된 숫자를 덧붙이거나 불용어를 추가하는 방식은 적절하지 못하다.

이름이 달라야 한다면 의미도 달라져야 한다.

연속적인 숫자를 덧붙인 이름은 의도적인 이름과 정 반대다.

public static void copyChars(char a1[], char a2[]){
	for(int i = 0 ; i < a1.length; i++){
    	a2[i] = a1[i];
    }
}

함수 인수 이름으로 source와 destination을 사용한다면 코드 읽기가 훨씬 더 쉬워진다.

public static void copyChars(char source[], char destination[]){
	for(int i = 0 ; i < source.length; i++){
    	destination[i] = source[i];
    }
}

 

불용어는 정보를 제공하지 못한다.

Product라는 클래스가 있다고 가정했을때, 다른 클래스를 ProductInfo 혹은 ProductData라 부른다면

개념을 구분하지 않은 채 이름만 달리한 경우이다.

Info나 Data는 a, an, the와 마찬가지로 의미가 불분명한 불용어다.

 

읽는 사람이 차이를 알도록 이름을 지어라.

getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();

프로젝트에 참여한 프로그래머는 어느 함수를 호출할지 어떻게 알까?

명확한 관례가 없다면 account는 accountInfo와 구분이 안된다. 읽는 사람이 차이를 알도록 이름을 지어라. 

 

 

 

#클린코드 #cleancode #프로그래밍 #코드스타일 #클린코드정리 #클린코드2장

728x90
반응형

'책 공부 > clean code' 카테고리의 다른 글

[Clean Code] 1장 깨끗한 코드  (0) 2022.07.08
    '책 공부/clean code' 카테고리의 다른 글
    • [Clean Code] 1장 깨끗한 코드
    chaesoo
    chaesoo

    티스토리툴바