오늘도 더 나은 코드를 작성하였습니까?

Open-Closed Principle 본문

디자인패턴

Open-Closed Principle

hik14 2021. 12. 24. 16:50

개방-폐쇄 원칙(OCP, Open-Closed Principle)은 '소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다'는 프로그래밍 원칙이다.

 

Extention -Open

Modification - Closed

 

다음과 같이 동물을 모델링한 객체가 있다. 

const val ANIMAL_TYPE_DOG = 0
const val ANIMAL_TYPE_CAT = 1

class Animal(private val type: Int){
    
    fun roar() = 
        when(type){
            ANIMAL_TYPE_DOG -> println("멍멍")
            ANIMAL_TYPE_CAT -> println("야옹")
            else -> Exception("알수 없는 동물이다.")
        }
}

fun main() {

    val dog = Animal(type = 0)
    val cat = Animal(type = 1)

    println(dog.roar())
    println(cat.roar())
}

현재 상황에서 새로운 동물 돼지를 추가 하려고 한다면,  1개의 글로벌 변수 와 roar함수의 when의 새로운 분기가 추가 되어야 할것이다.

위의 Animal class는 새로운 동물 추가(확장) 하려고 할때, 상당히 까다롭게 만들어져 있다. 즉, 확장에 있어 닫혀 있는 구조이며, 반드시 수정을 거쳐야만 확장을 할수 있는 상태이다.  그렇기 때문에 추후에 프로그램이 커진다면, 매우 불편하고 큰 문제를 야기 할 수 있다.

 

일반적으로 개방 폐쇄의 원칙은 추상클래스 및 인터페이스의 정의를 통해 새로운 타입 확장에 있어 편리하고, 기존의 코드를 크게 수정없이 새로운 타입을 추가 할수 있다.  

 

새롭운 타입을 추가 확장할 경우 변화가 일어날 부분을 추상화 또는 인터페이스로 정의함으로 유연하게 할수 있습니다.