Open Closed Principle, 개방 폐쇄 원칙

Ss·2024년 4월 13일

SOLID 원칙의 앞글자만 읊을 수 있던 수준에서 좀 더 발전하고 실제로 활용을 하기위해 공부해보았다.

Open Closed Principle, 개방 폐쇄 원칙

단일 책임 원칙에 이어 이름으로도 어느정도 짐작이 가는 원칙이다.

확장에는 열려있으며, 수정에는 닫혀있어야 한다 라는 의미이다.

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을 상속받는 어떤 클래스던지 기존 코드를 수정 할 일 없이 자유롭게 추가를 할 수 있을 것이다.

0개의 댓글