객체지향 5원칙 : 5.의존성 역전의 원칙 , 의존성 주입이란 무엇인가..
- 프로그래밍/개발새발
- 2019. 9. 9.
'나는 그것을 더 이상 할 수 없어'라고 말하지 마라. '어디 한번 해보자' 라고 말하라.
드디어 객체지향OOP의 마지막 기본원칙...
기본이 제일 어렵ㅠㅠ...시작하겠습니다.
의존성 역전의 원칙 Dependency Inversion Principle(DIP)
1.개요
- 하위클래스(저수준 구상클래스)가 상위클래스(고수준 추상클래스)에 의존을 해야하고, 상위 클래스는 하위클래스에 의존해서는 안됩니다.
- 의존성을 역전시키면 하위클래스는 상위클래스를 바라보기 때문에 어떤 변경없이 교체도 가능하다(전략패턴)
다들 이런 경험이 있을 것입니다.
프로젝트를 진행할 때, 기존의 레거시 코드가 잘못된 것을 알면서도 수정하지 않고 그대로 둔 경험 말입니다. 이 레거시 코드를 수정함으로써 생길 예상치 못한 문제들과, 재사용을 위해 분리를 하기에는 너무 얽켜 있어 모듈화하기 힘든 경우. 이런 경우들이 서로의 의존성이 너무 강해서 문제가 생기는 것들입니다. 의존성이 강하다는 말은 한 개의 모듈을 수정할 때, 그것에 의존하는 모듈 또한 변경이 일어나야 하기 때문입니다.
그래서 상위클래스와 하위클래스는 추상클래스에 의해 의존해야한다…라는 의미입니다.
요점은 의존성을 주입함으로써 의존성을 줄이는 것입니다.
2.예시
1)우선적으로 클래스 안좋은 예시를 먼저 보겠습니다.
//안좋은 방법
class netRequest{
생성자{
this.reqMethod = [‘http’];
}
}
class netTracker{
생성자(data){
this.data = data;
this.requester = new netRequest();
}
function requestExcute(){
}
}
netTracker = new netTracker(['havana', 'coffe']);
netTracker. requestExcute ();
이 경우 netTracker는 netRequest(http)에 의존적이다.
만약에 this.reqMethod가 다른걸로 추가될 경우는 어떻게 해야하는가….
2)아래의 좋은 예시를 한번보자
class netTracker{
생성자(data, requester){
this.data = data;
this.requester = requester;
}
function requestExcute(){
}
}
class netRequestH{
생성자{
this.reqMethod = [‘http’];
}
}
class netRequestW{
생성자{
this.reqMethod = [‘WP’]
}
}
//외부에서 의존성을 주입해줌
netTracker = new netTracker (['apples', 'bananas'], new netRequestW ());
netTracker.requestExcute();
// new netRequestW ()처럼, 다른 모듈로 바꾸기 용이하게 코딩
-----
3.마무리
외부에서 의존성을 주입해준다는 개념을 잘 이해해야합니다.
예제는 쉽지만, 막상 이런 상황이 오면 이렇게 코딩하는게 쉬운일은 아니지만 oop의 기본적인 규칙을 생각하면서 코드를 짜다보면 정말 프로페셔널한 프로그래머가 될수 있지 않을까 합니다.
참고사이트
http://www.nextree.co.kr/p6960/
https://blog.martinwork.co.kr/theory/2017/12/10/oop-solid-principle.html
'프로그래밍 > 개발새발' 카테고리의 다른 글
goaccess설치 및 사용방법 오류 해결 - 아파치 로그 웹통계 툴 (0) | 2019.09.26 |
---|---|
awstate 설치(자세히/오류해결포함) 및 권한설정-아파치 로그 웹통계 툴 (0) | 2019.09.25 |
객체지향 5원칙 : 4.인터페이스 분리의 원칙, 예시를 보며 이해하는 과정.. (0) | 2019.07.03 |
객체지향 5원칙 : 3.리스코브 치환의 원칙, 적용방법!쉬운 예시! (0) | 2019.06.25 |
객체지향 5원칙 : 2.OCP 개방폐쇄 원칙, "폐쇄와 확장"은 이렇게! (0) | 2019.06.21 |