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