티스토리 뷰

반응형


| 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)






반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday