1 minute read

클린 코드

애자일 소프트웨어 장인 정신

저자: 로버트 C. 마틴

6. 객체와 자료 구조

page 151

자료 추상화

자료를 세세하게 공개하기보다는 추상적은 개념으로 표현하는 편이 좋다.
개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다.

자료/객체 비대칭

객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다. 자료 구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.

객체 지향 코드에서 어려운 변경은 절차적인 코드에서 쉬우며, 절차적인 코드에서 어려운 변경은 객체 지향 코드에서 쉽다.

디미터 법칙

모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다. 좀 더 정확히 표현하자면, “클래스 C의 메서드 f는 다음과 같은 객체의 메서드만 호출해야 한다”

  • 클래스 C
  • f가 생성한 객체
  • f인수로 넘어온 객체
  • C 인스턴스 변수에 저장된 객체

낯선 사람은 경계하고 친구랑만 놀라

기차 충돌 train wreck

여러 객차가 한 줄로 이어진 기차처럼 보이기 때문에 기차 충돌이라 부른다.

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

위 코드는 다음과 같이 나누는 편이 좋다.

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

위 예제가 디미터 법칙을 위반하는지 여부는 ctxt, Options, ScratchDir이 객체인지 아니면 자료구조인지에 달렸다. 객체라면 내부 구조를 숨겨야 하므로 위반한다. 자료 구조라면 디미터 법칙이 적용되지 않는다.

코드를 다음과 같이 구현했다면 디미터 법칙을 거론할 필요가 없어진다.

final String outputDir = ctxt.options.scratchDir.absolutePath;

잡종 구조

절반은 객체, 절반은 자료 구조인 잡종 구조가 나온다.

구조체 감추기

자료 전달 객체

자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스다. 이런 자료 구조체를 때로는 자료 전달 객체Data Transfer Object, DTO라 한다.

활성 레코드

활성 레코드는 DTO의 특수한 형태다.

결론

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

시스템을 구현할 때, 새로운 자료 타입을 추가하는 유연성이 필요하면 객체가 더 적합하다. 다른 경우로 새로운 동작을 추가하는 유연성이 필요하면 자료 구조와 절차적인 코드가 더 적합하다. 우수한 소프트웨어 개발자는 편견 없이 이 사실을 이해해 직면한 문제에 최적인 해결책을 선택한다.