클린코드 6장 객체와 자료 구조

kimjunkyung·2021년 8월 5일
0

클린코드

목록 보기
7/15
post-thumbnail

노션에서 정리한 내용을 벨로그로 옮겼기 때문에 노션으로 보면 조금 더 보기 더 편합니다🤗

이동하기 → junnkk's Notion


변수를 비공개(private)로 정의하는 이유 → 남들이 변수에 의존하지 않게 만들고 싶기 때문

그렇다면 왜 프로그래머들은 get, set 함수를 public하게 만들어 비공개 변수를 외부에 노출할까?


자료 추상화

예시) 구체적인 Point 클래스 vs 추상적인 Point 클래스 (p118)

  • 구체적인 Point 클래스

    • 직표좌표계 사용

    • 개별적으로 좌표값을 읽고 설정하게 강제

    • 구현 노출. 변수를 private으로 선언 하더라도 각 값마다 get과 set 함수를 제공한다면 구현을 외부로 노출하는 셈.

  • 추상적인 Point 클래스

    • 자료 구조 이상을 표현

    • 클래스 메서드가 접근 정책을 강제

    • 좌표를 읽을 때 각 값을 개별적으로 읽어야 함.

    • 좌표를 설정할 때는 두 값을 한꺼번에 설정

  • 구현을 감추려면 추상화 필요.

  • 추상 인터페이스를 제공해 사용자가 구현을 모른채 자료의 핵심을 조작할 수 있어야 진정한 클래스


자료/객체 비대칭

  • 객체
    • 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개
    • 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.
    • 새로운 함수를 추가하기 어렵다. → 모든 클래스를 고쳐야 함.
  • 자료 구조
    • 자료를 그대로 공개하며 별다른 함수 제공 X
    • 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다.
    • 새로운 자료 구조를 추가하기 어렵다. → 모든 함수를 고쳐야 한다.

디미터 법칙

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

    → 클래스 C의 메서드 f는 다음과 같은 객체의 메서드만 호출해야 한다

    • 클래스 C

    • f가 생성한 객체

    • f 인수로 넘어온 객체

    • C인스턴스 변수에 저장된 객체

      위 객체에서 허용된 메서드가 반환하는 객체의 메서드는 호출하면 안 된다

  • 기차 충돌

    final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
위와 같은 구조의 코드를 기차 충돌이라고 하고 피하는 것이 좋다
  • 잡종 구조

    : 절반은 객체, 절반은 자료 구조

    ⇒ 사용 X

  • 구조체 감추기

    객체라면 내부 구조를 감춰야 한다.

    예시) p125


자료 전달 객체

  • 자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스. → 지료 전달 객체(DTO)라고도 함

    → 데이터베이스와 통신하거나 소켓에서 받은 메세지의 구문을 분석할 때 유용

    → 데이터베이스에 저장된 가공되지 않은 정보를 애플리케이션 코드에서 사용할 객체로 변환하는 일련의 단계에서 가장 처음으로 사용하는 코드

  • 일반적인 형태는 bean 빈 구조

    → 비공개 변수를 조회/설정 함수로 조작.

    → 일종의 사이비 캡슐화로 별다른 이익 X

  • 활성 레코드

    : DTO의 특수한 형태

    • 공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료 구조지만 대개 save나 find와 같은 탐색 함수도 제공

    • 활성 레코드는 디비 테이블이나 다른 소스에서 자료를 직접 변환한 결과이다

      ⇒ 자료 구조로 취급!

      → 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성. (내부 자료는 활성 레코드의 인스턴스일 확률이 ↑


결론



7장 오류 처리

profile
#Backend #Developer

0개의 댓글