TIL (Today I Learned)
2022.05.09
오늘 읽은 범위
3장. 함수
📖 책에서 기억하고 싶은 내용을 써보세요.
- 함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다. (p.44)
- 함수가 확실히 ‘한 가지’ 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다.
- 한 함수 내에 추상화 수준을 섞으면 코드를 읽는 사람이 헷갈린다. 근본 개념과 세부사항을 뒤섞기 시작하면, 깨어진 창문처럼 사람들이 함수에 세부사항을 점점 더 추가한다. (p.45-46)
- 코드는 위에서 아래로 이야기처럼 읽혀야 좋다. (p.46)
- 길고 서술적인 이름이 길고 서술적인 주석보다 좋다. (p.49)
- 최선은 입력 인수가 없는 경우이며, 차선은 입력 인수가 1개뿐인 경우다. (p.51)
- 플래그 인수는 추하다. (...) 함수가 한꺼번에 여러 가지를 처리한다고 대놓고 공표하는 셈이니까! 플래그가 참이면 이걸 하고 거짓이면 저걸 한다는 말이니까! (p.52)
- 어떤 코드든 절대로 무시하면 안되니까. 무시한 코드에 오류가 숨어드니까. (p.52)
- 부수 효과를 일으키지 마라! (p.55)
- 함수에서 한 가지를 하겠다고 약속하고선 (..) 예상치 못하게 클래스 변수를 수정한다.
- 만약 시간적인 결합이 필요하다면 함수 이름에 분명히 명시한다.
🐱👓 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요
- 추상화 수준이 동일해야한다.
: 맞는말이다. 지금껏 의식하지 못했던 사항이라 이제부터 추상화 레벨에 대해 신경써서 개발 해야겠다.
- 시스템 구현하면서도 계속 함수 세분화를 의식하면서 하는 것이 중요하다. 깨어진 창문논리가 공감이 많이 되었다. 책에서 이야기하는 개발 방식은 신경과 정성이 많이 들어갈 수밖에 없는데, 한번 괜찮겠지.. 급하니까 라고 생각하다보면 어느 새 겉잡을 수 없는 스파게티 소스가 되어버렸다.. 그리고 날잡고 리팩토링을 하는 수 밖에.. 오히려 리소스가 더 많이 들어가니 틈틈히 하자..!
깨진 창문 (p.45-46)
한 함수 내에 추상화 수준을 섞으면 코드를 읽는 사람이 헷갈린다. 근본 개념과 세부사항을 뒤섞기 시작하면, 깨어진 창문처럼 사람들이 함수에 세부사항을 점점 더 추가한다.
- 인수를 최소화 하는 것이 좋다는 것은, Object 타입의 인수를 넘겨 함수에서 구조분해할당으로 사용하는 방식에도 해당되는 것일까?
: Object내 필요 property만 선언해 사용하다 보면 Object내 전체 항목을 파악하는 것이 어려울 때가 있다. (Object 항목이 많을 때, 추가적으로 호출이 필요하다면, 상위 함수를 추적해 전체 데이터를 확인해야하는 불상사가 간혹 있었다.) 이 경우에는 인수는 하나지만, 저자가 말하는 다중 인수의 부작용과 비슷한 상황이 있을 수 있는 경우라 생각했다.
- 🤔❔ 타입스크립트를 사용하는 것으로 해결을 할 수도 있다. 만약 vue 컴포넌트를 사용한다면 컴포넌트 생성할 때 prop 타입을 지정해 주는 것으로 어느 정도의 가이드라인이 될 수 있겠다. 지금 사내 프로젝트에서는 어떻게 보완할수 있을까..
- 🤔❔ 아니면 근본적인 원인해결, object 내 선언하는 property 갯수 한정..? 어디까지 허용되게 할 것인가.
🧐 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.
A와B를 하려면 C를 해야한다.
A를 하기위해서는 D를 해야한다.
D를 하기위해서는 F를 해야한다.
F를 하기위해서는 H를 해야한다.
H를 하기위해서는 I를 해야한다.
I를 하기위해서는 O를 해야한다.
B를 하기위해서는 Q를 해야한다.
....
...
- SRP (Single Responsibility Principle)
:단일 책임 원칙, 모든 클래스는 하나의 책임만 가지며 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다.
- OCP (Open Closed Principle)
:개방 폐쇄 원칙, 소프트웨어 객체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하며 수정에 대해서는 닫혀있어야 한다.
- 추상 팩토리 (Abstract Factory)
:구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