객체와 자료 구조

  • 객체: 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기 쉬움
  • 자료 구조: 기존 자료 구조에 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료 구조를 추가하기 어려움
1. 자료 추상화
  • 구현을 감추려면 추상화 필요
  • 자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋음 … 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민 해야 함
2. 자료/객체 비대칭
  • 두 정의는 본질적으로 상반된다.
    • 객체는 추상화 뒤로 자료를 숨김 채 자료를 다루는 함수만 공개
    • 자료 구조는 자료를 그대로 공개
    • (자료 구조를 사용하는) 절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면, 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.
    • 반대로, 절차적인 코드는 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다. 객체 지향 코드는 새로운 함수를 추가하기 어렵다. 그러려면 모든 클래스를 고쳐야 한다.
3. 디미터 법칙
  • 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙
    • 기차 충돌
      • 일반적으로 조잡하다 여겨지는 방식이므로 피하는 편이 좋다.
        newValue = newValue.split("").reverse().join("");
        

        (이건 아닌것 같은데..?)

    • 잡종 구조
      • 절반은 객체 / 절반은 자료 구조 (양쪽 세상에서 단점만 모아놓은 구조)
      • 중요한 기능을 수행하는 함수 + 공개 변수나 공개 조회/설정 함수
    • 구조체 감추기
      4. 자료 전달 객체(Data Transfer Object, DTO)
  • 공개 변수만 있고 함수가 없는 클래스 - 자료 구조체의 전형적인 형태
  • 특히 데이터 베이스와 통신하거나 소켓에서 받은 메시지의 구문을 분석할때 유용
  • 활성 레코드
    • DTO의 특수한 형태
    • 공개 변수가 있거나 비공개 변수에 조회/설정 함구아 있는 자료 구조, 대개 save나 find와 같은 탐색 함수도 제공함.
    • 활성 레코드는 데이터베이스 테이블이나 다른 소스에서 자료를 직접 변환한 결과임
    • 활성 레코드는 자료 구조로 취급
    • 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성
5. 결론
  • 새로운 자료 타입을 추가하는 유연성이 필요하다면 객체
  • 새로운 동작을 추가하는 유연성이 필요하다면 자료구조와 절차적인 코드