Clean Code 책 요약. 챕터 4~6 : 주석, 형식 맞추기, 객체와 자료구조

작성 : 2021-04-07수정 : 2021-04-07

목차 펼치기

 출처 : yes24

출처 : yes24

4장 - 주석

javascript
1나쁜 코드에 주석을 달지 마라. 새로 짜라.

  • 잘 달린 주석은 유용하다. 하지만 경솔하고 근거 없고 오래되고 조잡한 주석은 해악이다.

  • 코드로 의도를 표현하지 못해(=실패) 주석을 사용한다.

  • 주석이 필요한 상황에서 코드로 의도를 표현할 방법을 찾아라.

  • 주석은 오래될수록 코드에서 멀어지고, 완전히 그릇될 가능성도 커진다.

    • 프로그래머들이 주석을 유지보수하고 보수하기란 현실적으로 불가능하다.

    • 주석은 코드를 따라가지 못한다.

    • 부정확한 주석은 없는 것보다 훨씬 나쁘다. 현혹하고, 지키지 않아도 되거나 지켜서는 안될 규칙을 명시한다.


진실은 한 곳에만 존재한다. 바로 코드다.


그럼에도 불구하고 제 값어치를 하는 주석이란
  • 법적인 주석

    • Copyright, License 관련 내용을 명시하는 주석

  • 정규식의 규칙, 반환값 등의 정보를 제공하는 주석

    • 하지만 네이밍과 함수 분리를 잘하면 필요가 없다.

  • 의도를 설명하는 주석

  • 의미를 명료하게 밝히는 주석

  • 결과나 사용방식에 대해 경고하는 주석

  • TODO 주석

  • 중요성을 강조하는 주석


주석은 대개 나쁘지만 그래도 바이트 낭비하는 나쁜 주석을 꼽자면
  • 주절거리는 주석

  • 같은 이야기를 중복하는 주석

    • 코드 내용을 중복하는 주석으로 자칫 코드보다 주석을 읽는데 더 시간이 걸릴 수 있다.

    • 코드를 정당화하지도, 설명하지도 못한다면 더욱 최악이다.

  • 오해할 여지가 있는 주석

  • 의무적으로 다는 주석

    • 모든 변수에 주석을 달아야 한다는 규칙은 코드를 복잡하게 만들고 무질서하게 만든다.

  • 이력을 기록하는 주석

  • 있으나 마나 한 주석

    • 너무 당연한 주석은 개발자가 주석을 무시하는 습관에 빠지게 한다.

  • 문서를 제공해야 한다는 잘못된 욕심으로 만들어진 잘못된 노이즈

  • 함수나 변수로 표현할 수 있는데도 다는 주석

  • 위치를 표시하는 주석 (배너 주석)

    • 배너를 남용하면 흔한 잡음이 된다. 정말 필요할 때만 드물게 사용하자.

  • 닫는 괄호에 다는 주석

    • 중첩되고 긴 함수에서는 의미가 있다.

    • 하지만 클린 코드가 추구하는 함수에서는 잡음일 뿐이다.

  • 공로를 돌리거나 저자를 표시하는 주석

    • 이런건 VCS에 맡기자.

  • 주석 처리된 코드

    • 주석 처리된 코드는 다른 사람들이 지우기를 주저하게 되고 그렇게 쌓여 간다.

      • 이유가 있다고, 중요하니까 해놓은거라고 생각한다.

    • 우리한테는 VCS가 있다. 삭제하라. 그래도 절대 잃어버리지 않는다.

  • HTML 주석

    • 혐오 그 자체다. IDE에서도 읽기 힘들다.

  • 전역 정보를 설명하는 주석

    • 중복은 물론 아래 함수와 연관 되지도 않고, 꾸준히 관리되리라는 보장도 없다.

  • 불필요하게 너무 많은 정보

  • 주석으로 제대로 설명이 안되는 모호한 관계를 띄는 주석

  • 함수 헤더



5장 - 형식 맞추기

dart
1코드 형식은 의사소통의 일환이다.
2구현 스타일과 가독성 수준은 유지보수 용이성과 확장성에 계속 영향을 미친다.

세로 거리


적절한 행 길이를 유지하라.

  • 일반적으로 큰 파일도 작은 파일이 이해하기 쉽다.

  • 대부분 200줄 정도의 파일로도 커다란 시스템을 구축할 수 있다.


