Clean Code - 06. 객체와 자료 구조

자료 추상화

추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스다.
자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다.

자료/객체 비대칭

  • 객체
    • 자료를 숨긴 채 자료를 다루는 함수만 공개
    • 조회 함수로 내부 구조를 공개하면 안 됨
  • 자료 구조 -자료를 그대로 공개하며 함수는 제공하지 않음

새로운 자료 타입이 필요한 경우 -> 클래스와 객체 지향 기법이 적합
새로운 함수가 필요한 경우 -> 절차적인 코드와 자료 구조가 적합

디미터 법칙

모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙

  • 클래스 C의 메서드 f는 다음과 같은 객체의 메서드만 호출해야 한다
    • 클래스 C
    • f가 생성한 객체
    • f 인수로 넘어온 객체
    • C 인스턴스 변수에 저장된 객체
  • 위 객체에서 허용된 메서드가 반환하는 객체의 메서드는 호출하면 안 됨

기차 충돌

여러 객체가 한 줄로 이어져 있는 모양으로, 조잡한 방식이기 때문에 피하는 것이 좋음

// bad
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

// good
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();

// ctxt, Options, ScratchDir이
// 객체라면 -> 내부 구조를 숨겨야 하므로 디미터 법칙 위반
// 자료 구조라면 -> 자료 구조는 당연히 내부 구조를 노출하므로 디미터 법칙이 적용되지 않음

잡종 구조

객체와 자료 구조의 단점만 모아둔 구조이기 때문에 피하는 편이 좋다.

구조체 감추기

자료 전달 객체 (Data Transfer Object, DTO)

공개 변수만 있고 함수가 없는 클래스
데이터베이스와 통신하거나 소켓에서 받은 메시지의 구문을 분석할 때 유용하다.

활성 레코드

공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료 구조지만,
대개 sava나 find와 같은 탐색 함수도 제공한다.
활성 레코드는 데이터베이스 테이블이나 다른 소스에서 자료를 직접 반환한 결과다.

내 생각

클린 코드랑 무슨 상관이 있는 장인지 이해가 잘 가지 않는다.
상황에 따라서 객체로 구현할지 자료 구조로 구현할지 고민해보라는 건가..?

태그:

카테고리:

업데이트: