구현
이라고 하고 상대적으로 안정적인 부분을 인터페이스
라고 한다.// 캡슐화 전
public void verifyEmail(String token) {
Member mem = findByToken(token);
if (mem == null) {
throw new BadTokenException();
}
if (mem.getVerificationEmailStatus() == 2) {
throw new AlreadyVerifiedException();
} else {
mem.setVerificationEmailStatus(2);
}
// .. 수정 사항 DB 반영
}
// 캡슐화 후
public void verifyEmail(String token) {
Member mem = findByToken(token);
if (mem == null) {
throw new BadTokenException();
}
mem.verifyEmail();
// .. 수정 사항 DB 반영
}
public class Member {
...
public void verifyEmail() {
if (isEmailVerified()) {
throw new AlreadyVerifiedException();
} else {
this.verificationEmailStatus = 2;
}
}
...
}
Open-Closed Principle(OCP)
- 개방 폐쇄 원칙 : 확장에는 열려있고, 수정에는 닫혀있는 객체지향 설계원칙 중 하나
- 의존 하는 대상을 바꾸거거나, 확장할 수 있으면서, 의존 대상을 사용하는 코드는 수정하지 않는다.
캡슐화와 추상화는 개발 비용을 낮춰주는 객체 지향의 두 가지 특징이다. 캡슐화는 기능 구현을 외부로부터 감추고, 내부의 구현 변경이 외부로 전파되는 것을 막아준다. 추상화는 의존 대상을 추상 타입으로 간접 참조하고 사용하고 있는 의존 대상의 변경이 사용하는 입장에는 영향을 주지 않는다.
둘은 상호 보완적인 개념이다. 추상화는 객체의 동작, 기능 자체에 중점을 두지만 캡슐하는 객체의 동작 구현에 중점을 두는 반면 캡슐화는 객체 내부 상태에 대한 정보를 숨기는 방식으로 이루어지므로 추상화를 제공하기 위해 사용되는 전략중 하나로 볼 수 있다.
설계를 주도하는 것은 변경이다. 개발자로서 변경에 대비할 수 있는 방법이 두 가지 있다.
대부분의 경우에는 전자의 방법이 더 좋지만, 유사한 변경이 반복적으로 발생하고 있다면 복잡성이 상승하더라도 유연성을 추가하는 두 번째 방법이 더 좋다.