전제 조건 강화와 후 조건 약화는 Liskov 대체 원칙을 어떻게 위반합니까?


19

나는 Liskov의 대체 원칙 이 다음과 같은 경우에 위반 된다는 것을 읽었습니다 .

  1. 전제 조건이 강화되거나

  2. 사후 조건이 약화

그러나 나는이 두 가지 점이 Liskov 대체 원칙을 어떻게 위반하는지 아직 완전히 알지 못합니다. 예를 들어 설명해 주시겠습니까? 구체적으로, 위의 조건 중 하나가 어떻게 서브 클래스 객체를 수퍼 클래스 객체로 대체 할 수없는 상황을 야기합니까?

답변:


29
  1. 기본 클래스가 멤버 int와 작동한다고 가정하십시오. 이제 하위 유형에는 int가 양수 여야합니다. 이것은 전제 조건이 강화되었으며 이제 음수 정수로 전에 완벽하게 작동하는 모든 코드가 손상되었습니다.

  2. 마찬가지로, 동일한 시나리오를 가정하지만 기본 클래스는 멤버가 호출 된 후 긍정적이되도록 보장하는 데 사용됩니다. 그런 다음 하위 유형은 음수 정수를 허용하도록 동작을 변경합니다. 사후 조건이 유지되지 않기 때문에 오브젝트에서 작동하고 사후 조건이 양수라고 가정하는 코드가 이제 끊어졌습니다.

이것들은 물론 사소한 예이지만 개념은 유지됩니다. 파일 / 데이터베이스 연결을 열어 두는 것과 같은 문제는 문제를 유발하는 완화 된 사후 조건의 예입니다.


1

여기에 이미지 설명을 입력하십시오

불변-모든 하위 유형에서 변경되지 않은 SelfDrivingVehicle의 템플릿, 즉 재정의 된 동작을 실행하여 대상에 도달하는 순서입니다.

여기에 하나 이상의 방법을 가정하자

           -List<SelfDrivingVehicle> vehicles 
           +Add(SelfDrivingVehicle vehicle)
            vehicles.add(vehicle)

전제 조건-SelfDriveVehicle에는 기본 유형에 차량이 없으며 (여기서는 컨텍스트가 추가 임) 속성 차량을 변경하고 명시 적으로 강화하여 하위 유형에 의해 변경 될 수없는 약화 된 전제 조건이 있습니다. 하위 유형 중 하나만 추가를 호출 할 수 있습니다.

사후 조건-추가가 호출되면 기본 유형은 강화 된 사후 조건에 있으며 차량의 가치를 변경하여 하위 유형으로 약화 될 수 없습니다.

기본 동작 상태는 동작 추가가 호출되면 원래 상태로 돌아갑니다.


-1

이 예제는 거의 맞지 않았지만 Square / Rectangle 또는 Circle / Ellipse 가능성을 고려하십시오. 길이와 너비가있는 객체를 정의하는 기본 클래스 Rectangle이 있다고 가정합니다. Rectangle 클래스를 상속하는 Square 클래스가있는 경우 길이나 너비를 변경하면 해당 클래스가 변경되어야하는 규칙이 setter / getter에 있습니다. 이러한 치수 요구 사항은 사각형으로 대체 된 사각형에 이러한 치수 요구 사항이 없기 때문에 전제 조건을 강화합니다. Rectangle이 정사각형을 상속 받도록 상속을 반전한다고 가정하면 Rectangle이 독립적으로 동작 할 수 있도록 차원 요구 사항을 완화하여 사후 조건을 약화시킬 수 있습니다.

그러나 차원 변경 기능을 제거하려는 경우 사각형이나 사각형이 차원을 변경할 수없는 경우 상속에 관계없이 사전 및 사후 조건이 동일하므로 대체 원칙이 적용됩니다. 둘 다 길이가 있고 너비가 있으며 그 값을 변경할 수 없습니다.

심판 : Wikipedia-http://en.wikipedia.org/wiki/Liskov_substitution_principle


1
불행히도 그 예는 공식 검증과는 아무런 관련이 없습니다. 계약이 없습니다.
Frank Hileman 17시
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.