객체 설계하기

정호진·2023년 2월 27일
0

우아한테크코스

목록 보기
2/6

객체를 객체답게 사용하기 위해서는 “책임, 역할, 협력”이 중요하다고 했습니다.

사실 이게 뭔데? 라는 생각과 함께 내가 평소에 알고 있는 의미와 다를 것 같다는 생각에 한번 정리해 보았습니다,

협력: 객체들이 어플리케이션의 기능을 구현하기 위해 수행하는 상호작용

책임: 객체가 협력에 참여하기 위해 수행하는 로직

역할: 객체들이 협력 안에서 수행하는 책임들의 집합

즉, 책임이 모여 역할이 되는 것이고, 그러한 역할들을 통해 서로 다른 객체와 협력하여 어플리케이션의 기능을 구현하는 것입니다.

협력

자율적인 객체란 자신의 상태를 직접 관리하고 결정에 따라 행동하는 객체입니다. 객체의 자율성을 보장하기 위해서는 필요한 정보와 그에 따른 행동을 같은 객체 안에 모아놔야 합니다. 즉 캡슐화 하는 것입니다.

그리고 자신이 할 수 없는 일을 다른 객체에 위임을 하며객체들의 전체적인 자율성을 향상킬 수 있습니다.

어플리케이션에서 객체가 필요하다면 그 이유는 협력에 참여한 객체이기 때문입니다. 그리고 그 객체에는 협력에 필요한 행동(책임)을 갖고 있기 때문에 협력을 잘 본다면 설계를 위한 문맥을 볼 수 있습니다.

책임

책임이란 객체에 의해 정의된 응집도 있는 행위의 집합으로, 객체가 수행할 수 있는 행동을 서술한 문장입니다. 객체의 책임은 객체가 “무엇을 알고 있는지”와 “무엇을 할 수 있는지”로 구성이 됩니다.

책임의 관점에서 보면 “아는 것” 과 “하는 것”은 밀접하게 연관되어 있습니다. 객체에 적절한 책임을 할당하는 것이 설계의 완성도를 높일 수 있습니다.

협력을 설계하면서 적절한 책임을 할당하고, 그에 맞는 정보를 얻고, 협력을 하면서 남은 결과물로 시스템을 구성하는 객체들의 인터페이스를 얻을 수 있습니다.

객체를 객체답게 만드는 것은 객체의 상태가 아니라 객체가 다른 객체에게 제공하는 행동입니다.

역할

객체의 목적은 협력 사이에서 맡게되는 역할로 알 수 있습니다. 역할이 중요한 이유는 이를 통해 유연하고 재사용이 가능한 협력을 생성할 수 있기 때문입니다.

역할은 특정한 객체의 종류를 캡슐화하기 때문에 동일한 역할을 수행 합니다.

위와 같이 적절한 비용 안에서 쉽게 변경이 가능한 객체 설계는 응집도가 높고, 느슨한 연결로 결합되어 있는 요소로 구성되어 있습니다.

객체지향 설계 분할 기준

  • 상태 분할 중심: 객체는 자신이 포함하고 있는 데이터를 조작하는데 필요한 동작을 정의
  • 책임 분할 중심: 다른 객체가 요청할 수 있는 동작을 위해 필요한 상태를 보관

설계 트레이트오프

캡슐화

설계가 필요한 이유는 요구사항이 변화하기 때문이고, 캡슐화가 중요한 이유는 불안정한 부분과 안정적인 부분을 분리해서 변경의 영향을 통제할 수 있기 때문입니다.

응집도와 결합도

  • 응집도: 모듈에 포함된 내부 요소들이 연관되어 있는 정도

  • 결합도: 의존성의 정도를 나타내며, 다른 모듈에 대해 얼마나 많은 정보를 갖고 있는지 나타냄.

여기서 “높다” “낮다” 등의 표현이 너무 모호합니다. 정답은 없지만 측정할 수 있는 몇 가지 요소는 존재합니다.

높은 결합도

캡슐화가 내부 구현을 그대로 노출하는 경우 → 클라이언트가 구현에 강하게 결합된다는 것을 의미합니다.

낮은 응집도

하나의 요구 사항 변경을 반영하기 위해 동시에 여러 모듈을 수정해야 하는 경우 → 다른 모듈에 의지해야 할 책임의 일부가 엉뚱한 곳에 위치해있기 때문입니다.

자율적인 객체 생성을 위해

  1. 캡슐화를 해야 합니다.. 내부 구현의 변경으로 인해 외부 객체가 영향을 받지 않도록 설정해야 하며, 설계에서 변하는 것이 무엇인지 고려하고 변하는 개념을 캡슐화 해야 합니다.
  2. 올바른 객체 지향 설계의 중심은 객체 내부가 아니라 외부에 맞춰져 있어야 합니다. 객체가 내부어 어떤 상태를 갖는지는 부가적인 문제.
    상태 중심 설의 초점은 객체의 외부가 아니라 내부로 향해 있으며, 문맥에 맞는 객체를 생성해야지, 이미 생성을 하고 문맥에 억지로 맞춰 끼워넣으러고 하면 문제가 발생한다.

https://incheol-jung.gitbook.io/docs/study/object/2020-03-10-object-chap4

0개의 댓글