OCP (Open Close Principle)
OCP, Open-Closed Principle (개방-폐쇄 원칙)
소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.
<br />
기존의 코드를 변경하지 않으면서, 기능을 추가 할 수 있도록 설계하여야 합니다.
<br />
<hr />
#Before
<img alt="" src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/MMVZAS181224235522.JPG" style="width:470px" /><br />
AreaCalculator 클래스는 shape들의 넓이의 합을 계산하고.<br />
ConsolePrinter 클래스는 결과를 출력합니다.<br />
<br/>
<br/>
<br/>
AreaCaclualotr.java
package package com.cglee079.ocp;
import java.util.ArrayList;
import java.util.Iterator;
public class AreaCalculator {
private ArrayList shapes = new ArrayList();
private double areasum;
public double getAreasum() {
return areasum;
}
public void calcuate(){
Iterator iter= shapes.iterator();
areasum = 0.0;
while(iter.hasNext()){
Shape curShape = iter.next();
areasum += curShape.area();
}
}
public void addShape(Shape s){
shapes.add(s);
}
}
<br/>
OCP원칙이 위배됨을 보여줍니다.
위의 클래스는 넓이의 합을 계산합니다.
예를 들어, 개발자는 이 프로그램에 넓이의 곱을 하는 연산을 추가하려고 합니다.<br />
여러 가지 방법으로 AreaCalculator 클래스의 코드를 수정할 것입니다.<br />
(예를 들어, 연산 과정에 if문을 추가할 수도 있습니다.)<br />
OCP원칙의 위배되어 새로운 기능을 추가하는데 있어서 수정을 해야함을 보여줍니다.
<br />
<br />
<hr />
#After
<img alt="" src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/1Y0TXO181224235522.JPG" style="width:720px" />
OCP원칙을 적용한 설계는 다음과 같이 연관 관계를 수정 할 수 있습니다.<br />
가장 중요한것은 무엇이 변하는 것인지를 확인 해야하는 것입니다.<br />
클래스는 변화의 단위이다.
이때 변화는 "연산"입니다.<br />
곱을 하는 연산과, 덧셈을 하는 연산 두 가지의 변화가 있습니다.<br />
하나의 연산이 곧 클래스의 단위인 것입니다.<br />
<br />
OCP원칙에 위배되지 않음을 확인해봅니다.<br />
예를 들어, 넓이의 가장 큰 값을 구하는 연산을 추가해 보려고 합니다.<br />
AreaCalculator를 상속받는 AreaMaxCalculator 클래스를 생성해주면 될 것입니다.<br />
새로운 기능을 추가하더라도, 기존의 코드는 전혀 수정되지 않음을 보여줍니다
<br/>
<br/>
AreaCalcualtor.java
package com.cglee079.ocp;
import java.util.ArrayList;
public abstract class AreaCalculator {
protected ArrayList shapes = new ArrayList();
protected double areasum;
public abstract void calculate();
public double getAreasum() {
return areasum;
}
public void addShape(Shape s) {
shapes.add(s);
}
}
<br/>
<br />
AreaProdCalculator.java
package com.cglee079.ocp;
import java.util.Iterator;
public class AreaProdCalculator extends AreaCalculator {
public void calculate() {
Iterator iter = shapes.iterator();
areasum = 1.0;
while (iter.hasNext()) {
Shape curShape = iter.next();
areasum *= curShape.area();
}
}
}
<br/>
상위 클래스인 AreaCalculator 클래스를 상속받습니다.<br />
추상메소드인 calculate()메소드를 하위 클래스에서 구현합니다.