nyximos.log

[객체지향의 사실과 오해] 7. 함께 모으기 본문

Books

[객체지향의 사실과 오해] 7. 함께 모으기

nyximos 2024. 11. 16. 23:03

객체지향 설계에 존재하는 세가지 상호 연관된 관점

  1. 개념 관점
    • 도메인에 존재하는 개념, 개념간의 관계
    • 사용자가 도메인을 바라보는 관점 반영
    • 실제 도메인의 규칙과 제약을 최대한 유사하게 반영
  2. 명세 관점
    • 소프트웨어 안의 객체들의 책임, 인터페이스
    • 객체가 협력을 위해 무엇을 할 수 있는지
  3. 구현 관점
    • 객체들이 책임을 수행하는데 필요한 동작하는 코드 작성
    • 객체의 책임을 어떻게 수행할 것인가
    • 인터페이스를 구현하는데 필요한 속성과 메서드를 클래스에 추가

설계하고 구현하기

커피를 주문하기 위한 협력찾기

협력을 설계할 때는 메시지가 객체를 선택하게 해야한다.

인터페이스 정리하기

객체가 수신한 메시지가 객체의 인터페이스를 결정한다.

구현하기

코드와 세가지 관점

코드는 세가지 관점을 모두 제공해야 한다

  1. 개념 관점
    • 소프트웨어 클래스가 도메인 개념의 특성을 최대한 수용하면 유지보수성 🔺
  2. 명세 관점
    • 인터페이스는 변화에 탄력적이고 구현과 관련된 세부 사항이 드러나지 않아야 한다.
  3. 구현 관점
    • 메서드와 속성이 클래스 내부로 캡슐화돼야 한다.

⇒ 세가지 관점이 명확하게 드러날 수 있게 코드를 개선하라.

도메인 개념을 참조하는 이유

유지보수

인터페이스와 구현을 분리하라

추상화 기법

추상화 : 도메인의 복잡성을 단순화하고 직관적인 멘탈 모델을 만드는데 사용할 수 있는 인지 수단

  • 분류와 인스턴스화
    • 분류 : 세부사항을 숨기고 인스턴스간 공통 특성을 기반으로 범주 형성
  • 일반화와 특수화
    • 일반화 : 범주 차이 숨기고 범주간 공유하는 공통 특성 강조
  • 집합과 분해
    • 집합 : 부분과 관련된 세부사항 숨기고 부분을 사용해서 전체 형성

분류와 인스턴스화

개념과 범주

타입

외연과 집합

타입의 외연은 타입에 속하는 객체들의 집합

  • 동적 분류 : 객체가 한 집합에서 다른 집합의 원소로 자신이 속하는 타입을 변경할 수 있는 경우
  • 정적 분류 : 객체가 자신의 타입을 변경할 수 없는 경우

클래스

타입을 구현하는 가장 보편적인 방법

일반화와 특수화

범주의 계층

서브타입

어떤 타입이 다른 타입의 서브타입이 되려면 100%규칙과 is-a 규칙을 준수해야한다.

  • 100% 규칙
    • 슈퍼타입의 정의가 100% 서브타입에 적용돼야만 한다.
    • 서브타입은 속성과 연관관계 면에서 슈퍼타입과 100% 일치해야한다.
  • is-a 규칙
    • 서브타입의 모든 인스턴스는 슈퍼타입 집합에 포함돼야한다.
    • 서브타입은 슈퍼타입이다 라는 구문을 만들어보자

상속

일반화와 특수화 관계를 구현하는 가장 일반적인 방법

집합과 분해

계층적인 복잡성

  • 복잡성은 계층의 형태를 띤다.
  • 단순한 형태로부터 복잡한 형태로 진화하는데 걸리는 시간은 그 사이에 존재하는 안정적인 형태의 수와 분포에 의존한다.
  • 집합은 불필요한 세부 사항을 배제하고 큰 그림에서 대상을 다룰 수 있게 한다.

합성관계

객체와 객체 사이의 전체-부분 관계를 구현하기 위해서

패키지

소프트웨어의 전체적인 구조를 표현하기 위해 관련된 클래스 집합을 하나의 논리적인 단위로 묶는 구성요소