객체와 자료 구조

디미터 법칙

책너두 5기 14일차

로버트 C. 마틴의 클린코드 p.123 ~ p.131

내용 정리

6. 객체와 자료 구조

디미터 법칙

모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙. 즉, 객체는 조회 함수로 내부 구조를 공개하면 안된다.

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

위 코드는 디미터 법칙을 어겼다. 각 함수가 반환하는 객체의 함수를 호출하기 때문이다.

기차 충돌

위와 같은 코드를 기차 충돌(train wreck)으로 부른다. 길게 이어진 기차같은 이 코드는 다음과 같이 수정할 수 있다.

1
2
3
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratcgDir();
final String outputDir = scratchDir.getAbsolutePath();

이 코드는 ctxt, Options, ScratchDir이 객체라면 디미터 법칙 위반이고, 자료 구조라면 아니다. 더 확실히 하기 위해 다음과 같이 수정한다.

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

자료 구조는 무조건 함수 없이 공개 변수만 포함하고 객체는 비공개 변수와 공개 함수를 포함하면 된다.

잡종 구조

절반은 객체, 절반은 자료구조인 경우..? => 양쪽의 단점만 모아놓은 최악의 결과이니 되도록 피하자.

구조체 감추기

위의 ctxt,options,scratchDir 이 객체라면? 내부 구조를 감춰야 한다.

ctxt.getAbsolutePathOfScrachDirectioryOption();

ctx.getScratchDirectoryOption().getAbsolutePath()

이 두 코드는 절대경로를 왜 얻으려 할까? 다음 코드를 통해 알 수 있다!

1
2
3
String outFile = outputDir + "/" + className.replace('.','/') + ".class";
FileOutputStream fout = new FileOutputStream(outFile);
BufferedOutputStream bos = new BufferedOutputStream(fout);

임시 파일 생성을 위한 코드였다. 객체에겐 뭔가를 하라고 해야지, 속을 드러내도록 하면 안된다. 따라서 임시파일을 생성하라고 시켜야한다.

BufferedOutpuStream bos = ctxt.createScratchFileStream(classFileName);

자료 전달 객체

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

활성 레코드

DTO의 특수한 형태. 데이터베이스 테이블이나 다른 소스에서 자료를 직접 변환한 결과. 공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료구조. 이런 자료구조를 객체로 취급하면 잡종 구조가 생성되니 자료 구조로만 취급한해야 한다.

결론

객체 : 동작을 공개하고 자료를 숨긴다. => 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기 쉽지만, 기존 객체에 새 동작을 추가하기 어렵다.

자료구조 : 별다른 동작 없이 자료를 노출한다, => 새 동작 추가 쉽지만, 기존 함수에 새 자료 구조를 추가하기 어렵다.

7. 오류 처리

상당수 코드 기반은 전적으로 오류 처리 코드에 좌우된다. 여기저기 흩어진 오류 처리 코드 때문에 실제 코드가 하는 일을 파악하기 어렵기 때문이다. 깨끗한 코드를 위해 오류 처리는 중요하다.

오류 코드보다 예외를 사용하라

오류 코드는 함수를 호출한 즉시 오류를 확인해야 하기 때문에 호출자 코드가 복잡해 진다. 뒤섞이지 않도록 디바이스를 종료하는 알고리즘과 오류를 처리하는 알고리즘을 분리하여 독립적으로 볼 수 있도록 해야한다.

읽고 나서

아직 객체에 대한 개념이 많이 부족해서 많이 와닫지 않는다.. 조금 더 배경지식에 대해 공부를 해야 이해할 수 있는 부분인 것 같다.