[클린 코드 (Clean Code)] Ch6. 객체와 자료 구조
2021. 1. 24. 19:00ㆍ04. Archives/독서
728x90
반응형
Ch6. 객체와 자료 구조
- 이 챕터는 전체적으로 잘 이해가 되지 않음 ㅜ
자료 추상화
클래스 혹은 함수 내의 변수와 같은 자료를 세세하게 공개하기 보다는 추상적인 개념으로 표현하는 편이 좋다.
인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다.
개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다.
아무 생각 없이 조회/설정 함수를 추가하는 방법이 가장 나쁘다.
// 구체적인 Vehicle 클래스 public interface Vehicle { double getFuelTankCapacityInGallons(); double getGallonsOfGasoline(); } // 추상적인 Vehicle 클래스 public interface Vehicle { double getPercentFuelRemaining(); }
자료/객체 비대칭
- 복잡한 시스템을 짜다 보면 새로운 함수가 아니라 새로운 자료 타입이 필요한 경우가 생긴다.
- 이때는 클래스와 객체 지향 기법이 가장 적합하다.
- 반면, 새로운 자료 타입이 아니라 새로운 함수가 필요한 경우도 생ㄱ니다.
- 이때는 절차적인 코드와 자료 구조가 좀 더 적합하다.
분별 있는 프로그래머는 모든 것이 객체라는 생각이 미신임을 잘 안다.
때로는 단순한 자료 구조와 절차적인 코드가 가장 적합한 상황도 있다.
디미터 법칙
모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙
객체는 자료를 숨기고 함수를 공개한다.
- 즉, 객체는 조회 함수로 내부 구조를 공개하면 안 된다.
- 더 정확히 표현하면, 디미터 법칙은 "클래스 C의 메서드 f는 다음과 같은 객체의 메서드만 호출해야 한다" 고 주장한다.
- 클래스 C
- f가 생성한 객체
- f 인수로 넘어온 객체
- C 인스턴스 변수에 저장된 객체
디미터 법칙을 어기는 듯한 코드 예시
final String outputDir = ctxt.getOptions().geetScratchDir().getAbsolutePath();
- getOptions() 함수가 반환하는 객체의 getScratchDir() 함수를 호출한 후
- getScratchDir() 함수가 반환하는 객체의 getAbsolutePath() 함수를 호출하기 때문
기차 충돌
위와 같은 코드를 기차 충돌이라 부른다.
여러 객차가 한 줄로 이어진 기차처럼 보이기 때문
조잡하다 여겨지는 방식이기 때문에 피하는 편이 좋음.
수정해보면 아래와 같다.
Options opts = ctxt.getOptions(); File scratchDir = opts.getScratchDir(); final String outputDir = scratchDir.getAbsolutePath();
하지만 위 코드가 디미터 법칙을 위반하는지 여부는 각 변수가 객체인지 자료 구조인지에 따라 달라진다.
- 객체라면 내부 구조를 숨겨야하므로 위반
- 자료 구조라면 당연히 내부 구조를 노출하므로 디미터 법칙이 적용되지 않음
그런데 위 예제는 조회 함수를 이용하기 때문에 혼란이 생김
혼란이 없기 위한 코드는 아래와 같다.
final String outputDir = ctxt.options.scratchDir.absolutePath;
- 자료 구조는 무조건 함수 없이 공개 변수만 포함하고 객체는 비공개 변수와 공개 함수를 포함한다면, 문제는 훨씬 간단해진다.
잡종 구조
- 이런 혼란에 의해 절반은 객체, 절반은 자료 구조인 잡종 구조가 나온다.
- 이는 새로운 함수는 물론인고 새로운 자료 구조도 추가하기 어렵다.
구조체 감추기
결국 위의 기능은 임시 디렉터리의 절대 경로를 얻기 위한 방법들의 나열이다.
- 그 이유는 임시 파일을 생성하기 위해서이다.
따라서 차라리 임시 파일을 생성하라고 시키는게 더 상위 개념으로 볼 수 있다.
BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
- 이는 ctxt의 내부 구조를 드러내지 않음
- 모듈에서 해당 함수는 자신이 몰라야 하는 여러 객체를 탐색할 필요가 없음
- → 디미터 법칙을 위반하지 않음
자료 전달 객체
- 자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스다.
- 이런 자료 구조체를 떄로는 자료 전달 객체(Data Transfer Object, DTO)라고 함
- 데이터베이스와 통신하거나 소켓에서 받은 메시지의 구문을 분석할 때 유용
- 흔히 데이터베이스에 저장된 가공되지 않은 정보를 애플리케이션 코드에서 사용할 객체로 변환하는 일련의 단계에서 가장 처음으로 사용하는 구조체
반응형
'04. Archives > 독서' 카테고리의 다른 글
[도커/Docker] Ch1. 도커란? (0) | 2021.04.01 |
---|---|
[도커/Docker] "시작하세요! 도커/쿠버네티스" 정리 (0) | 2021.03.31 |
[클린 코드 (Clean Code)] Ch5. 형식 맞추기 (0) | 2021.01.23 |
[클린 코드 (Clean Code)] Ch4. 주석 (0) | 2021.01.22 |
[클린 코드 (Clean Code)] Ch3. 함수 (0) | 2021.01.21 |