성능 변화가 Liskov 대체 원칙을 위반합니까?


14

내가 가지고 있다고 말하십시오 :

interface Thing
{
    GetThing();
}

class FastThing : Thing 
{
    public int GetThing()
    {
        return 1;
    }
}

class SlowThing : Thing
{
    public int GetThing()
    {
        return GetThingFromDatabase();
    }
}

이것이 Liskov 대체 원칙을 위반합니까?


GetThingFromDatabase()논란의 여지가있을만큼 느리지 않습니다. Factor4096BitPublicKey();return 1;좀 더 재미있게 만들 것입니다.
Patrick


1
당신이 교체하는 경우 FastThingSlowThing는 LSP는 적용되지 않습니다. Thing::GetThing"매우 빠릅니다"라는 설명을 추가 하면 질문을 토론 할 수 있습니다.
Cephalopod

답변:


14

정말 달려 있습니다. 예를 들어 일부 인터페이스에는 복잡성 제약 조건이 있습니다 (프로그래밍 방식으로 적용 할 수 없음). 가장 기본적인 경우는 "GetThing ()이int . 즉, 정지합니다"입니다.이 경우 대답은 "아니오"입니다. 두 버전의 GetThing ()이 정지되고 int가 반환됩니다.

그러나 많은 인터페이스가 복잡하거나 일정한 시간에 성능 보증을 암시하거나 명시 적으로 언급했습니다. 예를 들어, C ++ 표준에서 표준이 명시 적으로 허용하는 경우를 제외하고 차단 호출로 라이브러리를 구현하는 것은 불법입니다.


3
유형 검사를 통해 성능을 강화할 수있는 것은 아닙니다. 구현 자 / 라이브러리 관리자의 약속입니다.
dietbuddha

3
내 대답에 명시 적으로 언급 했습니까?
DeadMG

1
내 요점은 Liskov에 대해 더 이상 이야기하지 않는 기준에 유형 이외의 다른 유형을 포함하자마자 유형에 따라 다릅니다. 다르게 수행되는 물체를 제거하지 않는 "연습"은 좋을지 모르지만 Liskov 자체는 그것에 대해 아무 말도하지 않습니다.
dietbuddha

7
Liskov는 Derived의 경우 Base가있는 어느 곳에서나 사용할 수 있어야한다고 말합니다. Base가 특정 성능 또는 특성을 보장하는 경우에는 사실이 아닙니다. 예를 들어 파생 된 블록 인 경우 교착 상태가 발생할 수 있습니다.
DeadMG

8

TL; DR : 아니요

에 따르면 "불변 및 제약 조건을 사용하여 행동 하위 유형" (원리의 형식화) 그것은 주로이 유형을 객체의 "안전"속성과 관련됩니다. 유형 정보의 맥락 내에서만 대체 가능성을 관리하는 속성. 객체 유형은 성능과 직교합니다. 따라서 성능 차이는 Liskov 대체 원칙을 위반하지 않습니다.


3
나는 그 논문을 간략히 살펴 보았지만 타이밍 제약을 공식적으로 증명할 수 없다고 확신하십니까? 그리고 Liskov가 타이밍 제약을 포함하여 말로 표현하면 실제 프로그래밍과 관련이있을 수있는 고전적인 LSP의 확장으로 볼 수 있습니다.
Doc Brown

@ 닥 브라운 (Doc Brown) : 타이밍이 물체를 대체하기위한 고려로서 유용한 지의 여부는 Liskov와 직교한다. 그것을 별도의 교훈으로 추가 할 수는 있지만 Liskov의 일부가 될 수 없으며 결코 포함되지 않을 것입니다. 부울 논리 방정식을 사용하고! False라고 말하는 것이 빠르면 True로만 대체 할 수 있습니다. 속도는 수학이나 논리와 관련이 없습니다.
dietbuddha

반례 :이 코드는 Java의 EDT 또는 노드의 이벤트 루프에서 호출됩니다. 느린 버전의 성능이 크게 느려질수록 소프트웨어가 손상됩니다. 이 질문에 대한 정답은 "아마도 예외는 아닙니다"라고 생각합니다.
user949300

6

인터페이스는 어떤 보증을합니까? GetThing보증을하지 않기 때문에 하위 유형은이를 준수 할 필요가 없습니다.

인터페이스가 같은 것을 있었다면 GetThingInLinearTime경우 또는 기본 유형은 가상이며, 기본 구현은 더 나쁜 알고리즘의 복잡성이 것을 만드는 하나의 복잡성 LSP를 위반.


4

소프트웨어의 성능은 Liskov 대체 원칙과 아무 관련이 없습니다.

원칙은 하위 유형의 대체 및 OOP 용어로만 해당 개체를 대체 할 때의 행동 영향과 관련이 있습니다.

입력과 출력은 getThing()두 경우 모두 동일하게 유지되며 느리고 빠른 경우 모두 객체를 동일한 상태로 만들 수 있습니다.


1

Liskov 대체 원칙 자체가 구체적으로 말하는 것이 중요합니까? 하위 유형이 상위 유형 소비자의 기대를 위반하면 LSP가 더 제한적인지 여부에 관계없이 나쁜 것으로 보입니다.

내 생각에, 추상화 소비자에 대한 모든 합리적인 기대가 하위 유형에 의해 충족되는지 여부는 LSP의 좋은 일반화 인 것 같습니다.

그러나 게시 한 예제와 일반적으로 Java 인터페이스를 사용하는 경우 Thing인터페이스 소비자 가 빠르거나 느려 야하는지에 대한 합리적인 기대가 있는지 명확하지 않습니다 . 인터페이스의 javadocs에 어떤 오퍼레이션이 빠른지에 관한 언어가 포함되어 있다면, 성능상의 문제에 대한 논거가있을 수 있습니다. 그러나 Java 규칙 은 다양한 구현에서 다른 성능 특성을 갖는 것이 확실합니다.


2
내가 알 수있는 한, 게시 된 예제는 Java가 아닙니다
gnat

0

Bob 아저씨는 LSP 위반에 3 명이 필요하다는 매우 비슷한 질문에 답변했습니다.

T를 사용하지만 S의 인스턴스가 제공되는 유형 T, 하위 유형 S 및 프로그램 P

이 질문는 언급하지 않는다는 점에서 그는에 응답 한 것과 유사한 구조를 가지고 내가 추측 벤처 것입니다 P 사용하고 T를 어떤 거동 P의 예상하는합니다.

그의 대답은 여기에서 찾을 수 있습니다 . (아래로 스크롤하여 Robert Martin이라는 사용자의 답변을 찾아야합니다.)


1
이것은 질문에 어떻게 대답합니까?
gnat

@gnat 질문이 불완전하기 때문에. LSP 위반을 확인하려면 3 명이 필요합니다. 그 중 그는 2 명의 당사자 만 제공했습니다.
TMc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.