클린코드 챌린지 #6

dev_suyeon·2022년 3월 1일
0

CleanCode

목록 보기
7/11

오늘 읽은 범위

6장. 객체와 자료 구조

책에서 기억하고 싶은 내용

  • 자료 추상화

    • 변수를 private으로 선언하고 각 값마다 조회(get)함수와 설정(set)함수를 제공하지 않기
    • 자료는 추상적인 개념으로 표현하기
  • 자료/객체 비대칭

    • 절차적인 코드
      기존 자료 구조를 변경하지 않으면서 새함수 추가 쉬움
      새로운 자료 구조 추가하기 어려움
      새로운 함수가 필요할때 적합
    • 객체 지향 코드
      기존 함수를 변경하지 않으면서 새 클라스 추가하기 쉬움
      새로운 함수를 추가하기 어려움
      새로운 자료 타입이 필요할때 적합
  • 디미터 법칙
    휴리스틱 : 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙
    객체는 조회 함수로 내부 구조를 공개하면 안됨

    • 기차 충돌
      여러 객차가 한 줄로 이어진 기차처럼 보이는 것
      => 객체에서 허용된 메서드가 반환하는 객체의 메서드는 호출하면 안됨
      예시)

      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) 구조

    • 활성 레코드
      DTO의 특수한 형태
      공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료 구조지만, 대개 save나 find와 같은 탐색 함수 제공
      데이터베이스 테이블이나 다른 소스에서 자료를 직접 변환한 결과
      활성 레코드는 자료구조로 취급하기
      비지니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성
      (내부 자료란 활성 레코드의 인스턴스)

오늘 읽은 소감

나는 javascript를 주로 사용하다보니 클래스, 인터페이스 등을 사용 안한지 오래되었다. 이번 챕터를 읽으면서 예제를 더 주의깊게 보고 이해했어야 했다. 지난날 java를 사용하며 spring 프로젝트를 진행했을때 나는 잡종코드를 마구마구 작성했었다는 것을 알게되었다. 역시 클리코드는 교과서 같다. javascript에서도 클래스를 사용하니 이번 챕터에서 배운 디미터 법칙을 적용하여 구현해봐야겠다.

궁금한 내용 또는 잘 이해되지 않는 내용

디미터 법칙 - 휴리스틱

profile
Back-End Developer

0개의 댓글