본문 바로가기

소프트웨어 설계2원칙 『개방폐쇄 OCP』

by Recstasy 2020. 11. 27.

 

SOLID의 두번째는 개방폐쇄원칙OCP(Open Closed Principle)이다.

 

         [레고성]                                                                                         [모래성]

 

개방폐쇄 원칙은 『레고성』이다.

레고로 제작한 성은 확장에 열려 있고,

변경(레고블럭 자체)에 닫혀 있다.

 

 반면, 모래성은 확장에 취약하고,

변경은 거의 불가능하다.

모래성을 억지로 변경하고, 확장할 수는 있지만

 제작자 or 소수 예술가만이 가능하다.

 

 

│OCP『Open Closed Principle』

소프트웨어 설계는 레고블럭을 조립하듯이 해야만

확장에 유리하고, 변경에 닫혀 있는 구조를 만들 수 있다.

 

OCP를 구현하는 좋은 방법은 추상화이다.

추상화는 '금형틀'을 생각하면 이해하기 쉽다.

 

레고 금형틀

 

레고블럭은 각 종류별로 금형틀이 있다.

금형틀이 있기에 레고블럭을 수정하기 어렵다.

(레고블럭을 수정하려면 금형틀을 바꿔야하기 때문)

 

또한 금형틀이 있으면 색상만 바꿔서 무한정 찍어낼 수 있다.

(확장에 유리)

 

class AbstractBlock{
	constructor(){
    }
    colorize(color){
    	throw new Error('you have to implement the method something');
    }
    setName(name){
    	throw new Error('you have to implement the method something');
    }
    toString(){
    	return 'AbstractBlock'
    }
}

class BlockRedOne extends AbstractBlock{
	constructor(){
        super();
    }
    colorize(color){
    	return color;
    }
    setName(name){
    	return name;
    }
}

class BlockBlueOne extends AbstractBlock{
	constructor(){
        super();
    }
    colorize(color){
    	return color;
    }
    setName(name){
    	return name;
    }
}

//....(추가 반복)

 

위의 추상화를 다이어그램으로 표현하면 아래와 같다.

레고블록 클래스는 추상클래스를 상속받아 확장에 용이하고,

Client클래스가 수정되더라도 하위 Block클래스들은 영향을 받지 않는다.

 

 

Block클래스들은 추상클래스(AbstractBlock)에 의존한다.[상속]

즉, 추상클래스에서 변경이 발생하면,

하위Block클래스는 모두 변경된다.(의존)

이는, AbstractBlock클래스가 하위 Block클래스에

보호를 받고 있다는 의미와 같다.

 

다이어그램에서 의존성 관계는 간단하다.

 

화살표가 출발하는 클래스는 

화살표를 받는 클래스에 의존한다.

반대로 화살표를 받는 클래스는

화살표가 출발하는 클래스에 의해 보호를 받는다.(변경 x)

 

 

Client클래스는 Block클래스들이 의존하는 추상클래스를 합성한다.

사실 이 부분은 의존성 관계에서 설계상 문제를 발생시킬 수 있는데

인터페이스를 사용하지 않았기 때문이다.

(해당 부분은 의존성역전 원칙에서 정리)

 

개방-폐쇄 원칙에서는

반복되는 클래스의 기능을 추상화로 묶어서

확장에 용이하게끔 만든다는 부분만 기억하자.

댓글

최신글 전체

이미지
제목
글쓴이
등록일