专业面试的意外答案

Unexpected answer on a professional interview

这是一个 100% 的理论问题,可能基于观点。

在一次专业面试中,我得到了一个打印页面,上面有很多写得很糟糕且格式不正确的两个 classes 代码,以便在演讲中逐行分析它们。我们称这些数据结构为 AB。没有关于预期行为的问题陈述或任何信息。

然而他们的一个问题真的让我很生气。

在识别出算法的可疑行为以及许多潜在和实际错误后,他们让我再识别一个错误。我发现了其他几个明显的问题,但我没有弄清楚他们想从我这里得到什么。好吧,当他们告诉我答案时,我大吃一惊。 AB 的简化版本如下(我只留下了属于他们想法的一部分的方法):

template <typename T>
class A
{
public:

    // elements are dynamically allocated on the heap

    const T& getValue(unsigned i) const // I'm not even sure it was const
    {
        // return element at position 'i'
    }

    virtual void setValue(unsigned i, const T &value)
    {
        // sets the element at position 'i'
    }
};

template <typename T>
class B: public A<T>
{
public:

    virtual void setValue(unsigned i, const T &value)
    {
        // set the element at position 'i' using A<T>::setValue()
        // then sort all elements in descending order
    }
};

好吧,解决方案不是编译、运行时或逻辑错误。甚至没有这些的潜在风险。 错误 如下: 因为 B::setValue 在您之后对数据进行排序放置一个元素,您无法测试您在给定位置访问的数据是否与您存储在该给定位置的数据相同。但是使用 A 你可以做到这一点。 AB 之间的这种不匹配行为被认为是错误(他们补充说这不是错误,但确实是错误)。

我认为这完全是一种设计选择(因为 B 的全部意义在于维护已排序的数据)而且我不会说这是一个错误,尤其是在没有问题陈述或任何信息的情况下预期的行为。它甚至没有违反多态性的思想或概念。

你会认为这是一个错误吗?

我们可以确定它是 class A 接口的一部分,更具体地说是 A::getValue 的 post 条件,即 A::getValue必须 return 与 A::setValue 之前(立即)分配给同一索引的相同值。

如果指定了这样的 post 条件,那么违反 post 条件的派生 class 将违反 Liskov Substitution Principle。这将是一个设计错误。


练习中没有说明这种 post 条件是否存在,或者应该存在。没有 post 条件,就没有设计错误(至少不是我正在讨论的错误)。

post 条件(大概由您的面试官假设)是否应该存在取决于层次结构的设计者。在你的采访中是你。 post 条件是否是层次结构的良好设计将取决于 classes 正在建模的内容。如果 A 模型类似于 std::array - 这就是它的相似之处 - 那么 post 条件在我看来绝对是一个很好的设计选择。