로버트 C.마틴 의 Clean Code, 애자일 소프트웨어 장인정신 이라는 책의 내용을 정리한 내용입니다.


의도를 분명히 밝혀라

존재이유, 수행기능, 사용방법을 생각하여 변수명을 지어야하며, 해당 변수에 주석이 필요하다면 의도를 분명히 드러내지 못했다는 것을 의미한다.

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

위 코드를 보면 d라는 변수를 사용하고있는데, 해당 변수는 day를 나타낼수있겠지만 주석없이는 day를 의미하는지 알수없다.

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) 
				list.add(x);
	return list1;
}

위 코드를 보았을때, 코드의 역할을 짐작할수없다 단순히 list에 값을 추가해주는것만 알뿐 어떤 데이터를 어떻게 사용하는지 알수없다.

그 이유는 코드 맥락이 코드 자체에 명시적으로 드러나지 않기때문이다.

위 같은 문제를 보완한 2번 코드를 보겠다.

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

위 코드는 앞서본 코드와 동일한 동작을 하지만 변수명, 함수명을 통해서 어떤역할을 하는지 한눈에 보여준다.

 

그릇된 정보를 피하라

나름대로 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하면 안된다, 코드의 의미를 흐리게 된다.

 

의미 있게 구분하라

연속된 숫자를 덧붙이거나 불용어를 추가하는 방식은 적절하지 못하다, 이름이 다르다면 의미도 달라져야한다.

(1,2,3,4 / a,b,c,d와 같은 의미없는 불용어를 사용하지말자)

 

예를들자면, Product라는 클래스를 ProductInfo, ProductData라고 부르는것도 개념을 구분하지 않은 채 이름만 달리한 경우로 불용어라고 볼수있다. (의미가 분명히 다르다면 사용해도 무방하지만 같은 의미를 갖는다면 저렇게 나눌 필요가없다)

 

읽는 사람이 차이를 알도록 이름을 지어야한다.

 

발음하기 쉬운 이름을 사용하라

class DtaRcrd102 {
	private Date genymdhms;
	private Date modymdhms;
	private final String pszqint = "102";
}

위와 같은 코드가 있다면 발음하는데 문제가있을 수 있다. (젠..엠디에이치엠에스.. 모디엠..등등)

class Customer {
	private Date generationTimestamp;
	private Date modificationTimestamp;
	private final String recordId = "102";
}

코드를 위와같이 작성한다면 의사소통을 하는데있어서 좀더 원활하고 확실한 소통이 가능할 것이다.

네임의 길이를 줄이는게 좋겠지만 꼭 축약어를 사용하여 의사소통을 힘들게 할필요가 없다 의미를 확실하게 부여하자.

 

검색하기 쉬운 이름을 사용하라

이름이 길어지더라도 의미있게 지어야 검색 및 의미도출이 가능하게 된다.

 

인코딩을 피하라

 

자신의 기억력을 자랑하지 마라

본인만 기억할 수 있는 그러한 변수명은 피하는것이 좋다. 

모든사람이 주로 사용하는 단어를 사용하여 새로운 개발자가 코드를 보더라도 이해할 수 있게 작성하는것이 좋다

(명료함이 최고다)

 

클래스 이름

명사나 명사구가 적합하다. ex) Costomer, Wikipage, Account

Manager, Processor, Data, Info와 같은 단어는 되도록 피한다.

동사는 사용하지 않는다.

 

메서드 이름

동사나 동사구가 적합하다. ex) postPayment, deletePage, save

생성자를 중복정의 할 때는 정적 팩토리 메서드를 사용한다.

Complex fulcrumPoint = new Complex(23.0)

위처럼 중복정의시에는 

Complex fulcrumPoint = Complex.FromRealNumber(23.0)

이렇게 정적 팩토리 메서드를 사용하는것이 좋다.

 

기발한 이름은 피하라

재미난 이름보다 명료한 이름을 선택해야 명확하게 그 뜻을 이해할 수 있다.

 

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

메서드 이름은 독자적이고 일관적이어야 한다

일관성 있는 어휘는 코드를 사용할 프로그래머가 반갑게 여길 선물..이라고 한다 꼭 지켜주도록하자

 

말장난을 하지 마라

한 단어를 두 가지 목적으로 사용하지 마라

예를들자면, 지금까지 구현한 add라는 메서드는 모두가 기존 값 두 개를 더하거나 이어서 새로운 값을 만들었다 새로 작성하는 메서드는 집합에 값 하나를 추가하는 메서드인데 이 메서드를 add라고 부른다면 맥락이 달라서 말장난이 된다. 

적절한 명칭은 insert나 append라는 이름이 적당할 것이다.

 

해법, 문제영역에서 가져온 이름을 사용하라

코드를 보는 사람이 개발자임을 생각하며 작성하여 전산용어, 알고리즘 이름, 패턴이름, 수학용어들을 사용해도 되며 기술개념에는 기술 이름이 가장 적합한 선택이다.

 

의미 있는 맥락을 추가하라

접두어에 의미있는 맥락을 추가하여, 의미를 분명하게 해준다.

주소상태라는 변수명이 state일 경우 주소의 상태명인지 알수없다.

이런경우 addrState로 변수명을 선언해줌으로 주소의 상태라는 것을 분명하게 해줄 수 있다.

 

불필요한 맥락을 없애라

의미가 분명한경우 일반적으로는 짧은 이름이 긴 이름보다 좋다.

이름에 불필요한 맥락을 추가하는것을 피해야한다.


- 코드를 작성하는 사람의 입장이 아닌 보는사람관점에서 이해하기 편하게 작성하자.

- 코드가 짧은것도 좋겠지만 의미를 확실하게 할 수 있다면 긴 길이의 네이밍을 해도된다.

- 한눈에 보고 의미를 알아볼수있는 목적성을 가진 코드를 작성하자.

- 의사소통 시에 서로 같은 의미로 이해하고 대화할 수 있는 그런 코드를 작성하자.

'Book > Clean Code' 카테고리의 다른 글

[Clean Code] 함수  (0) 2022.02.27