티스토리 뷰
| 6. 객체와 자료 구조
--
|| 자료 추상화
-
- 자료를 세세하게 공개하기 보다는 추상적인 개념으로 표현하는 편이 좋다.
- 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다.
> Ex 1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // 구체적인 Point Class 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 setPolar(double r, double theta); } | cs |
> Ex 2.
1 2 3 4 5 6 7 8 9 | // 구체적인 Vehicle Class public class Point { double getFuelTankCapacityInGallons(); } // 추상적인 Vehicle Class public interface Vehicle { double getPercentFuelRemaining(); } | cs |
|| 자료/객체 비대칭
> (자료 구조를 사용하는) 절차적인 코드
- 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다.
- 반면, 새로운 자료 구조를 추가하기 어렵다. 모든 함수를 고쳐야 한다..
> (interface 사용) 객체 지향 코드
- 새로운 함수를 추가하기 어렵다. 모든 클래스를 고쳐야 한다..
- 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.
**
* 새로운 자료 타입이 필요한 경우 => 클래스와 객체 지향 기법
* 새로운 함수가 필요한 경우 => 절차적인 코드와 자료 구조
|| 디미터 법칙
-
- 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다.
- 하지만, 메서드가 반환하는 개체의 메소드는 호출하면 안 된다.
Ex. final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
* 위 코드는 기차 충동(train wreck)라고 불린다.. 조잡하다 여겨지는 방식이므로 피하자.
대신 아래와 같이 나누는 편이 좋다.
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
- 자료 구조는 무조건 함수 없이 공개 변수만 포함하고
객체는 비공개 변수와 공개 함수를 포함하면 간단해진다.
(객체의 메서드는 뭔가 하라고 말해야지 속을 드러내라고 말하면 안 된다.)
|| 자료 전달 객체
-
- 자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스
- 자료 전달 객체(Data Trasfer Object, DTO)라 하기도 한다.
> 활성 레코드
- DTO의 특수한 형태
- 공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료 구조지만,
대개 save나 find 같은 탐색 함수도 제공
- DB Table이나 다른 소스에서 자료를 직접 변환한 결과
* 활성 레코드는 자료 구조로 취급하고 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성하자.
**
> 객체
- 동작을 공개하고 자료를 숨김
- 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기 쉬움
- 반면, 기존 객체에 새 동작을 추가하기 어려움
> 자료 구조
- 별다른 동작 없이 자료 노출
- 기존 자료 구조에 새 동작 추가가 쉬움
- 반면, 기존 함수에 새 자료 구조를 추가하기 어려움
* 새로운 자료 타입을 추가하는 유연성이 필요하면 객체가 더 적합
* 새로운 동작을 추가하는 유연성이 필요하면 자료 구조와 절차적 코드가 더 적합
출처 : 클린 코드 (Robert C. Martin)
'Books' 카테고리의 다른 글
[클린 코드: Clean Code] 8. 경계(외부 API) (0) | 2021.01.16 |
---|---|
[클린 코드: Clean Code] 7. 오류 처리 (0) | 2021.01.13 |
[클린 코드: Clean Code] 5. 형식 맞추기(Formatting) (0) | 2021.01.11 |
[클린 코드: Clean Code] 4. 주석(comment) (0) | 2021.01.11 |
[클린 코드: Clean Code] 3. 함수(Function) (0) | 2021.01.11 |