1. 객체와 자료의 비대칭
객체는 추상화 뒤로 자료를 숨긴채 자료를 다루는 함수만 공개합니다. 자료구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않습니다. 이를 보면 객체와 자료가 상반된다는 것을 알 수 있습니다.
절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽습니다. 반면에, 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽습니다.
반대로, 절차적인 코드는 새로운 자료구조를 추가하기 어렵습니다. 그러려면 모든 함수를 고쳐야하기 때문입니다. 객체 지향 코드는 새로운 함수를 추가하기 어렵습니다. 그러려면 모든 클래스를 고쳐야합니다.
복잡한 시스템을 짜다 보면 새로운 함수가 아니라 새로운 자료 타입이 필요한 경우가 생기는데 이때는 클래스와 객체 지향 방법이 적합합니다. 반대로 새로운 자료 타입이 아니라 새로운 함수가 필요한 경우는 절차적인 코드와 자료구조가 좀더 적합합니다.
2. 디미터 법칙
디미터 법칙은 잘 알려진 휴리스틱으로 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙입니다. 객체는 자료를 숨기고 함수를 공개합니다. 다음은 디미터 법칙을 어기는 예시입니다.
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
ctxt 객체가 options를 갖고, options가 scratchDir을 갖고, scratchDir이 다시 absolutePath를 갖는다는 것을 알 수 있습니다. 이는 객체의 내부 구조를 알 수 있기 때문에 디미터 법칙을 어긴 것 입니다. 또한 위와 같은 코드를 기차 충돌이라고 합니다. 여러 객체가 한줄로 이어진 기차처럼 보이기 때문입니다. 일반적으로 조잡하다 여기는 방식이므로 피하는게 좋습니다.
String outFile = outputDir + "/" + className.replace('.', '/') + ".class";
FileOutputStream fout = new FileOutputStream(outFile);
BufferedOutputStream bos = new BufferedOutputStream(fout);
절대경로를 왜얻는지를 보면 임시 파일을 생성하는데 사용한다는 것을 알 수 있습니다. 그렇다면 ctxt 객체에 임시 파일을 생성하는 함수를 만들면 됩니다.
BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
ctxt는 내부 구조를 드러내지 않으며, 모듈에서 해당 함수는 자신이 몰라야 하는 여러 객체를 탐색할 필요가 없습니다. 따라서 디미터 법칙을 위반하지 않습니다.
3. 잡종 구조
절반은 객체, 절반은 자료 구조인 잡종 구조가 나올 수 있습니다. 잡종 구조는 중요한 기능을 수행하는 함수도 있고, 공개변수나 공개조회/설정 함수도 있습니다. 이런 잡종 구조는 새로운 함수는 물론이고 새로운 자료 구조 추가도 어렵습니다. 이러한 잡종 구조는 되도록 피하는 편이 좋습니다.
4. 결론
어떤 시스템을 구현할 때, 새로운 자료 타입을 추가하는 유연성이 필요하면 객체가 더 적합합니다. 다른 경우로 새로운 동작을 추가하는 유연성이 필요하면 자료구조와 절차적인 코드가 더 적합합니다. 우수한 소프트웨어 개발자는 편견 없이 이 사실을 이해하고 선택해야합니다.
'개발방법론' 카테고리의 다른 글
[Clean Code] 형식 맞추기 (0) | 2020.04.18 |
---|---|
[Clean Code] 주석 작성 방법 (0) | 2020.04.14 |
[Clean Code] 함수 작성 (0) | 2020.04.06 |
[Clean Code] 깨끗한 코드란(클린코드)? (0) | 2020.04.02 |
객체지향프로그래밍(OOP) 설계 원칙 SOLID (0) | 2020.03.30 |