티스토리 뷰
🚨 클린 코드 책에 대한 요약본입니다. 포스팅을 보고 간질간질한 구석이 있다면 꼭 책을 보길 추천드립니다.
책 첫장에는 이런 말이 나온다. 클린 코드라는 책을 읽을 때는 "수학의 정석"처럼 밑줄을 그어가며 익혀야 하는 책이다.
나도 21년도에 한 번 책을 읽었으나 1년이 지난 대부분의 내용이 휘발되어 다시 읽어보며 내용을 정리해보려고 글을 쓰게 되었다.
클린 코드 1. chapter에 가장 많이 나와 있는 말은 "깨끗한 코드"이다. 깨끗한 변수, 깨끗한 함수, 깨끗한 클래스 등
사람이 읽기 쉽고, 이해하기 쉽고, 유지 보수하기 쉬운 코드는 어떤 코드인가에 대해 서술하는 책이다.
지난 1년간 나는 개발을 하며 마구잡이로 개발을 했다.
구글링을 통해 코드를 복붙하는 일도 많았고, 일단 돌아가기만 하는 코드를 만들었다.
회사 코드자체가 엉망이라는 핑계로 나도 변수명에 크게 생각을 하지 않았고, 중복되는 코드들을 심었다.
코드 몽키가 되어 있는 나 자신의 모습에 양심이 찔려 해당 책을 다시 읽게 되었다.
1장: 의미있는 이름
'똑똑한 프로그래머와 전문가 프로그래머 사이에서 나타나는 차이점 하나만 들자면 전문가 프로그래머는 "명료함이 최고"라는 사실을 이해한다.'
"의도가 분명하게 이름을 지으라"
의도가 분명한 이름은 정말로 중요하다. 팀원들과 협업을 하며 재사용성이 중요하며, 문서 한 번 열어볼 시간을 단축할 수 있기 때문이다.
아래는 이름을 모호하게 짠 코드다. 한번 살펴보자.
public List<int[]> getThem(){
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] ==4)
list1.add(x);
return list1;
}
코드가 무슨 일을 하는지 짐작하기 어렵다 왜냐? getThem이 무엇을 의미하는지, theList에 뭐가 담겨있는지 알 수 없기 때문이다.
이를 다음과 같이 개선한다.
public List<Cell> getFlaggedCells(){
List<Cell> flaggedCells = new ArrayList<Cell>();
for(Cell cell : gameBoard)
if(cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
"그릇된 정보를 피하라"
여러 계정을 그룹으로 묶을 때, 실제 List가 아니라면 accountList라고 명명하지 않는다.
프로그래머에게 List란 특수한 의미이기 때문이다.
계정을 담는 컨테이너가 실제 List 타입이 아니라면 프로그래머에게 잘못된 정보를 전달하는 셈이다.
이럴 경우엔 다음과 같이 작성한다. accounts, accountGroup, bunchOfAccounts
* 실제 컨테이너 유형이 list라도 컨테이너의 유형을 이름에 넣지 않는 편이 바람직하다.
해당 내용은 추후 서술
"의미 있게 구분하라"
연속되는 숫자를 덧붙이거나, 불용어를 추가하는 방식은 적절치 못하다.
연속된 숫자의 사용)
a1, a2, a3, aN...
불용어 사용 예)
불용어 stopword, 不用語
ProductInfo, productData는 개념을 구분하지 않은 채 이름만 달리 한 경우다.
moneyAccount와 money / customerInfo와 customer / accountData와 account는 구분이 되지 않는다.
읽는 사람이 차이를 알도록 이름을 짓자.
"발음하기 쉬운 이름을 사용하라"
모음을 빼고 사용하거나 축약을 한 경우가 드문 있다.
내 경험으론, 전 회사 상사님이 date를 dt로, record를 rcrd 이런 식으로 작성을 하셨다.
클린 코드를 읽으며 해당 코드 명은 잘못된 변수라는 것을 알게 되었다.
잘못된 예)
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";
}
"클래스 이름"
클래스 이름과 객체 이름은 명사나 명사구가 적합하다.
좋은 예) Customer, WikiPage, Account, AddressParser
나쁜 예) Manager, Processor, Data, Info
"메서드 이름"
동사나 동사구가 적합하다.
좋은 예) postPayment, deletePage, save,
접근자/변경자/조건자는 javabean 표준에 따라 get/set/is를 붙인다.
"정적 팩토리 메서드"
정적 팩토리 메서드란? 객체 생성의 역할을 하는 클래스 메서드
public enum Color {
RED,
BLUE;
}
...
Color redColor = Color.valueOf("RED");
Color blueColor = Color.valueOf("BLUE");
new 생성자를 통해 객체를 생성하는 것이 아닌,
메서드를 통해 객체를 생성하는 것을 의미한다.
생성자를 중복 정의할 때는 정적 팩토리 메서드를 사용한다.
아래 코드를
Complex fulcrumPoint = new Complex(23.0);
이렇게 개선하자.
Complex fulcrumPoint = Complex.FromRealNumber(23.0);
1장에 나온 "의미 있는 이름"에 대해 정리해 보았다.
약 1~2년간 코드를 짜며 개발 새내기인 나는 남들과 비교해보며 내가 짠 코드가 깨끗한 코드인가, 옳은 코드인가를 자문했는데
그때의 자문에 답이 되는 시간이었다. 진작 읽어 보면 좋았겠지만, 필요에 의해 읽는 것이 가장 오래 기억에 남는다고 생각한다.
지금 시점에서는 내게 가장 필요한 책이었고 해당 글에는 핵심만 요약정리했으므로, 까먹는다면 또 와서 보기로 하자.
* 2장은 "함수"에 대해 작성합니다.
'✍🏻 > 독서록' 카테고리의 다른 글
[Clean Code] 4장 형식 맞추기 (0) | 2022.12.04 |
---|---|
[Clean Code] 3장 주석 (2) | 2022.11.28 |
[Clean Code] 2장 함수 (0) | 2022.11.28 |
REST API, API, RESTful 쉽게 이해하기 (0) | 2021.10.18 |
[비전공자를 위한 이해할 수 있는 IT지식] / (컴파일러, 하드웨어, API, RESTful API, 컴파일러 , SDK, 리눅스, 컴파일, JSON ) (0) | 2021.03.06 |
- Total
- Today
- Yesterday