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

소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.

<br />
기존의 코드를 변경하지 않으면서, 기능을 추가 할 수 있도록 설계하여야 합니다.

<br />

<hr />

#Before

<img alt="" src="https://file.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://file.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()메소드를 하위 클래스에서 구현합니다.

0
이전 댓글 보기
등록
TOP