6장. 객체와 자료구조

공부하는 감자·2024년 2월 9일
0

클린코드

목록 보기
6/18

이 글에서 분류한 기준은 책의 내용을 바탕으로 주관적인 견해로 재정리해본 것입니다.

들어가기 전에

변수와 조회/설정 함수

  • 변수를 비공개(private)으로 정의하는 이유는 남들이 변수에 의존하지 않게 만들고 싶어서 이다.
  • 그렇지만 조회(get) 함수와 설정(set) 함수를 제공한다면, 구현을 외부로 노출하는 셈이다.

객체와 자료구조

  • 객체는 동작을 공개하고 자료를 숨긴다.
    • 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기 쉽다.
    • 기존 객체에 새 동작을 추가하기 어렵다.
  • 자료 구조는 별다른 동작 없이 자료를 노출한다
    • 기존 자료 구조에 새 동작을 추가하기 쉽다.
    • 기존 함수에 새 자료구조를 추가하기 어렵다.

적합한 상황

  • 어떤 시스템을 구현할 때, 새로운 자료 타입을 추가하는 유연성이 필요하면 객체가 더 적합하다.
  • 새로운 동작을 추가하는 유연성이 필요하면 자료 구조와 절차적인 코드가 더 적합하다.

클린 코드

자료 추상화

  • 구현을 감추려면 추상화가 필요하다.
  • 조회 함수와 설정 함수로 변수를 다루는 것이 아닌, 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 한다.
    • 진정한 의미의 클래스
  • 즉, 자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다.

자료/객체 비대칭

  • 객체와 자료구조는 근본적으로 양분된다.
    • 객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다.
    • 자료 구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.
  • 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.
    • 절차적인 코드에서는 어렵다.
  • 객체 지향 코드는 새로운 함수를 추가하기 어렵다.
    • 절차적인 코드에서는 쉽다.
  • 때로는 단순한 자료 구조와 절차적인 코드가 가장 적합한 상황도 있다.

디미터 법칙

디미터 법칙은 잘 알려진 휴리스틱으로, 모듈은 자식이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다.

  • 객체는 조회 함수로 내부 구조를 공개하면 안 된다.
  • 클래스 C의 메서드 f는 다음과 같은 객체의 메서드만 호출해야 한다.
    • 클래스 C
    • f가 생성한 객체
    • f 인수로 넘어온 객체
    • C 인스턴스 변수에 저장된 객체
    • 하지만 위 객체에서 허용된 메서드가 반환하는 객체의 메서드는 호출하면 안 된다.

기차 충돌(train wreck)

여러 객체가 한 줄로 이어진 기차처럼 보이는 코드를 말한다.

final Strig outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

일반적으로 조잡하다 여겨지는 방식이므로, 다음과 같이 나누어 피하는 편이 좋다.

  • ctxt , Options, ScratchDir 이 객체인지 자료 구조인지에 따라 디미터 법칙을 위반하는지 여부가 달라진다.
    • 객체라면 내부 구조를 숨겨야 하므로 디미터 법칙을 위반한다.
    • 자료 구조라면 내부 구조를 노출하므로 디미터 법칙이 적용되지 않는다.
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final Strig outputDir = scratchDir.getAbsolutePath();

위 코드는 조회 함수를 사용하는 바람에 혼란을 일으킨다. 따라서, 다음과 같이 구현한다면 디미터 법칙을 거론할 필요가 없어진다.

final Strig outputDir = ctxt.options.scratchDir.getAbsolutePath();
  • 자료 구조는 무조건 함수 없이 공개 변수만 포함하고 객체는 비공개 변수와 공개 함수를 포함한다면 문제는 훨씬 간단하다.
  • 하지만, 단순한 자료 구조에도 조회 함수와 설정 함수를 정의하라 요구하는 프레임워크와 표준(ex. bean)이 존재한다.

잡종 구조

  • 절반은 객체, 절반은 자료 구조인 것을 잡종 구조라고 부른다.
  • 이는 단점만 모아놓은 구조이므로 되도록 피해야 한다.

구조체 감추기

객체에게 ‘뭔가를 하라’고 말해야 한다.

  • ctxt , Options, ScratchDir 이 객체일 경우, 다음과 같이 사용할 수 있다.
    • ctxt 객체에 임시 파일을 생성하라고 시킨다.
    • 디미터 법칙을 위반하지 않는다.
BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);

자료 전달 객체

DTO와 Bean

  • 자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스다.
    • 이런 자료 구조체를 때로는 자료 전달 객체(Data Transfer Object, DTO)라 한다.
  • 흔히 DTO는 데이터베이스에 저장된 가공되지 않은 정보를 애플리케이션 코드에서 사용할 객체로 변환하는 일련의 단계에서 가장 처음으로 사용하는 구조체다.
  • 좀 더 일반적인 형태는 ‘bean’ 구조이다.
    • 비공개(private) 변수를 조회/설정 함술 조작한다.
    • 일종의 사이비 캡슐화로, 일부 OO순수주의자만 만족시키고 별다른 이익을 제공하지 않는다.

활성 레코드

  • 활성 레코드는 DTO의 특수한 형태다.
  • 공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료 구조이다.
    • 대개 save나 find와 같은 탐색 함수도 제공한다.
  • 활성 레코드는 데이터베이스 테이블이나 다른 소스에서 자료를 직접 변환한 결과다.
  • 활성 레코드는 자료 구조로 취급한다.
    • 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성해야 한다.
    • 여기서 내부 자료는 활성 레코드의 인스턴스일 가능성이 높다.

Reference

참고 서적

📔 Clean Code

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글