바위타는 두루미

[CleanCode]6.객체와 자료구조 본문

book

[CleanCode]6.객체와 자료구조

DoRoMii 2022. 3. 2. 01:19
728x90

단순히 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
Comments