이 글은
객체지향의 사실과 오해 (조영호 지음)
책 내용 일부를 정리한 글입니다.우아한테크코스 프리코스 피드백
중 관련 있는 내용을 함께 정리했습니다.
상태
와 행동
부수 효과(side effect)
: 객체의 행동에 의해 객체의 상태가 변경된다.객체는 상태
를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다.
객체가 외부에 노출하는 것은 행동
뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동뿐이다.
필드는 private class 필드로 구현한다. 객체의 상태를 외부에서 직접 접근하는 방식을 최소화한다.
class WinningLotto {
#lotto
#bonusNumber
constructor(lotto, bonusNumber) {
this.#lotto = lotto
this.#bonusNumber = bonusNumber
}
}
객체의 행동을 유발하는 것은 외부로 전달된 메시지지만 객체의 상태를 변경할지 여부는 객체 스스로 결정한다.
Lotto
클래스는 numbers
를 상태 값으로 가진다. 그런데 이 객체는 로직에 대한 구현은 하나도 없고, numbers
에 대한 getter 메서드만을 가진다.
class Lotto {
#numbers;
constructor(numbers) {
this.#numbers = numbers;
}
getNumbers() {
return this.#numbers;
}
}
class LottoGame {
play() {
const lotto = new Lotto(...);
// 숫자가 포함되어 있는지 확인한다.
lotto.getNumbers().contains(number)
// 당첨 번호와 몇 개가 일치하는지 확인한다.
lotto.getNumbers().stream()...
}
}
Lotto
에서 데이터를 꺼내지(get) 말고 메시지를 던지도록 구조를 바꿔 데이터를 가지는 객체가 일하도록 한다.
class Lotto {
#numbers;
constructor(numbers) {
this.#numbers = numbers;
}
contains(number) {
// 숫자가 포함되어 있는지 확인한다.
return ...
}
matchCount(other) {
// 당첨 번호와 몇 개가 일치하는지 확인한다.
return ...
}
}
class LottoGame {
play() {
const lotto = new Lotto(...);
lotto.contains(number);
lotto.matchCount(...);
}
}
“행동
이 상태
를 결정한다.”
협력
을 생각한다.행동
을 생각한다.객체
를 선택한다.아래는 우테코 프리코스 미션으로 내가 구현한 다리 건너기 게임의 구조도이다.
각각의 객체
에서 필드는 상태
, 메서드는 행동
이며 객체 간 메시지를 주고받으며 협력
한다. MVC 패턴
으로 구조화하고자 했다.
기능
vs 구조
요구사항 변경에 대비하기 위해서는 자주 변경되는 기능
이 아닌 안정적인 구조
를 중심으로 설계해야 한다.
객체의 구조에 집중하고 기능이 객체의 구조를 따르게 만든다. 시스템 기능은 더 작은 책임으로 분할되고 적절한 객체에게 분배되기 때문에 기능이 변경되더라도 객체 간의 구조는 그대로 유지된다.
구조
: 사용자나 이해관계자들이 도메인에 관해 생각하는 개념과 개념들 간의 관계기능
: 사용자의 목표를 만족시키기 위해 책임을 수행하는 시스템의 행위도메인 모델
도메인
: 사용자가 프로그램을 사용하는 대상 분야도메인 모델
: 사용자가 프로그램을 사용하는 대상 영역에 관한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태유스케이스(Use Case)
유스케이스
: 사용자의 목표를 달성하기 위해 사용자와 시스템 간에 이뤄지는 상호작용의 흐름을 텍스트로 정리한 것기능
을 명시(유스케이스)하고구조
(도메인 모델)를 기반으로기능
을 책임
으로 변환한다.