OCP?
OCP(Open Closed Principle) : 소프트웨어 객체는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.
이게 무슨말이냐... 후
그러니까 음..
내가 B라는 기능을 추가하고 싶을 때, A라는 원본 Code가 바뀌어서는 안된다는 의미입니다.
계산기를 예로 들자면, 덧셈(+) 기능의 계산기가 있을 때, 뺄셈(-)을 구현할 때 덧셈을 손대지 마라는 말입니다.
쪼금 이해가 되셨을까요.?
이 글을 검색하셨다면, 이미 훌륭한 Coder이니까 바로 Code로 살펴볼께요!!
Code 예시
예시로 설명을 시작하겠습니다!
저는 웹 프로그래머에요. 그래서 내가 만든 Web Application에서 URL을 매핑하는 모듈을 만들고 싶었습니다.
Controller에서 url을 Mapping하는 간단한 클래스를 만들어볼까 합니다!
public class URLMapper {
public String mapping(String url) {
if ("shopping.do".equals(url)) {
return "shopping";
} else if ("login.do".equals(url)) {
return "login";
} else if ("mypage.do".equals(url)) {
return "mypage";
} else if ("product.do".equals(url)) {
return "product";
}
throw new IllegalArgumentException("해당하는 url이 없습니다");
}
}
흠 근데, 다시 생각해볼까요?
url이 하나씩 늘어나면 늘어날 수록 if~else 구문이 한줄씩 추가되겠네요 ㅠㅠ
이게 바로 OCP에 위반되는 Code입니다.
내가 만든 모듈에서 기능을 확장하고 싶은데, 확장할려면 원본 Code를 손대야 되네요
그래서, 새로운 객체를 만들어서 리팩토링할려고 합니다!!
public enum URL {
SHOPPING("shopping.do", "shopping"),
LOGIN("login.do", "login"),
MY_PAGE("mypage.do", "mypage"),
PRODUCT("product.do", "product");
private final String url;
private final String matchResult;
URL(final String url, final String matchResult) {
this.url = url;
this.matchResult = matchResult;
}
}
URL 이라는 Enum 클래스를 만들었어요.
이 클래스는 url에 대한 정보와 매핑되는 정보를 가지고 있는 객체에요!
이렇게 만들게 되면, 확장할 때 enum객체 하나만 만들어주면 되니까 참 쉽겠죠?
public static URL matchOf(String url) {
return Arrays.stream(values())
.filter(urls -> urls.match(url))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("해당하는 url이 없습니다"));
}
private boolean match(final String url) {
return this.url.equals(url);
}
public String getMatchResult() {
return matchResult;
}
URL 클래스에 내부 메서드들을 만들어봤어요!
matchOf 메서드를 설명하자면.!
- Enum 객체들을 순회하면서
- 매핑되는 url이 있다면
- 해당 객체를 반환하고, 없다면 예외를 던집니다
이렇게 되면 원본 mapping 메서드를 이렇게 바꿀 수가 있답니다!
public String urlMapping(String url) {
return URL.matchOf(url)
.getMatchResult();
}
너무나 간단해졌죠?
내가 아무리 url을 늘리고 지우고 무슨짓을 해도, urlMapping 메서드는 절대로 바뀌지 않습니다.
Why OCP?
프로그래머가 OCP를 준수해야 되는 이유는
- 기존 Code를 유지보수하기 쉽게 만들어 줍니다
- 기능 확장성에 대해 고려했을 때, 너무나 편해집니다
SRP(Single Responsibility Principle)에 이어서 OCP 또한 정말정말 중요한 원칙이니까
개발할 때 습관적으로 생각해보는 것을 추천합니다.!!
참고
개방 폐쇄 원칙
'Developer > Kotlin & Java' 카테고리의 다른 글
SOLID - ISP(Interface Segregation Principle)란? : 인터페이스 분리 원칙 (6) | 2019.11.26 |
---|---|
SOLID - LSP(Liskov Substitution Principle)이란? 리스코프 치환 원칙 (0) | 2019.11.22 |
SOLID - SRP(Single Responsibility Principle) : 단일책임 원칙 (2) | 2019.11.17 |
[자바] 리플렉션 - Reflection (0) | 2019.04.11 |
[자바] 동기화 처리 - Synchronized 와 Asynchronized (2) | 2019.04.10 |