티스토리 뷰

"책을 보면서 정리한 내용입니다." 틀린 내용이 있다면 댓글 부탁드립니다.

chapter3에서는 객체지향 개발 원칙 중 OCP(개방 폐쇄 원칙)에 대한 챕터이다.

이번 챕터는 chapter2에서 구현한 코드를 OCP 원칙을 준수하여 코드의 중복을 줄이는 방식으로 진행한다.

예외, 빌드도구에 대한 이야기도 나오지만 이는 따로 정리하고 OCP를 준수하여 어떻게 코드의 중복을 줄이는지에 대해 중점적으로 적을 것이다.


OCP(Open Closed Principle) - 개방 폐쇄 원칙??

코드의 확장에는 열려있어야 하고 변경에는 폐쇄적이야 한다는 원칙

  • 의존하는 클래스의 코드에 기능이 추가되거나 변경이 일어난다하더라도 사용하는 코드의 변경은 최소화가 되어야한다는 것이다.
  • 코드의 유연성을 추가하고 유지보수성을 개선하는데 도움을 준다.

 

먼저 OCP가 적용되지 않았을 경우의 코드를 살펴보자.

만약 특정 월에 대한 거래내역을 찾는다는 요구사항이 추가된다면 반복문내에 if문의 조건을 아래와 같이 추가해야 할 것이다.

당연히 동작은 되지만 이러한 방식에는 한계가 있다.

  • 여러 속성을 조합할수록 코드가 점점 복잡해진다.
  • 반복 로직과 비즈니스 로직이 결합되어 분리하기가 여러워진다.

코드의 중복 문제도 발생할 수 있다.

가령, 다른 조건에서의 거래내역을 찾는 요구사항이 추가된다면 ArrayList를 만들고 반복문을 통해 조건에 맞는 거래내역을 찾는 등,  중복되는 로직이 존재하는 메서드를 작성해야할 것이다.

 

즉, 요구사항이 자주 바뀔수록 영향이 커진다.


문제 해결

이러한 문제는 함수형 인터페이스를 통해 해결할 수 있다.

 

"함수형 인터페이스"

자바에서 인터페이스를 정의하는데 추상메서드가 하나 뿐인 인터페이스를 함수형 인터페이스라고 한다. 

대게 함수형 인터페이스 클래스 레벨에는 @FuntionalInterface 어노테이션을 붙여줌으로써 해당 인터페이스 조건에 맞는지 검사하도록 한다.

자바에서 기본제공하는 함수형 인터페이스

 

먼저 함수형 인터페이스를 정의한다.

그리고 위의 인터페이스를 구현한 구현체 클래스를 작성한다.

구현체

그리고 아래와 같이 조건을 외부에서 선택해서 사용할 수 있는 범용API를 작성할 수 있다. 

그러면 필터에 대한 조건이 변경되거나 다른 필터가 추가되더라도 이를 사용하는 코드의 변경은 없게 할 수 있다.


책에서 설명하는 여러가지 지식

"명시적API vs 암묵적API"

  • 명시적API란 메서드가 구체적으로 정의되어있는 것을 뜻한다.
    • 메서드이름이 서술적으로 되어있고 기능이 명확하다.
    • 위 코드 사진 중 OCP 활용해서 리팩토링하기 전 메서드이다.
    • 명시적API의 경우 메서드 자체적으로 어떤 동작을 수행하는지 잘 설명되어 있고, 사용하기 쉽다.
    • 메서드 이름을 서술적으로 만들었기에 쉽게 이해할 수 있다.
    • 하지만 특정 상황에 기능이 국한되어 있고 다른 요구사항이 추가된다면 코드의 수정 또는 비슷한 API를 또 만들어야 할 수도 있다.
  • 암묵적API란 API의 기능이 구체적이지 않은 API를 뜻한다.
    • OCP를 활용하여 리팩토링한 코드를 보면 어떠한 조건에 의해 입,출금기록을 걸러내긴하지만 조건을 외부에서 정해주기에 암묵적API라고 할 수 있다.
    • 처음에 문서화를 잘해놓아야 한다.
    • 여러 상황에 대한 기능을 단순한 API 하나로 처리할 수 있어 코드 중복 같은 안티패턴을 예방할 수 있다.

둘 중에 어떠한 것을 사용해야할까 한다면 정답은 없다.

정말 흔히 사용하는 연산이라면 명시적API로 사용자가 쉽게 이해하고 사용하도록 이를 명시적 API로 만드는 것이 합리적인 방법이고 이외의 API는 암묵적 API로 만드는 것도 좋다.

"도메인 클래스 vs 원시값"

메서드의 값을 반환할 때 어떠한 것이 더 좋을까?

int, double과 같은 원싯값을 결과로 반환하는 것은 좋은 방법이 아니다.

원싯값으로는 다양한 결과를 반환할 수 없어 유연성이 떨어지기 때문이다.

이럴경우 원싯값을 감싸는 도메인 클래스를 활용하면 좋다.


Chapter3 정리

  • OCP를 이용하면 코드를 바꾸지 않고도 메서드나 클래스의 동작을 바꿀 수 있다.
  • OCP를 이용하면 기존 코드를 바꾸지 않으므로 코드가 망가질 가능성이 줄어들며, 기존 코드의 재사용성을 높이고, 결합도가 높아지므로 코드 유지보수성이 개선된다.
  • 너무 많은 메서드를 포함하는 인터페이스는 복잡도와 결합도를 높인다.
  • 너무 세밀하게 나눈 인터페이스는 응집도를 낮춘다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함