[클린 코드 (Clean Code)] Ch6. 객체와 자료 구조

2021. 1. 24. 19:0004. Archives/독서

728x90
반응형

Ch6. 객체와 자료 구조

  • 이 챕터는 전체적으로 잘 이해가 되지 않음 ㅜ

자료 추상화

  • 클래스 혹은 함수 내의 변수와 같은 자료를 세세하게 공개하기 보다는 추상적인 개념으로 표현하는 편이 좋다.

  • 인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다.

  • 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다.

  • 아무 생각 없이 조회/설정 함수를 추가하는 방법이 가장 나쁘다.

      // 구체적인 Vehicle 클래스
      public interface Vehicle {
          double getFuelTankCapacityInGallons();
          double getGallonsOfGasoline();
      }
    
      // 추상적인 Vehicle 클래스
      public interface Vehicle {
          double getPercentFuelRemaining();
      }

자료/객체 비대칭

  • 복잡한 시스템을 짜다 보면 새로운 함수가 아니라 새로운 자료 타입이 필요한 경우가 생긴다.
  • 이때는 클래스와 객체 지향 기법이 가장 적합하다.
  • 반면, 새로운 자료 타입이 아니라 새로운 함수가 필요한 경우도 생ㄱ니다.
  • 이때는 절차적인 코드와 자료 구조가 좀 더 적합하다.

분별 있는 프로그래머는 모든 것이 객체라는 생각이 미신임을 잘 안다.
때로는 단순한 자료 구조와 절차적인 코드가 가장 적합한 상황도 있다.

디미터 법칙

  • 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙

  • 객체는 자료를 숨기고 함수를 공개한다.

    • 즉, 객체는 조회 함수로 내부 구조를 공개하면 안 된다.
    • 더 정확히 표현하면, 디미터 법칙은 "클래스 C의 메서드 f는 다음과 같은 객체의 메서드만 호출해야 한다" 고 주장한다.
      • 클래스 C
      • f가 생성한 객체
      • f 인수로 넘어온 객체
      • C 인스턴스 변수에 저장된 객체
  • 디미터 법칙을 어기는 듯한 코드 예시

      final String outputDir = ctxt.getOptions().geetScratchDir().getAbsolutePath();
    • getOptions() 함수가 반환하는 객체의 getScratchDir() 함수를 호출한 후
    • getScratchDir() 함수가 반환하는 객체의 getAbsolutePath() 함수를 호출하기 때문
  • 기차 충돌

    • 위와 같은 코드를 기차 충돌이라 부른다.

      • 여러 객차가 한 줄로 이어진 기차처럼 보이기 때문

      • 조잡하다 여겨지는 방식이기 때문에 피하는 편이 좋음.

      • 수정해보면 아래와 같다.

          Options opts = ctxt.getOptions();
          File scratchDir = opts.getScratchDir();
          final String outputDir = scratchDir.getAbsolutePath();
      • 하지만 위 코드가 디미터 법칙을 위반하는지 여부는 각 변수가 객체인지 자료 구조인지에 따라 달라진다.

        • 객체라면 내부 구조를 숨겨야하므로 위반
        • 자료 구조라면 당연히 내부 구조를 노출하므로 디미터 법칙이 적용되지 않음
      • 그런데 위 예제는 조회 함수를 이용하기 때문에 혼란이 생김

      • 혼란이 없기 위한 코드는 아래와 같다.

          final String outputDir = ctxt.options.scratchDir.absolutePath;
        • 자료 구조는 무조건 함수 없이 공개 변수만 포함하고 객체는 비공개 변수와 공개 함수를 포함한다면, 문제는 훨씬 간단해진다.
    • 잡종 구조

      • 이런 혼란에 의해 절반은 객체, 절반은 자료 구조인 잡종 구조가 나온다.
      • 이는 새로운 함수는 물론인고 새로운 자료 구조도 추가하기 어렵다.
    • 구조체 감추기

      • 결국 위의 기능은 임시 디렉터리의 절대 경로를 얻기 위한 방법들의 나열이다.

        • 그 이유는 임시 파일을 생성하기 위해서이다.
      • 따라서 차라리 임시 파일을 생성하라고 시키는게 더 상위 개념으로 볼 수 있다.

          BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
        • 이는 ctxt의 내부 구조를 드러내지 않음
        • 모듈에서 해당 함수는 자신이 몰라야 하는 여러 객체를 탐색할 필요가 없음
        • → 디미터 법칙을 위반하지 않음

자료 전달 객체

  • 자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스다.
    • 이런 자료 구조체를 떄로는 자료 전달 객체(Data Transfer Object, DTO)라고 함
  • 데이터베이스와 통신하거나 소켓에서 받은 메시지의 구문을 분석할 때 유용
    • 흔히 데이터베이스에 저장된 가공되지 않은 정보를 애플리케이션 코드에서 사용할 객체로 변환하는 일련의 단계에서 가장 처음으로 사용하는 구조체
반응형