신문 기사처럼 작성하라.

  • 표제 → 첫 문단 → 세부내용 으로 이루어져 있는 것처럼,

    • 이름은 간단하면서 설명 가능하게

    • 처음 부분은 고차원 개념과 알고리즘 설명

    • 아래로 내려갈수록 세세한 묘사


개념은 빈 행으로 분리하라

  • 생각 사이는 빈 행을 넣어 분리하여, 새로운 개념을 시작한다는 시각적 단서로 삼는다.


세로 밀집도

  • 세로 밀집도는 연관성으로, 밀접한 코드 행은 세로로 가까이 놓는다.


수직 거리

  1. 변수는 사용하는 위치에서 최대한 가까이. 함수일 경우 맨 처음 선언한다.

  2. 인스턴스 변수는 클래스 맨 처음 선언한다.

  3. 종속 함수는 가까이 배치하며, 호출하는 함수를 먼저 배치한다.

  4. 명명법이 같거나 기능이 유사하여 개념척 친화도가 높은 관계일 수록 가까이 배치한다.


가로 거리

  • 프로그래머는 명백히 짧은 행을 선호한다.

    • 100~120자 내로 권장한다.


가로 공백

  • 할당 연산자 같이 별개의 개념은 공백을 준다.

  • 함수와 인수 같이 밀접한 개념은 붙여 쓴다.

  • 괄호 안 인수들 사이는 공백을 통해 쉼표를 강조한다.

  • 연산자 우선순위를 구분하기 위해 공백을 주기도 한다.


가로 정렬

  • 가로 정렬을 통해 위치를 맞추는 것은 오른쪽에만 눈길이 가게 하여 유용하지 못하다.

  • 오히려 정렬하지 않으면 결함을 찾기 쉽다.


들여쓰기

  • 범위로 이뤄진 계층을 표현하기 위해 코드를 들여쓴다.

  • 들여쓰기한 파일은 구조가 한눈에 들어온다.

  • 정말 간단하고 짧은 if문 또는 함수에서는 무시하고 싶어질 수 있는데, 그러지말자.


팀 규칙

  • 팀은 한 가지 규칙에 합의하고 모든 팀원은 그 규칙을 따른다.



6장 - 객체와 자료구조

자료 추상화

  • public get, set 함수는 private 변수를 외부에 노출하는 것과 다름 없다.

  • 추상 인터페이스를 통해 구현을 모른 채 조작할 수 있어야 한다.


자료/객체 비대칭

  • 자료 구조는 내부 구조가 노출된다.

  • 절차적 코드는 새 함수를 추가하기 쉽다.

  • 절차적 코드는 새 자료구조를 추가하기 위해서는 모든 함수를 고쳐야 한다.

  • 객체는 내부 구조를 숨겨야 한다.

  • 객체 지향 코드는 새 클래스를 추가하기 쉽다.

  • 객체 지향 코드는 새로운 함수를 추가하기 위해서는 모든 클래스를 고쳐야 한다.


디미터 법칙

  • 모듈은 자신이 조작하는 객체의 내부를 몰라야 한다는 법칙.

dart
1클래스 C의 메소드 f는 다음 객체의 메소드만 호출해야 한다.
2
31. 클래스 C
42. f가 생성한 객체
53. f의 인수로 넘어온 객체
64. C 인스턴스 변수에 저장된 객체
7
8즉 위의 메소드를 호출한 결과 객체의 메소드는 호출하면 안된다.

기차 충돌 구조

  • 기차 충돌 구조는 일반적으로 조잡하다 여겨지기 때문에 나눠서 선언한다.

java
1(X) - 기차 충돌(train wreck) 구조
2final File dir = ctxt.getOptions().getScratchDir()
3
4(O)
5Options opts = ctxt.getOptions();
6File ScratchDir = opts.getScratchDir();

자료 전달 객체

  • DTO(Data Transfer Object)

    • 자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스.

    • 일반적인 형태는 Bean 구조다.

      • private 변수와 public get/set 함수를 쓰는, 일종의 사이비 캡슐화로 별다른 이익이 없다.

    • DB, Socket 데이터를 객체로 변환하는 구조에서 유용하게 사용한다.

  • 활성 레코드

    • DTO의 특수한 형태

    • public 변수, private 변수와 public get/set 함수, save/find 같은 탐색함수

    • DB, 소스의 자료를 직접 변환한 결과

    • 활성 레코드는 자료 구조로 취급한다.

    • 비즈니스 규칙을 담아 내부 자료를 숨기는 객체는 따로 생성한다.



시스템 구현에 적합한 방식을 사용한다.



Contact Me

All Icons byiconiFy