본문 바로가기
카테고리 없음

[클린코드] 디미터 법칙

by juniKang 2022. 11. 28.

출처: 클린코드 / 로버트C마틴

 

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

 

클래스 C의 메서드 f는 다음과 같은 객체의 메서드만 호출해야 한다.

 

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

위 객체에서 허용된 메서드가 반환하는 객체의 메서드는 호출하면 안된다.

 

다음 코드는 이를 위반한다.

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

위와 같은 코드를 기차 충돌(train wreck)이라 부른다. 이런 코드는 피하는게 좋다.

 

ctxt가 객체라면 뭔가를 하라고 말해야지 속을 드러내라고 말하면 안 된다. outputDir이 왜 필요할까? 절대 경로를 얻어서 어디에 쓰려고? 다음은 같은 모듈에서 가져온 코드다.

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

추상화수준을 뒤섞어 놓아 다소 불편하다. 어쨋거나, 위 코드를 유심히 보면, 디렉터리의 절대 경로를 얻으려는 이유가 임시 파일을 생성하기 위한 목적이라는 사실이 드러난다.

 

그렇다면 ctxt 객체에 임시 파일을 생성하라고 시키면 어떨까?

BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);

객체에 맡기기에 적당한 임무로 보인다. ctxt는 내부 구조를 드러내지 않으며, 모듈에서 해당 함수는 자신이 몰라야 하는 여러 객체를 탐색할 필요가 없다. 따라서 디미터 법칙을 위반하지 않는다.

댓글