Clean Code 내용 정리 - 1
대학시절 프런트 개발을 하다가, ebay에서 웹 개발을 하면서 백엔드 개발을 주로 하다 보니, Java나 C#으로 개발을 주로 하게 되었는데, 모르는 부분도 많고 함께 프로젝트를 만들기 때문에 좀 더 좋은 개발을 하고 싶어서, 1년 전에 샀던 책을 다시 펴서 정리한다.
#
1장. Clean Code나쁜 코드가 만드는 결과
- 개발 속도의 감소
- 팀 생산성의 하락, 이후 재개발 필요
- 유지 보수의 어려움
#
깨끗한 코드란?- 모든 테스트를 통과
- 중복이 없음
- 시스템 내 모든 설계 아이디어를 표현함
- 클래스, 메서드, 함수 등을 최대한 줄임
#
2장. 의미 있는 이름핵심은 다음과 같다.
의도를 분명히 밝히기.
- ex)
int elapsedTimeInDays
,daysSinceCreation
등등
- ex)
그릇된 정보를 피하기.
- 일관성을 지켜야한다.
의미 있게 구분하기.
발음하기 쉬운 이름을 사용하기.
검색하기 쉬운 이름을 사용하기.
인코딩을 피하기.
- 헝가리식 표기법
- 멤버 변수 접두어
- 인터페이스 클래스와 구현 클래스
자신의 기억력을 자랑하지 말기.
클래스 이름은 명사나 명사구.
메서드 이름은 동사나 동사구.
기발한 이름을 피하기
한 개념에 한 단어 사용
말장난하지 말기
해법 영역에서 가져온 이름 사용하기
- 전산, 알고리즘, 패턴, 수학 용어들은 사용해도 괜찮다.
문제 영역에서 가져온 이름 사용하기
- 적절한 프로그래머 용어가 없다면, 문제 영역에서 가져온다.
의미 있는 맥락을 추가
- 스스로 의미가 분명하게 해 주기. -> 클래스, 함수, 이름 공간에 넣어 맥락 주기
- 모든 방법이 어렵다면 접두어 사용하기
불필요한 맥락 없애기.
핵심 중 하나는, 좋은 이름을 선택하려면 설명 능력이 뛰어나야 하고, 문화적인 배경이 같아야 한다.
#
3장. 함수함수의 규칙은 다음과 같다.
작게 만들기
- 일반적으로 2줄, 3줄, 4줄이 이상적으로 좋다.
- 블록과 들여 쓰기.
- if/else/while 문 등에 들어가는 블록은 한 줄이여야 함.
한 가지만 하기
- 함수는 한 가지를 해야 하고 한 가지를 잘해야 한다.
함수 당 추상화 수준은 하나로
- 한 함수에 추상화 수준을 섞으면 코드를 읽는 사람이 헷갈림
- 내려가기 규칙 : 위에서 아래로 코드 읽기
- 마치 이야기처럼
Switch 문
- 다형성 사용해서 최대한 숨기고 반복하지 않게 하기.
- 객체 안에서 숨기기
- 최대한 한 번만 사용하기
- 다형성 사용해서 최대한 숨기고 반복하지 않게 하기.
서술적인 이름 사용
- 서술적인 이름이 설계에서 더 뚜렷한 의미를 가지고 개선하기 쉬워짐
- 일관성 유지하기
함수 인수
- 함수에서 이상적인 인수는 0개이다.
- 1개(단항), 2개(이항)까지고 좋고, 3개(삼항)는 가능한 피하고, 4개(다항)는 이유가 필요하다.
- 점점 더 읽기 어려워짐.
includeSetupPageInfo(new PageContent)
보다는includeSetupPage()
가 더 읽기 좋음- 단항 형식의 좋은 예
boolean fileExists("MyFile")
- 이항 함수의 좋은 예
Point p = new Point(0, 0)
- 동사와 키워드
- 함수의 의도나 인수의 순서와 의도를 제대로 표현하려면 좋은 함수가 필수
- 단항 함수는 함수와 인수가 동사/명사 쌍을 이뤄야 한다.
- ex)
writeField(name)
등 assertEquals
보다는assertExpectedEqualsActual(expected, actual)
이 더 좋다.
- ex)
부수 효과를 일으키지 마라
- 즉, 함수에서 한 가지를 하겠다고 하고, 다른 기능을 넣지 마라
- 출력 인수
- 일반적으로는 출력 인수를 피해라.
appendFooter(s)
보다는report.appendFooter()처럼
작성하기.
명령과 조회를 분리하기
- 함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 해야 한다.
오류 코드보다 예외를 사용하라
- 명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 미묘하게 위반한다.
- Try/Catch 블록 뽑아내기.
- 흉측함, 별도 함수로 뽑아내는 편이 좋다.
- 오류 처리도 한 가지 작업
- 오류 처리도 오류만 처리해야 한다.
- 오류 클래스를 따로 선언하면, 해당 클래스는 의존성 자석이 되기 때문에 다른 코드에서 import 해서 사용해야 한다.
- 즉, 오류 클래스가 변한다면 클래스 전부를 다시 컴파일하고 다시 배치해야 한다.
- 따라서 일반적으로는 예외를 사용하기
반복하지 말기
- AOP(Aspect Oriented Programming), COP(Component Oriented Programming) 등 모두가 어떤 면에서는 중복 제거 전략이 들어간다.
구조적 프로그래밍
- 모든 함수와 함수 내 모든 블록에 입구와 출구가 하나만 존재해야 한다
- 루프 안에서 break나 continue를 사용해서는 안된다. goto는 아시다시피 절대로 안됨
- 해당 문제는 함수가 아주 클 때 상당한 이익을 제공.
함수는 짜는 방법
- 일종의 글짓기와 비슷
- 초안은 길고 복잡할 수 있지만, 수정하면서 코드를 다듬고 함수를 만들고, 이름을 바꾸고 중복을 제거하고 메서드를 제거하기
#
결론모든 시스템은 특정 응용 분야 시스템을 기술할 목적으로 프로그래머가 설계한 DSL(Domain Specific Language, 도메인 특화 언어)로 만든다. 이러한 기술 들은 함수를 잘 만드는 방법이다. 그러나 정말로 중요한 것은 시스템이다.