클린 코드를 실무에 적용하는 방법을 배워보자. 이 책은 자바스크립트, PHP, 파이썬, 자바 등 다양한 프로그래밍 언어를 활용한 예제를 제공한다. 다양한 언어를 넘나들며 가독성, 결합성, 테스트 가능성, 보안, 확장성 등 클린 코드의 핵심 개념을 깊이 있게 탐구한다. 복잡한 코드베이스를 효과적으로 확장하고 유지 관리하는 방법부터 코드 스멜을 식별하고 해결하는 방법까지 소개한다. 이 책은 모든 개발자에게 필수 덕목인 클린 코드 작성법을 소개하는 강력한 비법서이다. 클린 코드의 이점을 직접 경험하고, 여러분의 개발 스킬을 한 단계 업그레이드할 차례이다.
Contents
CHAPTER 1 클린 코드
_1.1 코드 스멜이란 무엇인가요?
_1.2 리팩터링은 무엇인가요?
_1.3 레시피는 무엇인가요?
_1.4 왜 클린 코드인가요?
_1.5 가독성, 성능 혹은 둘 다
_1.6 소프트웨어 유형
_1.7 기계 생성 코드
_1.8 이 책에서 사용하는 표현
_1.9 디자인 패턴
_1.10 프로그래밍 언어 패러다임
_1.11 객체 vs. 클래스
_1.12 변경성
CHAPTER 2 공리 설정
_2.0 소개
_2.1 왜 모델인가요?
_2.2 왜 추상적인가요?
_2.3 왜 프로그래밍이 가능해야 하나요?
_2.4 왜 부분적인가요?
_2.5 왜 설명 가능해야 하나요?
_2.6 왜 현실에 관한 것인가요?
_2.7 규칙 유추하기
_2.8 유일무이한 소프트웨어 설계 원칙
CHAPTER 3 빈약한 모델
_3.0 소개
_3.1 빈약한 객체를 풍성한 객체로 변환하기
_3.2 객체의 본질 파악하기
_3.3 객체에서 세터 제거하기
_3.4 빈약한 코드 생성기 제거하기
_3.5 자동으로 구현된 속성 제거하기
_3.6 DTO 제거하기
_3.7 빈 생성자 완성하기
_3.8 게터 제거하기
_3.9 객체의 난장판 방지하기
_3.10 동적 속성 제거하기
CHAPTER 4 기본형 집착
_4.0 소개
_4.1 작은 객체 생성하기
_4.2 기본형 데이터 구체화하기
_4.3 연관 배열 재구성하기
_4.4 문자열 남용 제거하기
_4.5 타임스탬프 구체화하기
_4.6 하위 집합을 객체로 구체화하기
_4.7 문자열 유효성 검증 구체화하기
_4.8 불필요한 속성 제거하기
_4.9 날짜 구간 생성하기
CHAPTER 5 가변성
_5.0 소개
_5.1 var를 const로 변경하기
_5.2 변수를 가변적이게 선언하기
_5.3 본질 변경 금지하기
_5.4 변경 가능한 상수 배열 피하기
_5.5 지연된 초기화 제거하기
_5.6 변경 가능한 상수 고정하기
_5.7 부작용 제거하기
_5.8 호이스팅 방지하기
CHAPTER 6 선언적 코드
_6.0 소개
_6.1 재사용 변수 범위 좁히기
_6.2 빈 줄 제거하기
_6.3 버전이 지정된 메서드 제거하기
_6.4 이중 부정 제거하기
_6.5 잘못 배치된 책임 변경하기
_6.6 명시적 반복 대체하기
_6.7 설계 결정 기록하기
_6.8 매직 넘버를 상수로 바꾸기
_6.9 ‘무엇’과 ‘어떻게’ 분리하기
_6.10 정규 표현식 문서화하기
_6.11 괴상한 조건문 재작성하기
_6.12 저급한 메서드 제거하기
_6.13 콜백 지옥에서 벗어나기
_6.14 올바른 오류 메시지 생성하기
_6.15 마법 변환 피하기
CHAPTER 7 명명
_7.0 소개
_7.1 약어 확장하기
_7.2 도우미와 유틸리티 이름 변경 및 분리하기
_7.3 my-객체 이름 변경하기
_7.4 result 변수 이름 변경하기
_7.5 타입이 포함된 변수 이름 변경하기
_7.6 긴 이름 변경하기
_7.7 추상적인 이름 변경하기
_7.8 맞춤법 오류 수정하기
_7.9 속성에서 클래스명 제거하기
_7.10 클래스와 인터페이스에서 첫 글자 제거하기
_7.11 basic/do 함수 이름 바꾸기
_7.12 복수형 클래스를 단수로 변환하기
_7.13 이름에서 Collection 제거하기
_7.14 클래스 이름에서 Impl 접두사/접미사 제거하기
_7.15 역할에 따라 인수 이름 변경하기
_7.16 중복된 매개변수 이름 제거하기
_7.17 이름에서 불필요한 컨텍스트 제거하기
_7.18 data 명칭 피하기
CHAPTER 8 주석
_8.0 소개
_8.1 주석 처리된 코드 제거하기
_8.2 더 이상 사용하지 않는 주석 제거하기
_8.3 논리적인 주석 제거하기
_8.4 게터 주석 제거하기
_8.5 주석을 함수명으로 변환하기
_8.6 메서드 내부 주석 제거하기
_8.7 주석을 테스트로 대체하기
CHAPTER 9 표준
_9.0 소개
_9.1 코딩 표준 준수하기
_9.2 들여쓰기 표준화하기
_9.3 대소문자 규칙 통일하기
_9.4 영어로 코드 작성하기
_9.5 매개변수 순서 통일하기
_9.6 깨진 유리창 수정하기
CHAPTER 10 복잡성
_10.0 소개
_10.1 반복되는 코드 제거하기
_10.2 설정/구성 및 기능 토글 제거하기
_10.3 속성으로 상태 변경하기
_10.4 코드에서 교묘함 제거하기
_10.5 다중 프라미스 끊기
_10.6 긴 협업 체인 끊기
_10.7 메서드를 객체로 추출하기
_10.8 배열 생성자 관리하기
_10.9 폴터가이스트 객체 제거하기
CHAPTER 11 블로터
_11.0 소개
_11.1 너무 긴 메서드 나누기
_11.2 과도한 인수 줄이기
_11.3 과도한 변수 줄이기
_11.4 과도한 괄호 제거하기
_11.5 과도한 메서드 제거하기
_11.6 너무 많은 속성 나누기
_11.7 import 목록 줄이기
_11.8 and 함수 나누기
_11.9 뚱뚱한 인터페이스 분리하기
CHAPTER 12 YAGNI 원칙
_12.0 소개
_12.1 불필요한 코드 제거하기
_12.2 다이어그램 대신 코드 사용하기
_12.3 하나의 하위 클래스를 가진 클래스 리팩터링하기
_12.4 일회성 인터페이스 제거하기
_12.5 디자인 패턴 남용 제거하기
_12.6 비즈니스 컬렉션 대체하기
CHAPTER 13 빠른 실패
_13.0 소개
_13.1 재할당 변수 리팩터링하기
_13.2 전제 조건 적용하기
_13.3 더 엄격한 매개변수 사용하기
_13.4 switch 문에서 기본값 제거하기
_13.5 순회하는 동안 컬렉션 수정 방지하기
_13.6 해시와 동등성 재정의하기
_13.7 기능 변경 없이 리팩터링하기
CHAPTER 14 if 문
_14.0 소개
_14.1 우발적 if 문을 다형성으로 대체하기
_14.2 이벤트의 플래그 변수 이름 변경하기
_14.3 boolean 변수 재구성하기
_14.4 switch/case/else if 문 대체하기
_14.5 하드코딩된 if 조건문을 컬렉션으로 대체하기
_14.6 boolean을 단락 평가 조건으로 변경하기
_14.7 암시적 else 추가하기
_14.8 조건부 화살표 코드 재작성하기
_14.9 무분별한 단락 평가 방지하기
_14.10 중첩된 화살표 코드 재작성하기
_14.11 조건 검사를 위한 boolean 값 반환 방지하기
_14.12 boolean 비교 변경하기
_14.13 긴 삼항식에서 추출하기
_14.14 비다형성 함수를 다형성으로 변환하기
_14.15 동등 비교 변경하기
_14.16 하드코딩된 비즈니스 조건 재정의하기
_14.17 불필요한 boolean 제거하기
_14.18 중첩된 삼항식 재작성하기
CHAPTER 15 null
_15.0 소개
_15.1 null 객체 생성하기
_15.2 선택적 체이닝 제거하기
_15.3 선택적 속성을 컬렉션으로 변환하기
_15.4 실제 객체로 null 대체하기
_15.5 null을 사용하지 않고 알려지지 않은 위치 표현하기
CHAPTER 16 섣부른 최적화
_16.0 소개
_16.1 객체 ID 피하기
_16.2 섣부른 최적화 제거하기
_16.3 비트 단위의 섣부른 최적화 제거하기
_16.4 과도한 일반화 줄이기
_16.5 구조적 최적화 변경하기
_16.6 앵커 보트 제거하기
_16.7 도메인 객체에서 캐시 추출하기
_16.8 구현에 기반한 콜백 이벤트 제거하기
_16.9 생성자에서 쿼리 제거하기
_16.10 소멸자에서 코드 제거하기
CHAPTER 17 결합도
_17.0 소개
_17.1 숨겨진 가정을 명시적으로 표현하기
_17.2 싱글턴 대체하기
_17.3 신 객체 나누기
_17.4 확산적 변경 나누기
_17.5 특수 플래그 값을 일반값으로 변환하기
_17.6 산탄총 수술 제거하기
_17.7 선택적 인수 제거하기
_17.8 기능에 대한 욕심 방지하기
_17.9 중간자 제거하기
_17.10 기본 인수를 맨 끝으로 이동하기
_17.11 파급 효과 피하기
_17.12 비즈니스 객체에서 우발적 메서드 제거하기
_17.13 사용자 인터페이스에서 비즈니스 코드 제거하기
_17.14 결합을 클래스로 대체하기
_17.15 데이터 덩어리 리팩터링하기
_17.16 부적절한 친밀성 분리하기
_17.17 대체 가능한 객체 대체하기
CHAPTER 18 전역
_18.0 소개
_18.1 전역 함수 구체화하기
_18.2 정적 함수 구체화하기
_18.3 goto를 구조화된 코드로 대체하기
_18.4 전역 클래스 제거하기
_18.5 전역 날짜 생성 변경하기
CHAPTER 19 계층
_19.0 소개
_19.1 깊은 상속 끊기
_19.2 요요 계층 분리하기
_19.3 코드 재사용을 위한 하위 분류 나누기
_19.4 is-a 관계를 동작으로 변경하기
_19.5 중첩 클래스 제거하기
_19.6 격리된 클래스 이름 변경하기
_19.7 구상 클래스를 final로 만들기
_19.8 클래스 상속 명시적으로 정의하기
_19.9 비어 있는 클래스 마이그레이션하기
_19.10 섣부른 분류 지연하기
_19.11 protected 속성 제거하기
_19.12 비어 있는 구현 완성시키기
CHAPTER 20 테스트
_20.0 소개
_20.1 private 메서드 테스트하기
_20.2 어서션에 설명 추가하기
_20.3 assertTrue를 특정 어서션으로 마이그레이션하기
_20.4 모의 객체를 실제 객체로 대체하기
_20.5 일반 어서션 다듬기
_20.6 불규칙한 테스트 제거하기
_20.7 부동 소수점에 대한 어서션 변경하기
_20.8 테스트 데이터를 실제 데이터로 변경하기
_20.9 캡슐화를 위반하는 테스트 보호하기
_20.10 관련 없는 테스트 정보 제거하기
_20.11 모든 병합 요청에 대해 커버리지 추가하기
_20.12 날짜에 의존하는 테스트 재작성하기
_20.13 새로운 프로그래밍 언어 배우기
CHAPTER 21 기술 부채
_21.0 소개
_21.1 프로덕션 종속 코드 제거하기
_21.2 결함 목록 제거하기
_21.3 경고/엄격 모드 해제 제거하기
_21.4 TODO와 FIXME 방지 및 제거하기
CHAPTER 22 예외
_22.0 소개
_22.1 비어 있는 예외 블록 제거하기
_22.2 불필요한 예외 제거하기
_22.3 예상 가능한 상황을 위한 예외 재작성하기
_22.4 중첩된 try/catch 재작성하기
_22.5 반환 코드를 예외로 대체하기
_22.6 예외 화살표 코드 재작성하기
_22.7 최종 사용자로부터 저수준 오류 숨기기
_22.8 예외 시도 범위 좁히기
CHAPTER 23 메타프로그래밍
_23.0 소개
_23.1 메타프로그래밍 사용처 제거하기
_23.2 익명 함수 재정의하기
_23.3 전처리 제거하기
_23.4 동적 메서드 제거하기
CHAPTER 24 타입
_24.0 소개
_24.1 타입 검사 제거하기
_24.2 참 같은 값 다루기
_24.3 부동 소수점을 십진수로 변경하기
CHAPTER 25 보안
_25.0 소개
_25.1 입력값 검열하기
_25.2 순차적 ID 변경하기
_25.3 패키지 의존성 제거하기
_25.4 악의적인 정규 표현식 대체하기
_25.5 객체 역직렬화 방지하기
Author
막시밀리아노 콘티에리,이태영
25년 동안 소프트웨어 업계에 종사했으며 동시에 대학에서도 강의를 해왔다. 클린 코드, 리팩터링, 테스트 주도 개발 및 코드 스멜에 관해 꾸준히 글을 쓰고 있으며 인기 블로그 플랫폼에 매주 두어 편의 기사를 작성한다. 선언적 및 행동적 코드의 팬이며 소프트웨어 기본 사항을 사용해 우아하고 강력한 솔루션을 구축하기를 즐긴다.
25년 동안 소프트웨어 업계에 종사했으며 동시에 대학에서도 강의를 해왔다. 클린 코드, 리팩터링, 테스트 주도 개발 및 코드 스멜에 관해 꾸준히 글을 쓰고 있으며 인기 블로그 플랫폼에 매주 두어 편의 기사를 작성한다. 선언적 및 행동적 코드의 팬이며 소프트웨어 기본 사항을 사용해 우아하고 강력한 솔루션을 구축하기를 즐긴다.