좋은 class 모델링은 실제 도메인 개념에 대응하는 class들이 각각 하나의 명확한 책임을 가지고, 정직한 is-a/has-a 관계로 연결되며, 경계에서 추상화에 의존하는 것을 의미합니다. 공식은 없지만, 반복 가능한 과정은 있습니다.
실용적인 과정
text
1. 명사를 찾기 → 후보 class (Order, Customer, Payment)
2. 동사를 찾기 → 후보 동작/메서드 (place, refund, ship)
3. 각 동작을 그것이 필요로 하는 데이터를 소유한 class 에 할당 (높은 응집도)
4. 관계 선택: IS-A (드물고, LSP 통과 필수) 대 HAS-A (기본)
5. 경계에서 interface 에 의존 (DIP); 변동성 있는 의존성은 주입
6. 불변식을 객체 안에 유지 (encapsulation); 값에는 불변성 선호
동작은 데이터를 따른다
java
{ List<Item> items; }
{ {...} }
{
List<Item> items;
Money {
items.stream().map(Item::price).reduce(Money.ZERO, Money::plus);
}
}
