출처: 클린코드 / 로버트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는 내부 구조를 드러내지 않으며, 모듈에서 해당 함수는 자신이 몰라야 하는 여러 객체를 탐색할 필요가 없다. 따라서 디미터 법칙을 위반하지 않는다.
댓글