Chapter 6 - Objects and Data Structures
in Booknotes / Clean Code
자료를 세세하게 공개하기보다는 추상적인 개념으로 표현해야 한다
자료 추상화
구체적인 Point Class: 자료 그대로 공개 + 별다른 함수 제공 X
public class Point { public double x; public double y; }
- 추상적인 Point Class (접근방법을 강제하기): 추상화 뒤로 자료를 숨기고 자료를 다루는 함수만 공개
public interface Point { double getX(); double getY(); void setCartesian(double x, double y); double getR(); double getTheta(); void setPola( double r, double theta); }
- 구체적인 Vehicle Class:
public interface Point { double getFuelTankCapacityInGallons(); double getGallonsOfGasoline(); }
- 추상적인 Vehicle Class
public interface Point { double getPercentFuelRemaining(); }
자료/객체 비대칭
- procedural (자료구조를 사용하는) : 기존 자료 구조 변경하지 않으면서 새 함수 추가하기 쉬움
OOP: 기존 함수를 변경하지 않으면서 새 클래스 추가하기 쉬움
- procedural: 새로운 자료구조 추가하기 어려움, 모든 함수를 고쳐야 함
OOP: 새로운 함수 추가하기 어려움, 모든 클래스를 고쳐야 함
- \(\Rightarrow\) tradeoff : OOP에서 어려운 변경은 procedural에서 쉽고 vice versa
디미터 법칙
모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다 - Law of Demeter (LoD)
aka The Principle of Least Knowledge
- \(\rightarrow\) 객체는 자료를 숨기고 함수를 공개
조회함수로 내부 구조 공개하면 안됨!
- 기차충돌:
final String outputDir = ctxt.getOption().getScratchDir().getAbsolutePath();
- BETTER:
Options opts = ctxt.getOptions(); File scratchDir = opts.getScratchDir(); String outputDir = scratchDir.getAbsolutePath();
- 단 여기서
opts
,scratchDir
,outputDir
이 객체라면 디미터 법칙 위반 - 자료구조라면 내부 구조 노출하므로 디미터 법칙 적용X
- 단 여기서
- 잡종구조: 절반은 객체, 절반은 자료구조인 잡종 구조, 양쪽 세상에서 단점만 모아둔 구조
- 공개변수, 공개함수, 주요 함수, getter, setter 모두 섞여 있음
- 되도록 피하기
- 새로운 함수는 물론 자구도 추가하기 어려움
- 구조체 감추기:
BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
- 임시파일 생성을 위해 dir path 얻음
- \(\Rightarrow\)
ctxt
객체가 최종 목적인 임시파일을 생성하도록 명령 ctxt
: 내부구조 드러내지 않음, 몰라야 하는 내부 객체 탐색필요X
자료 전달 객체
- DTO:
- 공개변수만 있고 함수는 미존재
- 데이터베이스와 통신하거나 소켓에서 받은 메시지의 구문을 분석할 때 유용
- DB에서 저장된 (가공X) 정보를 Application 코드에서 사용할 객체로 변환하는 일련의 단계에서 가장 처음으로 사용되는 구조체
Bean 구조: (보다 일반적인 형태) 비공개 변수와 getter, setter가 있는 클래스
- 활성 레코드: 공개, 비공개 변수, getter, setter, serach 함수
결론
객체 | 자료구조 |
---|---|
동작 공개, 자료 숨김 | 별다른 동작 없이 자료를 노출 |
기존 동작 변경안하고 객체 타입 추가 쉬움 | 기존 자구에 새 동작 추가 쉬움 |
기존 객체에 새 동작 추가 어려움 | 기존 함수에 새 자료구조 추가 어려움 |
- 새로운 자구 타입 추가 유연성 \(\rightarrow\) 객체
- 새로운 동작 추가하는 유연성 \(\rightarrow\) 자구 + 절차적 코드