오브젝트 - 08 의존성 관리하기

yshjft·2023년 5월 22일
0

오브젝트

목록 보기
8/18
  • 작고 응집도 높은 객체
    • 한 가지 일만 잘 하는 객체
  • 기능을 구현은 객체들간의 협력을 통해서 이루어진다.
  • 설계의 핵심은 필요한 의존성은 유지하되 변경을 방해하는 의존성은 제거

01 의존성 이해하기

변경과 의존성

  • 의존성

    • 실행 시점: 실행 시에 의존 대상 객체가 반드시 존재
    • 구현 시점: 의존 대상 객체가 변경될 경우 의존하는 객체도 함께 변경
  • 의존성 존재

    • 작이을 정상적으로 수행하기 위해 다른 객체를 필요로 하는 경우 → 의존성이 존재한다고 한다.
  • 의존성은 전이 될 수 있다.

의존성 전이

  • A가 B를 의존 & B가 C를 의존 = A가 C에 의존
  • 의존성
    • 함께 변경될 수 있는 가능성
  • 직접 의존성
    • 한 요소가 다른 요소에 직접 의존하는 경우
  • 간접 의존성
    • 의존성 전이에 의한 의존

런타임 의존성과 컴파일타임 의존성

  • 런타임 의존성
    • 애플리케이션이 실행되는 시점
    • 객체 사이의 의존성
  • 컴파일타임 의존성
    • 코드를 컴파일하는 시점
    • 클래스 사이의 의존성
  • 런타임 의존성과 컴파일타임 의존성이 다를 수 있다.
  • 실제로 협력할 객체가 어떤 것이지는 런타임에 해결되어야 한다.
  • 컴파일타임 구조와 런타임 구조 사이의 거리가 멀면 멀수록 설계가 유연해지고 재사용이 가능해진다.

컨텍스트 독립성

  • 컨텍스트 독립성
    • 클래스가 사용될 특정한 문맥에 대해 최소한의 가정만으로 이뤄져 있다면 재사용성이 높아진다.
    • 실행될 컨텍스트에 대한 구체적인 정보를 최대한 적게 알아야 한다.
  • 컨텍스트 독립적
    • 각 객체가 해당 객체를 실행하는 시스템에 관해 아무것도 알지 못한다.

의존성 해결하기

  • 의존성 해결
    • 컴파일타임 의존성을 실행 컨텍스에 맞는 적절한 런타임 의존성으로 교체하는 것
    • 생성자, setter, 메서드 실행 시 인자를 통해서 의존성을 해결할 수 있다.
  • setter 의존성 해결
    • 설계를 유연하게 만들 수 있지만 객체의 상태가 불완전해질 수 있는 문제를 만들어 내기도 한다.
    • setter 방식과 생성자 방식을 섞는 것이 가장 좋음
  • 메서드 인자를 통한 의존성 해결
    • 메서드가 실행되는 동안만 일시적으로 의존 관계가 존해도 무방하거나 메서드가 실행될 때마다 의존 대상이 달라지는 경우에 유용

02 유연한 설계

의존성과 결합도

  • 의존성 자체는 문제가 아니다. 의존성의 정도가 문제이다.
  • 바람직한 의존성은 재사용성과 관련이 있다.
    • 트거정한 컨텍스트에 강하게 결합된 의존성은 바람직하지 않다.
  • 의존성이 바람직한 경우
    • 느슨한 결합도 or 약한 결합도
    • 재사용성 높음
  • 의존성이 바람직하지 못한 경우
    • 단단한 결합도
    • 재사용성 낮음

지식이 결합을 낳는다

  • 한 요소가 다른 요소에 대해 더 많은 정보를 알고 있을수록 두 요소는 강하게 결합한다.
  • 즉 재사용성이 떨어진다.

추상화에 의존하라

  • 추상화
    • 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 극복하는 방법
  • 구체 클래스 의존성 → (의존성이 낮아짐) → 추상 클래스 의존성 → (의존성이 낮아짐) → 인터페이스 의존성
  • 컨텍스테에 대한 정보가 적을 수록 결합도가 낮아 진다.

명시적인 의존성

  • 명시적인 의존성
    • 명시적으로 퍼블릭 인터페이스에 노출
  • 숨겨진 의존성
    • 의존성이 퍼블릭 인터페이스에 노출되지 않음
  • 의존성은 명시적으로 표현되어야 한다.

new는 해롭다

  • 구체 클래스에 의존하게 되므로 결합도가 높아진다.
  • new에 사용되는 인자들을 알아야 한다. → 지식의 양이 많아진다. → 결합도가 높아진다.

가끔은 생성해도 무방하다

주로 협력하는 기본 객체를 설정하고 싶은 경우 인스턴스를 직접 생성하는 방식이 유용하기도 하다.

표준 클래스에 대한 의존은 해롭지 않다

변경될 확률이 거의 없는 클래스라면 의존성이 문제가 되지 않는다.(표준 클래스 == 거의 안변하는 클래스)

컨텍스트 확장하기

조합 가능한 행동

  • 유연하고 재사용 가능한 설계
    • 무엇을 하는지를 표현하는 클래스들로 구성
    • 작은 객체들의 행동을 조합함으로써 새로운 행동을 이끌어낼 수 있는 설계
profile
꾸준히 나아가자 🐢

0개의 댓글