캡슐화를 하지 않으면?
데이터의 사용법이 바뀌면서 변경되는 코드가 연쇄적으로 발생
if(acc.getMembership() == REGULAR && acc.getExpDate().isAter(now())) {
...정회원 기능
}
//변경된 코드 - 5년 이상 사용자 일부 기능 정회원 혜택 1개월 무상 제공
if(acc.getMembership() == REGULAR &&
(
(acc.getServiceDate().isAfter(fiveYearAgo) && acc.getExpDate().isAfter(now())) ||
(acc.getServiceDate().isBefore(fiveYearAgo) && addMonth(acc.getExpDate()).isAfter(now()))
)
) {
...정회원 기능
}
캡슐화를 하면?
캡슐화는 연쇄적인 변경 전파를 최소화
public class Account {
public boolean hasRegularPermission() {
return membership == REGULAR &&
expDate.isAfter(now())
);
}
if(acc.hasRegularPermission()) {
...정회원 기능
}
//변경된 코드
public class Account {
public boolean hasRegularPermission() {
return membership == REGULAR &&
( expDate.isAfter(now()) ||
(
serviceDate.isBefore(fiveYearAgo()) &&
addMonth(expDate).isAfter(now())
)
);
}
if(acc.hasRegularPermission()) {
...정회원 기능
}
//캡슐화를 통해 내부 구현을 외부에 감춤
캡슐화와 기능
캡슐화 시도 -> 기능에 대한 (의도) 이해를 높임
if(acc.getMembership() == REGULAR) {
...정회원 기능
}
if(acc.hasRegularPermission()) {
...정회원 기능
}
acc.getExpDate().isAfter(now) -> acc.isExpired()
Date date = acc.getExpDate(); -> acc.isValid(now)
date.isAfter(now);