【问题标题】:Unexpected answer on a professional interview [closed]专业面试的意外答案[关闭]
【发布时间】:2017-06-01 18:45:16
【问题描述】:

这是一个 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 的全部意义在于维护已排序的数据),我不会说这是一个错误,尤其是没有问题陈述或任何有关预期行为的信息。它甚至不违反多态性的思想或概念。

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

【问题讨论】:

  • 在我看来,setValue 的覆盖导致 B 的语义与 A 的语义有很大不同。由于明确指出了B::setValue 的预期行为,我想说BA 公开继承可能是一个错误。也许它应该私下继承并实现它自己的getter。
  • 可能更适合代码审查?但我有点同意——界面应该对预期的行为是不言自明的。在setValue 内部排序正在推动它...
  • 我会在“我得到一个打印页面,里面有很多写得很糟糕且格式不正确的代码”这一点退出采访。
  • 其实你的面试官想要的答案是首先引起我注意的:如果我有一个容器,我可以在上面调用setValue(index, value),这是最邪恶的东西之一容器可以避免随后产生getValue(index) == value。这意味着从无序容器继承有序容器的设计决策首先是错误的。这是您应该识别的逻辑错误。与此相比,编译器错误等无关紧要。
  • @plasmacel 完全正确。假设有能力,你的面试官会高度评价这种观察。尽管B 可能与A 无关,而不是不存在。

标签: c++ oop polymorphism theory


【解决方案1】:

我们可以确定它是A 类接口的一部分,更具体地说是A::getValue 的后置条件,A::getValue 必须返回与A::setValue 之前(立即)分配的相同值进入同一个索引。

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


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

是否应该存在(可能是面试官假设的)后置条件取决于层次结构的设计者。在你的采访中是你。后置条件是否适合层次结构的设计取决于类的建模内容。如果A 模拟std::array 之类的东西——这就是它的样子——那么在我看来,后置条件绝对是一个不错的设计选择。

【讨论】:

  • 如果一个界面违反了读者的合理期望,甚至没有在适当放置的评论中给出关于危险行为的适当警告,那绝对是一个错误。这是您在代码库中不能容忍的事情,因为它必然会导致进一步的错误。当然,如果是你不能马上清理的遗留代码,可以直接发出“Here be dragons!”这样的说法。符号,但这并不能减少错误的错误。
猜你喜欢
  • 2010-10-16
  • 1970-01-01
  • 2017-05-24
  • 2023-02-22
  • 2011-02-21
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多