로버트 C. 마틴의 클린 코드 도서를 정리한 내용입니다.
클린 코드란?
- 성능이 좋은 코드
- 의미가 명확한 코드 (읽기 쉬운 코드)
- 중복이 제거된 코드
왜 클린 코드를 짜야 할까?
프로그래머는 코드를 읽는 시간이 새로운 코드를 짜는 시간보다 훨씬 많기 때문이다.
그렇기 때문에 읽기 쉬운 코드를 짜는 것은 너무나도 중요한 일이다.
클린 코드를 짜는 것은 상당한 노력이 필요하다.
마감일을 맞추기 위해 어쩔 수 없이 나쁜 코드를 작성하고 코드의 영향 범위가 너무 커서 괜히 건들였다가 다른 부분에 버그가 생길 까 두려워 나쁜 코드를 방치한다.
하지만 이런 나쁜 코드들은 나중에 결국 생산성을 저하 시키게 된다.
지속적인 클린 코드를 작성하기 위해 보이스카우트 룰을 적용시켜보자
"떠날 때는 찾을 때 보다 캠프장을 더욱 깨끗이 하라"
의미 있는 이름 짓기
"의도가 분명하게 이름을 지어라"
좋은 이름을 짓는 것은 많은 시간이 들 수 있지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다.
좋은 이름이란 무엇일까?
존재 이유는? 수행 기능은? 사용 방법은? 이 3가지 질문에 주석없이 이름만 보고 이해할 수 있는 이름이 좋은 이름이다.
예시 코드들을 통해 좋은 이름이 무엇인 지 살펴보자
[나쁜 코드]
public list<int[] getThen(){
List<int[]> list1 = new ArrayList<int[]>();
for(int[] x : theList){
if(x[0] == 4){
list1.add(x);
}
return list1;
}
- theList에 무엇이 들었는가?
- theList에서 0번째 값이 어째서 중요한가?
- 값 4는 무슨 의미인가?
- 함수가 반환하는 리스트 list1을 어떻게 사용하는가?
위에 대한 질문에 제대로 대답할 수 없다. 이름에 의미가 하나도 없기 때문이다.
[클린 코드]
public list<int[] getFlaggedCells(){
List<int[]> flaggedCells = new ArrayList<int[]>();
for(int[] cell : gameBoard){
if(cell[STATUS_VALUE] == FLAGGED){
flaggedCells.add(cell);
}
return flaggedCells;
}
이 코드는 지뢰찾기 게임의 일부 코드다.
좋은 이름을 사용하여 훨신 코드가 명확해졌다. 이것이 좋은 이름이 주는 위력이다.
[나쁜 코드]
public static void copyChars(char a1[], char a2[]){
for(int i=0; i<a1.length; i++){
a2[i] = a1[i];
}
}
이 코드 역시 a1 과 a2에 아무런 의도가 전해지지 않는다.
대신 source, destination 이라 명명햇다면 코드를 읽기 훨씬 쉬웠을 것이다.
명확하게 구분할 수 있는 이름을 사용해라
Product 라는 클래스가 있을 때 ProductInfo 라는 다른 클래스를 만든다면 이 둘은 개념은 구분하지 않은 채 이름만 달리한 경우이다.
Product 와 ProductInfo 의 차이가 무엇인가?
customerInfo 와 customer 그리고 accountData 와 account, theMessage와 meesage 는 모두 구분되지 않는 네이밍이다.
한 개념에 한 단어를 사용해라
추상적인 개념에 하나의 단어만 선택해서 사용해야 한다.
예를들면 controller, manager, drvier 는 모두 비슷한 의미로 사용되는 추상적인 단어이다. 이들을 섞어 사용하지 말자
다른 예시)
- Member / Customer / User
- Service / Manager
- Repository / Dao
불필요한 맥락은 제거하라
예를들면 고급 휘발유 충전소 (Gas Station Deluxe) 라는 애플리케션을 짠다고 해서 모든 클래스 이름을 GSD로 시작하는 것은 바람직하지 않다.
IDE는 개발자의 편의를 위해 자동 완성을 선택할 수 있도록 하는데
모든 클래스가 G로 시작한다면 IDE가 제공하는 편리함을 무시하는 것이다.
의미 있는 맥락은 추가해라
firstName, lastName, street, houseNumber, city, state, zipCode 라는 변수를 보면
누구나 쉽게 주소에 관한 변수라는 것을 알아차릴 수 있을 것이다. 하지만 어느 메서드가 state 변수 하나만 사용한다면 이것을 주소의 일부라는 것을 바로 알아차리기 쉽지 않다.
따라서 addr 이라는 접두사를 사용하여 맥락을 명확히 할 수 있다.
addrFirstName, addrLastName, addrState
구글에서 사용하는 Java 네이밍 규칙
1. 패키지 이름은 소문자를 사용하며 underscore를 넣지 않는다.
com.example.bankapp (o)
com.example.bankApp (x)
com.example.bank_app (x)
2. 클래스는 대문자로 시작한다.
// 클래스는 명사, 명사구를 사용한다.
Character, ImmutableList
// 인터페이스는 명사, 명사구, (형용사) 를 사용한다.
List, Readable
// 테스트 클래스는 Test 로 끝난다.
HashTest, HashIntegrationTest
3. 메소드는 소문자로 시작한다.
// 메소드는 동사, 동사구를 사용한다.
sendMessage, stop
// jUnit 테스트에는 underscore 가 사용되기도 한다.
// <methodUnderTest>_<state> 패턴
pop_emptyStack
'개인공부 > 클린코드' 카테고리의 다른 글
[클린코드] 간결하고 안전한 함수 작성하기 (1) | 2024.02.07 |
---|