코드는 없어지지 않는다!

  • 코드는 요구사항을 상세히 표현하는 수단이다.
  • 코드 생성이 자동화되어도 고도로 추상화된 언어나 특정 분야의 언어로 작성하는 것 역시 코드이기 때문에, 코드가 없어질 일은 없다. 
  • 오히려 어떤 언어이든 코드는 기계가 이해하고 실행할 수 있도록 세밀하고 구체적으로 작성되어야 한다.

 

좋은 코드 vs 나쁜 코드

  • 개발자는 바쁘더라도 서두르기보다는 손씻기를 우선하는 의사처럼 프로페셔널해야 한다.
  • 기한을 맞출 수 있는 유일한 방법은 언제나 깨끗한 코드를 유지하는 습관이다.
  • 깨끗한 코드를 작성하려면 좋고 나쁜 코드를 구분하는 '코드 감각'이 있어야 한다.

깨끗한 코드란?
전문가의 의견은..

  • 비야네: 세세한 사항까지 꼼꼼히 처리하는 코드
  • 그래디: 사실에 기반하여 필요한 내용만 명확히 드러낸 것
  • 데이브: 다른 사람이 고치기 쉬운 코드
  • 마이클: 주의 깊게 작성한 코드
  • 론: 중복 없이, 한 기능만 수행하고, 제대로 표현하며 작게 추상화된 것
  • 워드: 읽으면서 짐작한 대로 돌아가는 코드

 

의도를 분명히 밝혀라

  • 의도가 분명한 이름은 시간 절약 차원에서 정말 중요하다.
  • 변수 / 함수 / 클래스명에 존재 이유, 수행 기능, 사용 방법 명시할 것.
    (주석 필요 = 의도가 분명하지 않음)
  • 코드의 단순성 < 코드의 함축성
  • 너무 기발해서 의도가 명료하게 보이지 않는 이름은 피하자

 

예시 1) 

Bad ❌

- 이름 d 에 아무 의미가 없음

- 경과 시간이나 날짜에 관한 정보 미제공

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

Good ⭕️

- 측정하는 값과 단위를 명시함

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

 

예시 2)

Bad ❌

- theList 에 무엇이 들었는지 알려주지 않음

- theList 에서 0번째 값이 중요한 이유를 모름

- 값 4에 대한 설명이 없음

- 함수가 반환하는 list1 의 사용법을 알 수 없음

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

Good ⭕️

- theList 를 게임판이라고 가정하여 네이밍함

- 칸을 간단한 클래스로 표현, 명시적 함수 사용

- 값 4는 깃발이 꽂힌 상태를 가리킴

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

 

잘못된 정보를 피하라

  • 코드에 잘못된 단서를 남기지 말 것
  • 일반적인 의미를 가진 단어를 다른 의미로 사용하지 말자
  • 서로 비슷한 이름을 사용해 헷갈리지 않도록 주의하기
  • 일관성이 떨어지는 표기법은 잘못된 정보이다

 

의미 있게 구분하라

  • 이름이 다르다면 의미도 달라져야 한다. 
  • name1, name2, name3 등의 연속적 숫자, a / the 추가, data / info 사용 등 주의하기
  • variable, table, name, string 등 불용어를 사용하지 말자

 

클래스 , 객체 , 메소드 네이밍

  • 클래스, 객체 이름
    - 명사나 명사구가 적합하다
    - 예) Info, Data  (x) AddressParser, WikiPage (o) 
  • 메소드 이름
    - 동사나 동사구가 적합하다
    - 접근자, 변경자, 조건자는 값 앞에 get, set, is 를 붙인다
    - 예) getName, setName, isPosted

 

그 외 주의사항

  • 발음이 쉬운 이름 사용하기
    예) genymdhms (x)  generationTimestamp (o)

  • 검색이 쉬운 이름 사용하기
    - 이름의 길이는 범위의 크기에 비례해야 한다
    - 의미 있는 함수명은 길어서 찾아보기 쉽다
    예) e5 (x)  WORK_DAYS_PER_WEEK (o)

  • 인코딩을 피하라
    - 인코딩한 이름은 발음이 어렵고 오타가 생기기 쉽다
    - 인코딩을 하더라도 접두사는 붙이지 말 것

  • 자신의 기억력을 자랑하지 마라
    - 문자 하나만을 변수 이름으로 쓰지 말자
    예) 변수 r 이 어떤 조건을 가진 url 이라는 건.. 기억하기 어렵다

  • 한 개념에 한 단어 사용하기
    - 추상적 개념 하나에 단어 하나를 선택해 꾸준히 사용하자
    - 일관성 있는 어휘를 사용할 것!

  • 말장난을 하지 말자
    - 한 단어를 두 가지 목적으로 사용하지 말 것

  • 기술 개념에는 기술 분야와 관련된 이름을 붙여라
    - 적절한 용어가 없다면 문제 영역에서 이름을 가져올 것

  • 의미 있는 맥락 추가, 불필요한 맥락 제거
    - 의미가 분명한 경우 지나치게 긴 이름은 좋지 않다
    - 이름에 불필요한 맥락을 추가하지 말자