Programming/📚 Book Study

[Clean Code] 6. 객체와 자료구조

남남이루 2023. 5. 14. 23:11
작성일 2023. 3. 2
범위 Clean Code 도서, Chaper 6. 객체와 자료구조

 

참고 자료 :
groom의 CLEAN CODE JAVASCRIPT
clean-code-typescript 🚿 타입스크립트를 위한 클린코드 - 한글 번역판

 

[Clean Code] 6. 객체와 자료구조

👌 객체 : 동작을 공개하고, 자료를 숨김. 동작변경없이 새객체 타입 추가에 용이 다만 기존 객체에 새 동작 추가하기가 어려움
👌 자료구조 : 자료 노출 ⇒ 새 동작 추가하기 쉬움. 다만 기존 함수에 새 자료 추가하기 어려움
📍 새로운 자료 타입을 추가하는 유연성이 필요하면 객체가 더 적합 다른 경우로 새로운 동작을 추가하는 유연성이 필요하변 자료 구조절차적인 코드가 더 적합

자료추상화

이미지

변수 사이에 함수라는 계층을 넣는다고 구현이 저절로 감춰지지는 않는다 구현을 감추려면 추상화가 필요하다 ! 그저 (형식 논리에 치우쳐) 조회 함수와 설정 함수로 변수를 다룬다고 클래스가 되지는 않는다. 그보다는 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스다.

자료/객체 비대칭

클린코드 도서
절차적 프로그래밍과 객체지향 프로그래밍의 특징, 장단점

 

객체와 자료구조

gettersetter를 사용하세요

- 자바스크립트 예시

bad

function makeBankAccount() {
  // ...

  return {
    // ...
    balance: 0
  };
}

const account = makeBankAccount();
account.balance = 100;

good

function makeBankAccount() {
  // private으로 선언된 변수
  let balance = 0;

  // 아래 return을 통해 public으로 선언된 "getter"
  function getBalance() {
    return balance;
  }

  // 아래 return을 통해 public으로 선언된 "setter"
  function setBalance(amount) {
    // ... balance를 업데이트하기 전 검증로직
    balance = amount;
  }

  return {
    // ...
    getBalance,
    setBalance
  };
}

const account = makeBankAccount();
account.setBalance(100);

 

  • 자바스크립트는 인터페이스와 타입을 가지고 있지 않고, 이러한 패턴을 적용하기가 힘듭니다. 왜냐하면 public, private 같은 키워드가 없기 때문이죠. 그렇기 때문에 getter setter를 사용해 객체의 데이터에 접근하는 것이 객체의 속성을 찾는 것보다 훨씬 낫습니다.
  • 타입스크립트
    • 객체 속성을 얻는 것 이상으로 무언가를 더 하고 싶을 때, 코드 안에서 관련된 모든 접근자를 찾고 변경하지 않아도 됩니다.
    • set을 사용할 때 검증 로직을 추가하는 것이 간단합니다.
    • 내부의 API를 캡슐화할 수 있습니다.
    • 값을 조회하고 설정할 때 로그를 기록하고 에러를 처리하는 것이 쉽습니다.
    • 서버에서 객체 속성을 불러올 때 지연 로딩할 수 있습니다.
  • 타입스크립트getter/setter 구문을 지원합니다. 행동을 캡슐화한 객체에서 데이터를 접근하기 위해 gettersetter를 사용하는 것은 객체에서 속성을 단순히 찾는 것보다 낫습니다. “왜 그렇습니까?” 라고 물을 수 있습니다. 다음과 같은 이유가 있습니다:

디미터법칙

: 휴리스틱, “모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다.”

⇒ 객체의 조회함수로 내부 구조를 공개하면 안된다.

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

기차충돌

final String outputDir = ctxt.getOptions()
                             .getScratchDir()
                             .getAbsolutePath();

잡종 구조

  • 잡종 구조는 새로운 함수는 물론이고 새로운 자료 구조도 추가하기 어 렵다. 양쪽 세상에서 단점만 모아놓은 구조다. 그러므로 잡종 구조는 되도록 피하는 편이 좋다

구조체 감추기

자료전달객체

활성레코드

  • 활성 레코드는 자료 구조로 취급한다. 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성한다.

 

스터디원들의 좋았던 내용

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

어느 한 코드 패러다임만이 정답은 아니라는 점을 명심해야 한다. 코드의 목적과 개발 상황을 고려해
최선의 방법론을 선택할 수 있어야 한다.