바위타는 두루미
[CleanCode]6.객체와 자료구조 본문
단순히 get, set함수를 만들어 변수를 다룬다고 class가 아니다.
그보다는 추상 인터페이스를 이용해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 class이다.
객체 vs 자료구조
- 자료구조를 사용코드 : 자료구조 변경없이 새 함수를 추가하기 쉽다. | 함수 변경없이 새로운 자료구조 추가하기 어렵다.
- 객체지향 코드 : 함수 변경없이 class 추가하기 쉽다. | class변경없이 새로운 함수 추가하기 어렵다.
- 분별있는 프로그래머는 모든 것이 객체라는 생각이 미신임을 잘 안다. 때로는 단순한 자료구조와 절차적인 코드가 적합한 상황이 있다.
디미터 법칙
-> 모듈은 자신이 조작하는 객체의 속사정을 몰라야한다.
클레스 C의 메서드 f는 다음과 같은 객체의 메서드만 호출해야한다.
( Class C, f가 생성한 객체, f인수로 들어온 객체, C인스턴스 변수에 저장된 객체 )
ex) final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath() => (X)
=> 위와 같은 코드를 기차충돌이라고 부른다. 피하는편이 좋다.
Option opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
=> 이렇게 나누는 편이 좋다.
하지만 ctxt, Options, ScratchDir이 객체라면 내부구조를 숨겨야 하므로 디미터 규칙을 위반한다.
자료구조라면 디미터 법칙이 적용되지 않는다.
조회함수를 사용하는 바람에 혼란을 일으킨다.
fianl String outputDir = ctxt.options.scratchDir.absolutePath; 이렇게 구현되었다면 디미터 법칙을 거론할 필요가 없다.
- 잡종 구조
반은 객체, 반은 자료구조인 잡종 구조가 나온다. 이러한 잡종구조는 함수는 물론 새로운 자료구조도 추가하기 어렵다. 따라서 피해야한다. - 구조체 감추기
만약 ctxt, options, scratchDir이 모두 객체라면 outputDir 경로는 어떻게 얻어야 할까
ctxt가 객체라면 뭔가를 하라고 말해야지, 속을 드러내면 안된다.
ctxt에게 임시 파일을 생성하라고 말하자 ctxt.crateScratchFileStream(classFileName)이런식으로
자료 전달 객체
- 자료구조체 : 공개 변수만 있고 함수가 없는 클레스 => Data Transfer Object (DTO) 라고 하기도 함
- Bean 구조 : 비공개 변수를 조회/설정 함수로 조작한다. => 특별한 이익을 제공하진 않는다.
- 활성 레코드 : 공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있지만, save나 find같은 탐색함수도 제공한다.
활성 레코드에 비즈니스 코드를 추가하는 경우가 있지만, 이는 바람직하지 않음.
'book' 카테고리의 다른 글
[CleanCode]9.단위테스트 (0) | 2022.03.06 |
---|---|
[CleanCode] 5. 형식맞추기 (0) | 2022.03.01 |
[CleanCode]4.주석 (0) | 2022.02.24 |
[CleanCode]3.함수 (0) | 2022.02.22 |
[CleanCode 정리] 2.의미있는 이름 (0) | 2022.02.20 |