TIL (2024.02.04)
DAY 10
Summary
- 객체는 동작을 공개하고 자료를 숨긴다
- 자료 구조는 별다른 동작 없이 자료를 노출한다
- 새로운 자료 타입을 추가하는 유연성이 필요한 경우에는
객체
를 사용하고, 새로운 동작을 추가하는 유연성이 필요한 경우에는 자료 구조
와 절차적인 코드
를 사용해라
책에서 기억하고 싶은 내용
6장 객체와 자료 구조
- 변수를 비공개(private)으로 정의하는 이유?
- 남들이 변수에 의존하지 않게 만들고 싶어서
- 변수 타입이나 구현을 맘대로 바꾸고 싶어서
자료 추상화 (p.118)
- 진정한 의미의 클래스?
- 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 함
- 자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다
자료/객체 비대칭 (p.119)
- 객체 vs 자료구조
객체
는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개
자료 구조
는 자료를 그대로 공개하며 별다른 함수는 제공하지 않음
- 클래스와 객체 지향 기법이 적합한 경우?
- 절차적인 코드와 자료 구조가 적합한 경우?
디미터 법칙 (p.123)
- 디미터 법칙?
- 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙
기차 충돌 (p.123)
잡종 구조 (p.124)
- 잡종 구조?
- 절반은 객체, 절반은 자료 구조인 형태
- 중요한 기능을 수행하는 함수도 있고, 공개 변수나 공개 조회/설정 함수도 있다
- 공개 조회/설정 함수는 비공개 변수를 그대로 노출한다
- 새로운 함수, 새로운 자료 구조도 추가하기 어려워 객체와 자료 구조의 단점만 모아놓은 구조
- 되도록 피하라...
구조체 감추기 (p.125)
- 객체?
- 객체라면 내부 구조를 감춰야 한다
- 객체라면 뭔가를 하라고 말해야지 속을 드러내라고 말하면 안 된다
자료 전달 객체 (p.126)
- 자료 구조체?
- 공개 변수만 있고 함수가 없는 클래스
- 자료 전달 객체, Data Transfer Object, DTO
- 데이터베이스와 통신하거나 소켓에서 받은 메시지와 구문을 분석할 때 유용
- 데이터베이스에 저장된 가공되지 않은 정보를 애플리케이션 코드에서 사용할 객체로 변환하는 일련의 단계에서 가장 처음으로 사용하는 구조체
활성 레코드 (p.127)
- 활성 레코드?
- DTO의 특수한 형태
- 공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료 구조
- save나 find와 같은 탐색 함수도 제공
- 데이터베이스 테이블이나 다른 소스에서 자료를 직접 변환한 결과
- 자료 구조로 취급!
결론 (p.127)
- 객체?
- 동작을 공개하고 자료를 숨긴다
-> 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기 쉬움
-> 기존 객체에 새 동작을 추가하기는 어려움
- 사용하기에 적합한 경우?
- 새로운 자료 타입을 추가하는 유연성이 필요한 경우
- 자료 구조?
- 별다른 동작 없이 자료를 노출한다
-> 기존 자료 구조에 새 동작을 추가하기 쉬움
-> 기존 함수에 새 자료 구조를 추가하기는 어려움
- 사용하기에 적합한 경우?
오늘 읽은 소감
자바 언어로 설명된 예시들이어서 주로 사용하는 언어인 JavaScript에서는 어떻게 써먹어야 할지 감이 잡히지 않는 것 같다. 이해를 돕기 위해 clean-code-javascript-ko 깃허브 레파지토리를 참고해서 JavaScript에서는 책에서 말한 것들을 어떻게 사용하면 좋을지 조금은 이해할 수 있었다. 나중에 프로젝트를 해보면 더 이해가 와닿지 않을까?
- getter와 setter를 사용하세요
- 객체에 비공개 멤버를 만드세요(클로저 이용, ES6에서는 클래스를 이용해도 되지 않을까?)