선생님, 개발을 잘하고 싶어요.

[오브젝트] 챕터1 - 객체, 설계 본문

일상/책 리뷰

[오브젝트] 챕터1 - 객체, 설계

알고싶은 승민 2022. 3. 1. 23:00

요즘 오브젝트라는 책을 읽는 중입니다. 한동안 방법론의 노예가 되서 생각 없이 아키텍쳐 공부를 하지 않았나 반성하게 되는 일이 많았는데, 그 때 마침 스터디 기회가 찾아와서 읽고 정리하는 중입니다.

 

"적절한"이 너무 많이 나오는데... 적절한 객체에 적절한 책임은 도대체 무엇일까요? 이 책을 읽어보고 토론해보며 나만의 적절함을 알아갈 수 있으면 좋겠습니다.


  • 이 책은 훌륭한 객체지향 프로그램을 설계하고 유지보수하는 데 필요한 원칙과 기법을 설명하기 위해서 쓰인 책이다.
    • 훌륭한은 무슨 의미인가?
  • 티켓 판매 애플리케이션
    • 모듈의 목적 3가지
      • 제대로 동작
      • 간단하게 변경가능
      • 특별한 훈련 없이도 개발자가 쉽게 읽고 이해가능
    • 이해 가능한 코드
      • 예상에서 크게 벗어나지 않는 코드
      • 코드를 보는데 한꺼번에 기억해야하는 게 적은 코드
    • 변경에 취약한 코드
      • 의존성(dependency)은 변경에 대한 영향을 암시한다.
      • 객체지향 설계는 의존하는 객체간 공동체 구축
      • 객체 사이 의존성이 과한 경우를 결합도(coupling)가 높다고 함.
    • 자율성을 높이자.
      • 객체 내부의 세부적인 사항을 감추는 것을 캡슐화(encapsulation)라고 함.
      • 객체를 인터페이스(interface)와 구현(implementation)으로 나누고 인터페이스만 공개하자.
      • 객체가 내부 구현을 외부에 노출하지 않고 자신의 문제를 스스로 책임지고 해결한다.
      • 객체의 자율성 높이기 → 변경 범위 축소 → 변경 용이성 개선
      • 자율성 높이는 방법 (아래 3가지는 모두 같은 말)
        • 캡슐화
        • 인터페이스와 구현 나누고 인터페이스만 공개
        • 자신의 문제를 스스로 책임지고 해결하기
      무엇이 인터페이스이고 무엇이 구현인가?
    • 응집도(cohesion)가 높다 → 밀접하게 연관된 작업만 수행하고 연관성 없는 작업은 다른 객체에게 위임하는 것
      • 객체 스스로 자율성이 높으면 응집도가 높아진다. (첫걸음)
  • 외부의 간섭을 최대한 배제하고 메시지를 통해서만 협력하는 객체의 공동체를 만드는 것이 훌륭한 객체지향 설계를 얻을 수 있는 지름길
    • 외부의 간섭을 배제하는 법 → 구현을 숨긴다.
    • 메시지를 통해서 협력하는 법 → 의존하는 객체의 인터페이스만 활용한다.
    • 훌륭한 객체지향 설계 → 변경 용이성이 높은 설계?
  • 캡슐화를 이용해 의존성을 적절히 관리함으로써 객체 사이의 결합도를 낮추는 것이 훌륭한 객체지향 설계의 핵심
    • 캡슐화를 이용해 의존성을 관리해서 변경에 용이하게 만들자.
  • 책임의 이동
    • 책임 = 기능
    • 기능을 처리하는 방법
      • 중앙집중식 절차적 프로그래밍
      • 각 객체에게 책임(기능)이 분산된 객체지향 프로그래밍
    • 데이터와 데이터를 사용하는 프로세스가 동일한 객체 안에 위치하면 객체지향 프로그래밍을 따르고 있을 확률이 높다.
  • 객체지향의 핵심 (또 말하는)
    • 적절한 객체에 적절한 책임을 할당하는 것
    • 객체가 어떤 데이터를 가지느냐의 관점에서 객체에 어떤 책임을 할당할 것이냐에 초점을 맞춰야 한다.
    • 적절, 어떤 책임 ... 너무 경험에 의해서만 알 수 있는 기준같다. 어떤 기준으로 “적절성”을 판단할 수 있을까?
  • 훌륭한 객체지향 설계 (또 또 말하는)
    • 의존성이 설계를 어렵게한다.
    • 따라서 불필요한 의존성을 제거해 결합도를 낮추라.
      • 구현을 내부로 감춰 캡슐화
    • 캡슐화 → 자율성을 높힘 & 응집도 높힘
    • 객체간 낮은 결합도와 높은 응집도만 남기도록 최소한의 의존성만 남기는 것이 중요하다.
  • (또 말하는 거)
    • 소프트웨어를 구성하는 모든 객체들이 자율적으로 행동하는 설계
  • 설계는 코드를 작성하는 매 순간 코드를 어떻게 배치할 것인지 결정하는 과정에서 나온다.
  • 좋은 설계란 오늘 요구하는 기능을 온전히 수행하며, 내일의 변경을 매끄럽게 수용할 수 있는 설계다.
  • 변경 가능한 코드는 이해하기 쉬운 코드여야한다. 이해하기 어려운 코드는 설사 변경에 열려있어도, 코드를 수정할 마음이 선뜻 들지 않는다.
  • 훌륭한 객체지향 설계란 협력하는 객체 사이의 의존성을 적절하게 관리하는 설계다.
Comments