클린 코드(Clean code) Day 3
독서/노개북

클린 코드(Clean code) Day 3

🔖오늘 읽은 범위 : 3장 함수


🙂 책에서 기억하고 싶은 내용을 써보세요.

 

1. 함수는 작으면 작을수록 좋다.

각 함수가 이야기 하나를 표현하도록 하자. 중첩 구조가 생길 만큼 함수가 커져서는 안 된다.

 

2. 함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한가지만을 해야한다.

어쨌거나 우리가 함수를 만드는 이유는 큰 개념을 다음 추상화 수준에서 여러 단계로 나눠 수행하기 위해서가 아니던가.

 

 

❗️함수가 '한 가지만' 하는지 판단하는 법

  1. 같은 추상화 수준*을 가진 코드들로 이루어져 있는지
  2. 각 코드를 단순히 다른 표현이 아니라 의미 있는 이름으로 나눌 수 있는지

( 따라서, 객체 상태를 변경하는 것과 객체 정보를 반환하는 로직은 분리되어야 한다. )

 

 

 

💡추상화 수준*이란

 

일단 ‘추상화’란 구체적인 사항은 되도록 생략하고, 핵심이 되는 원리 만을 추구하는 것. 현상의 본질 만을 남겨두고 축약시켜, 다루기 쉽게 표현토록 하는 것이라 정의되어있다.

 

책의 예제에서 살펴보자면,

pageData.getHtml()

함수의 이름에서 알 수 있듯이 html을 가져오리라는 추측을 쉽게 할 수 있다. 하지만 그 안에 어떤 것이 들어있는지, 어떻게 구성되어있는지 알 수 없다. 이 코드는 추상화 수준이 높은 코드이다.

 

.append("\n")

문자열에 공백을 넣는 코드이다. 문자열을 직접적으로 조작하므로 구체적이기 때문에 추상화 수준이 매우 낮은 코드이다.

 

 

함수에서 인수 개수는 적을수록 좋다.

만약 부득이하게 인수를 넘긴다면, 인수의 순서와 의도를 제대로 표현할 수 있는 이름을 지어주자.

writeField(name), assertExpectedEqualsActual(expected, actual)

 

부수효과를 일으키지 말아야 한다.

함수의 이름에서 추측하지 못하는 기능은 잠재적 오류를 불러온다.

 

중복을 없애야 한다.

어쩌면 중복은 소프트웨어에서 모든 악의 근원이다.

 

 

 

 

🤔 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

 

 

소프트웨어를 짜는 행위는 여느 글짓기와 비슷하다. 초안은 대개 서투르고 어수선하므로 원하는 대로 읽힐 때까지 말을 다듬고 문장을 고치고 문단을 정리한다.

함수를 짤 때도 마찬가지다. 처음에는 길고 복잡하다. 들여 쓰기 단계도 많고 중복된 루프도 많다. 인수 목록도 아주 길다. 이름은 즉흥적이고 코드는 중복된다. 이제 코드를 다듬고, 함수를 만들고, 이름을 바꾸고, 중복을 제거한다. 메서드를 줄이고 순서를 바꾼다.

글을 쓸 때 나는 항상 대략적인 구조를 잡고, 각 부분에 어떤 내용을 적을 건지 간략하게 정리하는 것부터 시작했다. 대략 구조가 정해지면, 머릿속에 떠오른 모든 내용들을 일단 두서없이 써 내려갔다. 처음부터 읽기 좋은 글을 쓰는 것이 어려운 것처럼 처음부터 완벽한 코드를 짜는 건 힘든 일인데 나는 왜 한 번에 좋은 코드를 써내려가기 위해 머리를 굴렸을까. 어쩌면 나는 계속 초안 상태로만 내 코드를 방치하고 있었는지도 모른다.

내가 작성한 코드를 한번 두 번 다시 읽어보고 개선해나가는 습관을 들이자. 단번에 좋은 코드를 짜겠다는 욕심을 버리고 일단 생각을 코드로 표현해나가자.