6장. 객체와 자료 구조
자료 추상화
자료/객체 비대칭
디미터 법칙
휴리스틱 : 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙
객체는 조회 함수로 내부 구조를 공개하면 안됨
기차 충돌
여러 객차가 한 줄로 이어진 기차처럼 보이는 것
=> 객체에서 허용된 메서드가 반환하는 객체의 메서드는 호출하면 안됨
예시)
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
변경 후)
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
디미터 법칙 적용 후)
final String outputDir = ctxt.options.scratchDir.absolutePath;
잡종 구조
객체, 절반은 자료 구조인 것
중요한 기능을 수행하는 함수도 있고, 공개 변수나 공개 조회/설정 함수도 있는 것
=> 공개 조회/설정 함수는 비공개 변수를 그대로 노출됨
잡종 구조는 되도록 피할것!
구조체 감추기
내부 구조 드러내지말기
모듈에서 해당 함수는 자신이 몰라야하는 객체 탐색하지 않기
변경 전)
String outFile = outputDir + "/" + className.replace('.', '/') + ".class";
FileOutputStream fout = new FileOutputStream(outFile);
BufferedOutputStream bos = new BufferedOutputStream(fout);
변경 후)
BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
자료 전달 객체
DTO(자료 전달 객체) : 공개 변수만 있고 함수가 없는 클래스
데이터베이스에 저장된 가공되지 않은 정보를 애플리케이션 코드에서 사용할 객체로 변환하는 일련의 단계에서 가장 처음으로 사용하는 구조체
예) 빈(bean) 구조
나는 javascript를 주로 사용하다보니 클래스, 인터페이스 등을 사용 안한지 오래되었다. 이번 챕터를 읽으면서 예제를 더 주의깊게 보고 이해했어야 했다. 지난날 java를 사용하며 spring 프로젝트를 진행했을때 나는 잡종코드를 마구마구 작성했었다는 것을 알게되었다. 역시 클리코드는 교과서 같다. javascript에서도 클래스를 사용하니 이번 챕터에서 배운 디미터 법칙을 적용하여 구현해봐야겠다.
디미터 법칙 - 휴리스틱