오브젝트 6장 객체지향 프로그래밍

장현진·2022년 8월 20일
0

오브젝트

목록 보기
1/1
post-custom-banner

Chapter 6 메시지와 인터페이스


1.협력과 메시지

클라이언트 - 서버 모델

  • 두 객체 사이의 협력 관계를 설명하기 위한 전통적인 메타포

  • 클라이언트가 서버의 서비스를 요청하는 단방향 상호작용

  • 객체는 클라이언트와 서버의 역할을 동시에 수행하는 것이 일반적

  • 두 객체 사이의 협력을 가능하게 해주는 매개체는 메시지

메시지와 메시지 전송

메시지란?

  • 객체들이 협력하기 위해 사용할 수 있는 유일한 의사소통 수단
    한 객체가 다른 객체에게 도움을 요청하는 것을 메시지 전송(message sending)
  • 메시지를 전송하는 객체를 메시지 전송자(message sender)
  • 메시지는 오퍼레이션명과 인자로 구성
  • 메시지 전송은 여기에 메시지 수신자를 추가한 것

예를 들어, buyWater(money)는 메시지
메시지 수신자인 market을 추가한 market.buyWater(money)이 메시지 전송

메시지와 메서드

  • 메시지를 수신했을 때 실제로 실행되는 함수 또는 프로시저를 메서드라고 부른다.
  • 객체는 메시지와 메서드라는 두가지 서로 다른 개념을 런타임에 연결해야 하기 때문에 컴파일 시점과 런타임의 의미가 달라질 수 있다. (동적 바인딩)
  • 런타임에 메시지와 메서드를 바인딩하는 메커니즘은 두 객체 사이의 결합도를 낮춤으로써 유연하고 확장 가능한 코드를 작성할 수 있게 만든다.

퍼블릭 인터페이스와 오퍼레이션

  • 객체가 의사소통을 위해 외부에 공개하는 메시지의 집합을 퍼블릭 인터페이스라고 부른다.

  • 퍼블릭 인터페이스에 포함된 메시지를 오퍼레이션이라고 부른다.

-시그니처는 오퍼레이션의 이름과 파라미터 목록을 합쳐서 부르는 용어다.
오퍼레이션은 실행 코드 없이 시그니처만을 정의한 것이다.

디미터 법칙 (Law Of Demeter)

객체의 내부 구조에 강하게 결합되지 않도록 협력 경로를 제한하라는 법칙

  • 낯선 자에게 말하지 말라

  • 인접한 이웃하고만 말하라

  • 오직 하나의 도트만 사용하라

  • 클래스 내부의 메서드가 아래 조건을 만족하는 인스턴스에만 메시지를 전송하라

    this 객체
    메서드의 매개변수
    this 속성
    this의 속성인 컬렉션의 요소

  • 디미터법칙위반
screenig.getMovie().getDiscountConditions()

위코드는 Movie의 메소드까지 알아야 할것을 요구하게된다. 이로 인해 캡슐화는 무너진다.

올바른 코드 :

screenig.calculateFee(audienceCount)


묻지 말고 시켜라

디미터 법칙은 훌륭한 메시지는 객체의 상태에 관해 묻지 말고 원하는 것을 시켜야 한다는 사실을 강조

묻지 말고 시켜라 원칙에 따르도록 메시지를 결정하다 보면 자연스럽게 정보 전문가에게 책임을 할당하고 높은 응집도를 가진 클래스를 얻을 확률이 높아진다.



인터페이스의 의도를 드러내자

  • 오퍼레이션의 이름은 협력이라는 문맥을 반영해야 한다.

  • 클라이언트가 객체에게 무엇을 원하는지 명확하게 표현해야 한다.

  • 디미터 법칙은 객체 간 협력을 설계할 때 캡슐화를 위반하는 메시지가 인터페이스에 포함되지 않도록 제한한다.



원칙의 함정

디미터의 법칙은 하나의 도트(.)를 강제하는 규칙이 아니다.
과연 여러개의 도트를 사용한 코드가 객체의 내부 구조를 노출하고 있는가?


결합도와 응집도의 충돌

디미터 법칙과 묻지말고 시켜라 법칙을 무작정 따를 필요는 없음

예시) Screening 이 자신이 판단해야하지 않을 다른 책임을 지게되는 경우

  • 객체의 응집도가 낮아질수 있음.

  • 캡슐화 향상시키는것보다 결합도를 낮추는것이 전체적으로 더 나을수 있음.

디미터 법칙의 위반여부는 객체인지 자료구조인지에 달려있음.
자료구조일 경우 당연히 내부를 노출해야하므로 법칙에서 제외
원칙이 필요하고 적절한 상황인지 판단해야함.



명령-쿼리 분리(Command-Query Separation) 원칙

명령-쿼리 분리 원칙은 퍼블릭 인터페이스에 오퍼레이션 정의에 가이드를 제공한다. 먼저 프로시저와 함수의 차이를 알아보자.

  • 프로시저 : 부수효과를 발생하지만 값을 반환하지 않는다.

  • 함수 : 값을 반환하지만 부수효과는 없다.

명령과 쿼리는 프로시저와 함수의 또 다른 의미이다. 명령은 객체를 수정하는 오퍼레이션이고, 쿼리는 객체의 정보를 반환하는 오퍼레이션이다.

명령-쿼리 분리 원칙은 오퍼레이션이 객체를 수정하면서 정보를 반환하는 작업을 동시에 하지 말라 는 원칙이다.

한마디로 "질문이 답변을 수정해서는 안된다"는 것이다.

post-custom-banner

0개의 댓글