메시지가 객체를 결정한다.
-> 객체가 최소한의 인터페이스를 가질 수 있게 된다.
행동이 상태를 결정한다.
-> 객체는 충분히 추상적인 인터페이스를 가질 수 있게 된다.
협력이 객체의 행동을 결정하고 행동이 상태를 결정한다. 그 행동이 바로 객체의 책임이 된다.
객체가 존재하지만 역할이 따로 존재하는 이유
: 예를 들어서 할인 요금을 계산하라는 메시지를 보낼때 할인 요금을 계산할 수 있는 객체는 AmountDiscountPolicy와 PercentDiscountPolicy 모두 할인 요금을 계산하라는 메시지를 수신할 수 있지만 서로 다른 두개의 협력을 구현한다면 코드가 중복될 것이기에 '역할' 이라는 일종의 바꿔 끼울 수 있는 슬롯을 만드는 것이다.
역할을 구현하는 가장 일반적인 방법은 추상클래스와 인터페이스를 사용하는 것이다.
-> 추상클래스 : 모든 객체들이 공유하는 상태와 행동의 기본 구현이 존재
-> 인터페이스 : 공통의 구현이 필요없고 책임의 목록만 정의
여러 종류의 객체에 의해 수행될 필요가 있다면 그 자리는 역할이되지만, 단지 한 종류의 객체만이 협력에 참여할 필요가 있다면 그자리는 객체가 된다.
변경될 가능성이 높은 부분 = '구현' / 상대적으로 안정적인 부분 = '인터페이스'
응집도 : 모듈에 포함된 내부 요소들이 연관돼 있는 정도, 변경이 발생할 때 모듈 내부에서발생하는 변경의 정도
결합도 : 다른 모듈에 대해 얼마나 많은 지식을 갖고 있는 정도, 한 모듈이 변경되기 위해서 다른 모듈의 변경을 요구하는 정도
getter와 setter를 사용해서 밖에서 처리하는 것이 아닌 객체가 자기 스스로 책임을 질 수 있도록 설계한다
내부 구현의 변경이 외부로 퍼져나가는 파급 효과는 캡슐화가 부족하다는 증거이다.
객체의 속성값을 외부로 유출하는 것은 캡슐화를 어긋나지만 메서드의 파라미터와 반환값 또는 메서드명에서도 내부 구현을 노출시키면안된다.