상속의 오용을 막기 위해 상속의 사용을 엄격하게 제한하는 규칙
자식 클래스와 부모 클래스 사이는 '역할 수행' 관계가 아니어야 한다.
한 클래스의 인스턴스는 다른 서브 클래스의 객체로 변환할 필요가 절대 없어야 한다.
자식 클래스가 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행해야 한다.
자식 클래스가 단지 일부 기능을 재사용
할 목적으로 유틸리티
역할을 수행하는 클래스를 상속하지 않아야 한다.
자식 클래스가 '역할', '트랜잭션', '디바이스' 등을 특수화
해야 한다.
부모 클래스 : 사람
자식 클래스 : 운전자
회사원
Q. 자식 클래스가 부모 클래스 사이의 '역할 수행' 관계 인가?
A.
=> 사람과 운전자나 사람과 회사원은 상속 관계로 표현되어서는 안 되므로 규칙에 위배된다.
Q. 한 클래스의 인스턴스는 다른 서브 클래스의 객체로 변환할 필요가 절대 없는가?
A. '운전자'는 어떤 시점에서 '회사원'이 될 필요가 있으며 '회사원' 역시 '운전자'가 될 필요가 있다. 가령 자신이 일하는 회사로 출퇴근하는 동안에는 '운전자'로서의 역할을 수행하며, 회사에 있을 때는 '회사원'으로서의 역할을 수행한다.
=> 객체의 변환 작업이 필요하므로 규칙에 위배된다.
Q. 자식 클래스가 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행하는가?
A. 점검 불가
=> '사람', '운전자', '회사원' 클래스 등에 어떤 속성과 연산이 정의되었는지 정보가 없다.
Q. 자식 클래스가 단지 일부 기능을 재사용할 목적으로 유틸리티 역할을 수행하는 클래스를 상속하지 않는가?
A.
=> 기능만 재사용할 목적으로 상속 관계를 표현하지는 않았으므로 규칙을 준수한다.
Q. 자식 클래스가 '역할', 트랜잭션', '디바이스' 등을 특수화 하는가?
A.
=> 슈퍼 클래스가 역할, 트랜잭션, 디바이스를 표현하지 않았으므로 규칙에 위배된다.
따라서, 피터 코드의 규칙에 따라 위와 같은 관계는 상속을 사용하지 않고 집약(혹은 연관) 관계
를 사용하는 편이 좋다.
Reference