SOLID 원칙의 앞글자만 읊을 수 있던 수준에서 좀 더 발전하고 실제로 활용을 하기위해 공부해보았다.
단일 책임 원칙에 이어 이름으로도 어느정도 짐작이 가는 원칙이다.
확장에는 열려있으며, 수정에는 닫혀있어야 한다 라는 의미이다.
abstract class Phone {
void call();
void powerOff();
void powerOn();
}
전화기 라는 클래스에는 간단하게 전화, 전원 켜고 끄는 기능이 있다.
이때 phone을 상속하는 galaxy와 iphone이 새로 생겼다 가정을 해보자.
void main() {}
abstract class Phone {
void call() {
if (this is Iphone) {
print('ring ring');
} else if (this is Galaxy) {
print('따르릉 따르릉');
}
}
void powerOff() {
if (this is Iphone) {
print('power off');
} else if (this is Galaxy) {
print('전원이 꺼집니다.');
}
}
void powerOn() {
if (this is Iphone) {
print('power on');
} else if (this is Galaxy) {
print('전원이 켜집니다.');
}
}
}
class Iphone extends Phone {}
class Galaxy extends Phone {}
이때 새로운 핸드폰 샤오미가 생겨서 새로 추가를 하려면
class Xiaomi extends Phone {}
클래스를 추가하고 다시 phone클래스에 조건문을 추가를 해야한다.
이때 개방 폐쇄 원칙에 위배 된다고 말 할 수 있다.
추가가 될때마다 수정을 해야하며 그로인해 확장에 개방적이지가 않다. 따라서 위의 코드가 아닌
추상 메서드로 작성을 하고 각 클래스에서 담당하게 작성해야한다.
void main() {}
abstract class Phone {
void call();
void powerOff();
void powerOn();
}
class Iphone extends Phone {
void call() {
print('ring ring');
}
void powerOff() {
print('power off');
}
void powerOn() {
print('power on');
}
}
class Galaxy extends Phone {
void call() {
print('따르릉 따르릉');
}
void powerOff() {
print('전원이 꺼집니다.');
}
void powerOn() {
print('전원이 켜집니다.');
}
}
class Xiaomi extends Phone {
void call() {
print('铃声 铃声');
}
void powerOff() {
print('开机');
}
void powerOn() {
print('关机');
}
}
이렇게 추상 메서드로 작성을 하고 상속받는 곳에서 각각 구현을 하면 phone을 상속받는 어떤 클래스던지 기존 코드를 수정 할 일 없이 자유롭게 추가를 할 수 있을 것이다.