switch(자동차 종류)
case : '아우디' // 아우디 엔진 오일 교한하는 과정
case : '벤츠' // 벤츠 엔진 오일 교한하는 과정
end switch
- BMW 추가시 case : 'BWM' //를 더 추가 해야한다 (더 많은 부분을 수정할 경우도 생긴다)
이런 것이 추상화가 안되있다는 것이다. 이미 추상화가 되있다면
void changeEngineOil(Car c){
c.changeEngineOil();
}
- 기존 코드를 수정할필요가 없다 OCP준수
- 코드 확장이 용이하다 OCP 준수
- 엔진오일 세부 로직을 몰라도 상관없다 캡슐화 준수
- 엔진 세부 로직을 변경하게되면 해당 자동차의 세부 구현클래스만 변경하면된다 SRP 준수
- 서브 클래스와 슈퍼 클래스 사이는 '역할 수행' 관계가 아니어야 한다.
- 한 클래스의 인서턴스는 다른 서브 클래스의 객체로 변환할 필요가 절대 없어야 한다.
- 서브 클래스가 부모 클래스의 책임을 무시하거나 재정의 하지 않고 확장만 수행해야한다.
- 서브 클래스가 단지 일부 기능을 재사용할 목적으로 유틸리티 역학을 수행하는 클래스를 상속하지 많아야 한다
- 자식 클래스가 '역할', '트랜잭션', '다바이스' 등을 특수화 해야한다.
사람 Super
운전자 Sub 회사원 Sub
- 자식 클래스가 부모 클래스의 역할 중 하나로 표현해지는 지를 점검해보자. '운전자'는 어떤 순간에 '사람이' 수행하는 역학의 하나다. 마찬가지로
회사원도
사림이 어떤 순간에 수행하는 역할의 하나다. 따라서 사람과 운전자나 사람과 회사원은 상속 관계로 표현되어서는 안된다.
- 운전자는 어떤 시점에서 회사원이 될 필요가 있으며 회사원은 역시 운전자가 될 필요가 있으며 회사원 역시 운전자가 될 필요가 있다. 가령 자신이 일하는 회사로 출퇴근 하는 동안에 운전자로서 역학을 수행하며 회사에서 있을 때 회사원으로 역학을 수행한다. 어떤 경우 객체의 변환 작업이 필요 하므로 규칙에 위배된다. 가령 평생 운전자 역할만 하던가 회사원 역할만 수행한다면 해당 그림 처럼 표현하는 것도 나쁘지 않다. 그러나 대부분의 사람은 한 역할에 고정되지 않고 시점에 따라 다른 역할을 수행하는 경우가 많다.
- 즉 InstanceOf, TypeCasting 이 이루어지면 안된다는 것이다. 해당 객체가 어느 시점에서는 운전자 일 때, 어느 시점에서는 회사원일 때 그 시점 마다 InstanceOf, TypeCasting 작업이 이루어 진다. 이것은 좋지 않다
- 해당 규첵은 점검할 수 가 없다. '사람', '운전자', '회사원' 클래스 등에 어떤 속성과 연산이 정의도있는지 정보가 없기 때문이다.
- 단순히 재사용하는 목적으로 하지 않았으므로 준수한다.
사람 ----> Role
운전자 Sub 회사원 Sub
이 처럼 사람이 롤을 갖고 해당 롤에 맞는 행위를 하게끔 하는것이 바람직하다