绩效变化是否违反了《里斯科夫换人原则》?


14

说我有:

interface Thing
{
    GetThing();
}

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

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

这是否违反了《里斯科夫换人原则》?


GetThingFromDatabase()还不够慢,无法引起争议。Factor4096BitPublicKey();return 1;会让事情变得更有趣。
Patrick


1
如果更换FastThingSlowThing的LSP不适用。如果在注释中添加Thing::GetThing“非常快”,则可以讨论该问题。
Cephalopod

Answers:


14

这真的取决于。例如,某些接口具有复杂性约束(显然,这些约束不能通过编程方式强制执行)。最基本的情况是“ GetThing()给出一个int-即它停止”,在这种情况下,答案将是“否”-GetThing()的两个版本都停止并返回一个int。

但是,无论是在复杂性还是在固定时间内,许多接口都隐含或明确声明了性能保证。例如,在C ++标准中,除非标准明确允许,否则使用阻塞调用来实现该库是非法的。


3
通过类型检查无法强制执行性能。这是实施者/库维护者的承诺。
Dietbuddha

3
我在回答中明确指出了吗?
DeadMG

1
我的观点是,只要您在标准中包含除类型以外的任何内容,您就不再在谈论Liskov,因为它是特定于类型的。不对表现不同的对象进行消减的“做法”可能很好,但Liskov本身对此无话可说。
Dietbuddha

7
里斯科夫说,对于派生类,它应该可以在任何存在基础的地方使用。如果基地保证某些性能或特性,那可能就不正确了。例如,如果“派生”块,则可能存在死锁。
DeadMG

8

TL; DR:否

根据“使用不变式和约束的行为子类型 (原则的形式化),它主要涉及对象类型的“安全性”属性。仅在类型信息的上下文中控制可替换性的属性。对象类型与其性能正交。因此,性能上的差异并不违反《里斯科夫替代原则》。


3
我只看了一下那篇论文,但是您确定时序约束不能被正式证明吗?即使Liskov并不是说,包括时序约束在内的字眼也可以看作是经典LSP的良好扩展,它可能与实际编程相关。
布朗

@Doc Brown:计时是否有用以替代对象与Liskov正交。可以将其添加为一个明确的戒律,但它不可能而且永远不会成为Liskov的一部分。这就像拥有一个布尔逻辑方程式,并说!假只有在足够快的情况下才可以用True代替。速度与数学或逻辑无关。
Dietbuddha 2014年

反例:在Java的EDT或Node的事件循环中调用此代码。慢版本的根本上较慢的性能会半破坏该软件。我认为这个问题的正确答案是“可能不是,但也有例外”。
user949300 '16

6

接口能保证什么?以来GetThing不做任何保证,因此子类型不需要尊重它。

如果接口是类似的,GetThingInLinearTime或者基本类型是虚拟的,并且默认实现是一种复杂性,那么使算法复杂性恶化违反LSP。


4

该软件的性能与Liskov替代原理无关。

该原则与子类型的替换有关,以及仅用OOP术语替换该对象的行为影响。

getThing()这两种情况下,的输入和输出保持相同,并且慢速和快速都可能使对象处于相同状态。


1

里斯科夫替代原则本身具体说的话是否重要?如果子类型违反了超类型消费者的期望,那么不管LSP是否更具限制性,这似乎都是一件坏事。

因此,在我看来,子类型是否满足抽象消费者的所有合理期望似乎是LSP的一个很好的概括。

但是,在您发布的示例中,通常使用Java接口,尚不清楚Thing接口的使用者是否对它应该是快还是慢有任何合理的期望。如果接口的javadocs包含有关承诺快速进行哪些操作的语言,则可能出于性能方面的考虑而存在问题。但是Java约定无疑是使各种实现具有不同的性能特征。


2
据我所知,示例不是Java
gnat 2013年

0

Bob叔叔回答了一个非常类似的问题,他说违反LSP需要3个参与方:

类型T,子类型S和使用T但被赋予S实例的程序P。

我冒昧猜测,这个问题具有相似的结构,他回答,因为它没有提及的一个P目前正使用的牛逼,什么行为P的期望。

你可以在这里找到他的答案。(您需要向下滚动一些并寻找名为Robert Martin的用户的答案)


1
这如何回答所提问题?
t 2013年

@gnat因为所询问的问题不完整。需要3个方来确定LSP违规。其中,他只提供了两个参加方。
TMc 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.