책임과 메시지

김태완·2023년 7월 25일
0

독서 스터디

목록 보기
2/8

객체들에 명확하게 정의된 책임과 역할을 지녀야한다. 책임과 역할이 흐려진다면 객체간의 어떤 협력도 없을것이다.

자율적인 책임

  • 스스로 정한 원칙대로 판단하고 행동하는 객체여야한다
  • 적절한 책임(객체가 수행하는 행동)이 자율적 객체를 낳고 이런 자율적인 객체들이 협력을 낳는다
  • 책임은 너무 구체적이어도 안되고 너무 추상적이어도 안된다.
    • "설명하라" : 뭘?
    • "이렇게 이렇게 증언하라" : 저렇게 저렇게 증언하면 안돼?
    • "증언하라" : 증언을 하되, 수신자가 어떤 방법을 써서든 증언만 하면됨
  • "어떻게"가 아닌 "무엇"을 해야하는지 설명한다

메시지와 메서드

메시지

  • 메시지는 객체들의 유일한 협력수단
  • 객체가 메시지를 수신한다는것은 해당 책임을 수행한다는 뜻
  • 객체는 받은 메시지를 처리하기위해 자율적으로 방법을 선택함
  • 송신하는 객체는 수신하는 객체가 해당 메시지를 수행할수있는지 여부만 알수있고 내부는 볼 수 없다.
  • 메시지는 연쇄적으로 전달될수있다.

메서드

  • 객체는 메시지를 수신하면 해당 메시지를 처리할수있는지 여부를 확인.
  • 처리할수있다면 처리방법 , 즉 메서드를 선택함.

다형성

  • 서로 다른 객체들이 동일한 메시지에 대해 각자의 방식으로 책임을 수행하는것.
  • 기본적으로 다형성은 객체의 대체가능성을 나타냄 (모자장수 말고 요리사가 증언해도됨)
  • 다형성을 이용하면 협력을 유연하고 재사용가능하게 만들어준다

객체와 객체는 메시지라는 끈으로 낮은 결합도로 연결되어있다.
이 느슨한 연결로 설계를 유연하게 할수있고, 설계할때 어떤 메시지를 쓰느냐에 따라 품질이 결정된다.

메시지를 따라라

클래스가 객체지향의 대표적인 추상화 도구지만, 클래스가 객체지향의 전부가 아닌 객체간의 메시지가 핵심이다.

데이터 주도 설계

데이터 구조를 먼저 생각하는 설계로, 객체 내부구조를 객체 정의의 일부로 만들기때문에 객체의 자율성이 떨어진다. 이는 흔히 범하는 실수다

책임 주도 설계

  • 객체가 메시지를 선택하는것이아닌, 메시지가 객체를 선택하도록 해야한다
  • 적절한 책임을 적절한 객체에게 할당하여 메시지를 기반으로 협력이 이뤄짐.

what who 사이클

  • 어떤 행위(what)를 수행할것인지를 결정한뒤, 누가(who)수행할것인지를 결정해야한다.
  • 객체의 책임을 결정하는것은 메시지다.
  • 이렇게 메시지를 먼저 결정함으로써 인터페이스를 발견할수있다.

묻지말고 시켜라 (또는 데메테르 법칙)

  • 송신객체는 수신객체가 해당 메시지를 잘 처리할것이라 믿고, 수신객체는 받은 메시지를 자율적으로 처리한다. 그러므로 묻지말고 걍 시켜라

객체 인터페이스

인터페이스란, 두 사물이 마주하는 경계에서 서로 상호작용을 할수있게 이어주는 방법 또는 장치를 뜻함. (스마트폰, tv리모컨, 엘베 버튼..)

3가지 특징이 있는데
1. 사용법만 알고있으면 내부 구조를 몰라도 상호작용이 가능
2. 내부 구성이 변경되어도 사용방법에는 영향X
3. 대상이 변경되어도 동일 인터페이스를 제공하면 사용하는데 문제X

공용 인터페이스

  • 객체의 외부에 공개된 인터페이스로, 객체가 객체에게서 메시지를 전달받기위한 통로
  • 객체가 수행하는 메시지가 공용 인터페이스를 암시함
    • 토끼 -> 입장하라(인터페이스) -> 모자장수
    • 왕 -> 증언하라(인터페이스) -> 모자장수

인터페이스 구현의 분리의 원칙

  • 소프트웨어는 늘 변하기 때문에(시x 기획) 안전지대(구현) 위험지대(공용 인터페이스)를 분리해야함.
  • 적절한 구현을 택하고, 공용인터페이스 뒤에 감춰라.
  1. 좀 더 추상적인 인터페이스 : 객체에 자율성을 주기위해 너무 구체적인 인터페이스보단 추상적인 인터페이스를 제공하는것이 좋다
  2. 최소 인터페이스 : 외부에서 쓸 필요없는 인터페이스는 최대한 노출X
  3. 캡슐화

캡슐화

객체의 자율성을 보존하기 위해 구현을 외부로부터 감추는 것
외부 객체는 오직 공용인터페이스에 정의된 메시지를 통해서만 객체에 접근 가능.

상태와 행위의 캡슐화

  • 상태와 행동을 하나로 묶는 데이터 캡슐화

사적인 비밀의 캡슐화

  • 구현과 관련된 세부사항은 공용 인터페이스 뒤로 숨긴다.

외부객체는 공용 인터페이스에만 의존해야하고, 구현에 대해서 직접 의존하면 안된다. 즉 객체의 외부, 내부는 철저히 분리되어야한다.

결론. 책임의 자율성이 협력의 품질을 결정한다

  1. 자율적인 책임은 협력을 단순하게 만든다
  2. 자율적인 책임은 객체의 내부,외부를 분리한다
  3. 자율적인 책임은 구현을 변경해도 외부에 영향을 미치지않는다, 즉 결합도가 낮다.
  4. 자율적인 책임은 협력의 대상을 다양하게 선택할수있는 유연성을 제공한다
  5. 책임이 자율적일수록 객체의 역할을 이해하기가 쉽다. 즉 응집도가 높다.
profile
프론트엔드개발

0개의 댓글