오늘 읽은 범위
- 3장. 함수
기억하고 싶은 내용
- 작게 만들어라! (p.42)
- 함수를 만드는 첫째 규칙은 ‘작게!’다. 함수를 만드는 둘째 규칙은 ‘더 작게!’다.
- 함수에서 들여 쓰기 수준은 1단이나 2단을 넘어서면 안 된다.
- 한 가지만 해라! (p.44)
- 함수는 한 가지를 해야 한다. 그 한 가지를 잘해야 한다. 그 한 가지만을 해야 한다.
- 단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다.
- 함수 당 추상화 수준은 하나로! (p.45)
- 함수가 확실히 ‘한 가지' 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다.
- 코드는 위에서 아래로 이야기처럼 읽혀야 좋다. 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다.
- Switch 문 (p.47)
- switch 문을 완전히 피할 방법은 없다. 하지만 각 switch 문을 저 차원 클래스에 숨기고 절대로 반복하지 않는 방법은 있다. 물론 다형성을 이용한다.
- 서술적인 이름을 사용하라! (p.49)
- 함수가 하는 일을 좀 더 잘 표현하므로 훨씬 좋은 이름이다.
- 이름이 길어도 괜찮다. 길고 서술적인 이름이 짧고 어려운 이름보다 좋다.
- 함수 인수 (p.50)
- 함수에서 이상적인 인수 개수는 0개(무항)다. 다음은 1개(단항)고, 다음은 2개(이항)다.
- 3개(삼항)는 가능한 피하는 편이 좋다. 4개 이상(다항)은 특별한 이유가 필요하다. 특별한 이유가 있어도 사용하면 안 된다.
- 인수는 개념을 이해하기 어렵게 만든다.
- 함수로 부울 값을 넘기는 관례는 정말로 끔찍하다.
- render(true) → renderForSuite()와 renderForSingleTest()로 분리
- 인수가 2-3개 필요하다면 일부를 독자적인 클래스 변수로 선언할 가능성을 짚어본다.
- 함수의 의도나 인수의 순서와 의도를 제대로 표현하려면 좋은 함수 이름이 필수다.
- write(name), writeField(name)
- 부수 효과를 일으키지 마라! (p.54)
- 부수 효과는 시간적인 결합이나 순서 종속성을 초래한다.
- 일반적으로 출력 인수는 피해야 한다.
- 명령과 조회를 분리하라! (p.56)
- 함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 해야 한다.
- 오류 코드보다 예외를 사용하라! (p.57)
- 명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 미묘하게 위반한다.
- try/catch 블록을 별도 함수로 뽑아내는 편이 좋다.
- 오류 처리도 한 가지 작업이다.
- 반복하지 마라! (p.60)
- 중복은 코드 길이가 늘어날 뿐 아니라 알고리즘이 변하면 다 같이 손봐야 하는 문제가 있다.
- 구조적 프로그래밍 (p.61)
- 함수를 작게 만든다면 간혹 return, break, continue를 여러 차례 사용해도 괜찮다.
- goto 문은 절대로 안 된다.
- 소프트웨어를 짜는 행위는 여느 글짓기와 비슷하게 처음에는 서투른 방식으로 시작을 해서 코드를 다듬어 나간다면 최종적으로 이 장에서 설명한 규칙을 따르는 함수가 얻어질 것이다. (p.61)
- 함수가 분명하고 정확한 언어로 깔끔하게 작성되어 있다면 시스템이라는 이야기를 풀어가기 더 쉬워질 것이다. (p.62)
소감 및 생각
- 몇 년 전에 클린 코드 책을 처음 접했을 때 이 장을 읽고 나서 충격을 받았던 것이 생각난다. 그동안 내가 짰던 함수들에 대한 회의감을 느끼면서.. 그 이후로 최대한 규칙들을 지키려고 노력해오고 있지만 아직도 쉽지가 않은 것 같다. 이번에 규칙들을 되새기고 신중하게 개발을 하도록 노력해야겠다.
- 기존 레거시들이 오류 코드를 사용하도록 개발되어 있어서, 예외를 사용하도록 수정해도 클라이언트 코드가 변경되지 않는 한 오류 코드는 사용할 수밖에 없는 한계가 있었다. 처음 설계를 할 때부터 예외를 사용하도록 하는 것도 중요한 것 같다.
- 함수에서 Return Early를 사용하는 것이 더 좋다고 생각된다. 이 경우 함수를 다 읽지 않아도 쉽게 출력 결과를 알 수 있는 장점이 있다.
새롭게 배운 개념
- 추상 팩토리(Abstract Factory): https://jsyang-dev.tistory.com/18
- 시간적인 결합(temporal coupling): https://joyyir.github.io/the%20pragmatic%20programmer/the-pragmatic-programmer-28/
- COP(Component Oriented Programming): 객체지향 프로그래밍에서의 객체와는 달리 다형성과 상속성을 배제하고 잘 정의된 인터페이스를 통해 소스 코드가 아닌 이진 형식으로 제공하는 컴포넌트를 통해 재사용하는 방식
- 구조적 프로그래밍: https://velog.io/@gooreum_90/구조적-프로그래밍
[실용주의 프로그래머] 28장 - 시간적 결합
The pragmatic programmer 28장 요약
joyyir.github.io
구조적 프로그래밍
소프트웨어를 과학으로 발전시키는데 큰 공헌을 함.데이크스트라가 해결하고자 하는 문제가 있었음.프로그래밍에 체계가 없기 때문에 프로그래밍을 하더라도 믿을 수 있는 결과를 내놓기 어려
velog.io
추상 팩토리 패턴
서로 관련 있는 여러 객체를 만들어주는 인터페이스 구체적으로 어떤 클래스의 인스턴스(concreate product)를 사용하는지 감출 수 있다. 구현 방법 클라이언트 코드에서 구체적인 클래스의 의존성
jsyang-dev.tistory.com
'클린 코드' 카테고리의 다른 글
6장. 객체와 자료 구조 (0) | 2022.03.01 |
---|---|
5장. 형식 맞추기 (0) | 2022.02.28 |
4장. 주석 (0) | 2022.02.25 |
2장. 의미 있는 이름 (0) | 2022.02.20 |
1장. 깨끗한 코드 (0) | 2022.02.19 |
댓글