📖 book/💛 Clean Code
6장 객체와 자료구조
인피니
2023. 1. 15. 17:39
자료 추상화
변수 사이에 함수라는 계층을 넣는다고 구현이 감춰지는 것이 아니다.
-> 구현을 감추기 위해서는 추상화가 필요하다
-> 즉, 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료를 조작할 수 있어야 진정한 의미의 클래스이다.
-> 하지만, 인터페이스나 조회/설정 함수만으로 추상화가 이뤄지는 것은 아니고 개발자는 객체가 포함하는 자료를 표현할 좋은 방법을 선택해야 한다.
public interface Vehicle { //조회함수 제공한다고 추상화가 되는 것은 아닌.. 예
double getFuelTankCapacityInCallons();
double getGallonsOfGasoline();
}
public interface Vehicle { // 좋은 추상화의 예
double getPercentFuelRemaining();
}
자료/객체 비대칭
객체: 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개
자료구조: 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.
자료구조를 사용하는 절차적인 코드는 기존 자료 구조를 변경하지 않고 새로운 함수를 추가하기 쉽다.
why? 추상화 하지 않기 때문에 변경하고 싶은 자료구조에만 함수를 추가하면 된다.
객체지향 코드는 기존함수를 변경하지 않으면서 새 클레스를 추가하기 쉽다.
why? 추상화 되어있기 때문에 새로운 클래스를 추가하기 쉽다.
즉, 객체지향에서 어려운 변경은 절차적인 코드에서 쉽고 절차적인 코드에서 어려운 변경은 객체지향에서 쉽다.
따라서, 복잡한 시스템을 구현할 때 새로운 함수가 아니라 새로운 자료구조가 필요한 타입이라면 클래스와 객체지향 기법이 적합하며, 새로운 함수가 필요한 경우에는 절차적인 코드와 자료구조가 적합하다.
디미터 법칙
모듈은 자신이 조작하는 객체의 속사성을 몰라야 한다는 법칙
클레스 c 의 메서드 f는 다음과 같은 객체의 메서드만 호출해야 한다.
* 클레스 C
* f가 생성한 객체
* f인수로 넘어온 객체
* C 인스턴스 변수에 저장된 객체
자료전달 객체
DTO 라고도 불리는 자료전달 객체는 공개 변수만 있고 함수가 없는 클래스 중 데이터베이스에 저장된 가공되지 않은 정보를 애플리케이션 코드에서 사용할 객체로 변환하는 과정에서 가장 처음으로 사용되는 구조체이다.
DTO의 일반적인 형태는 bean 구조이며, bean 은 비공개변수를 조회/설정 함수로 조작한다.
활성 레코드
DTO 의 특수한 형태
공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료구조 + save나 find 와 같은 탐색함수도 제공
(* 주의할 점은 활성 레코드에 비즈니스 규칙 메서드를 추가해 활성 레코드라는 자료구조를 객체로 취급하지 않도록 한다.)