SOLID 원칙이란?
Single Responsibility Principle |
→ |
단일 책임 원칙 |
Open-Closed Principle |
→ |
개방-폐쇄 원칙 |
Liskov Substitution Principle |
→ |
리스코프 치환 원칙 |
Interface Segregation Principle |
→ |
인터페이스 분리 원칙 |
Dependency Inversion Principle |
→ |
의존성 역전 원칙 |
Open-Closed Principle
개방-폐쇄 원칙
소프트웨어 개체는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다
열려 있다(Open)
- 새로운 기능을 추가 할 수 있으며, 추가 시 큰 힘을 들이지 않고 추가
닫혀 있다(Close)
- 수정에 대해서는 폐쇄적이여야함
- 코드를 수정해도 이를 사용하는 다른 곳에 영향을 미치지 않아야함 (유연하게 대응할 수 있어야함)
[예제 코드]
data class Fruit (val name:String)
// 과일을 받아 과일의 색을 알려 주는 클래스
class InformationOfFruits {
fun getColorOfFruit(fruit : Fruit) {
if(fruit.name == "사과") {
println("빨간색")
} else if (fruit.name == "바나나") {
println("노란색")
}
}
}
fun main(arg: Array<String>) {
val info = InformationOfFruits()
val apple = Fruit("사과")
val banana = Fruit("바나나")
info.getColorOfFruit(apple) // 빨간색
info.getColorOfFruit(banana) // 노란색
}
단순히 사과랑 바나나만 있다면 크게 문제가 없을 것이다.
하지만 귤, 딸기, 두리안, 파파야 등 다른 여러 과일들이 필요하다면?
불필요한 if문이 남발 될 것이며 그를 통해 추가 될 때마다 코드를 변경 해줘야하고 한 눈에 알아보기도 어렵다.
interface Fruit {
fun getColorOfFruit(){}
}
class Apple : Fruit {
override fun getColorOfFruit() {
super.getColorOfFruit()
println("빨간색")
}
}
class Banana : Fruit {
override fun getColorOfFruit() {
super.getColorOfFruit()
println("노란색")
}
}
class Tangerine : Fruit {
override fun getColorOfFruit() {
super.getColorOfFruit()
println("주황색")
}
}
class Papaya : Fruit {
override fun getColorOfFruit() {
super.getColorOfFruit()
println("초록색")
}
}
class InformationOfFruits {
fun getColorOfFruit(fruit : Fruit) {
fruit.getColorOfFruit()
}
}
fun main(arg: Array<String>) {
val info = InformationOfFruits()
val apple = Apple()
val banana = Banana()
val tangerine = Tangerine()
val papaya = Papaya()
info.getColorOfFruit(apple) // 빨간색
info.getColorOfFruit(banana) // 노란색
info.getColorOfFruit(tangerine) // 주황색
info.getColorOfFruit(papaya) // 초록색
}
공통적으로 사용하는 Fruit를 추상화하여 각 과일 class로 상속 하도록 했다.
이렇게 작성하게 되면 getColorOfFruit()는 변경에 닫히고, 추가적인 기능은 늘릴 수 있도록 된다.
interface Fruit {
fun getColorOfFruit(){}
fun getKorName(){}
}
class InformationOfFruits {
fun getColorOfFruit(fruit : Fruit) {
fruit.getColorOfFruit()
}
fun getKorName(fruit : Fruit) {
fruit.getKorName()
}
fun advantageOfFruits() {
println("1. 비타민이 많다.")
println("2. 맛있다.")
// ...
}
}
[참고]
https://steady-coding.tistory.com/378
'개발 공부 > 아키텍처' 카테고리의 다른 글
SOLID 원칙을 알아보자 5 : 의존성 역전 원칙 - kotlin (0) | 2023.08.25 |
---|---|
SOLID 원칙을 알아보자 4 : 인터페이스 분리 원칙 - kotlin (0) | 2023.08.22 |
SOLID 원칙을 알아보자 3 : 리스코프 치환 원칙 - kotlin (0) | 2023.08.09 |
SOLID 원칙을 알아보자 1 : 단일 책임 원칙 - kotlin (0) | 2023.07.29 |