【问题标题】:How to refactor this code OOP code for an interview?如何为面试重构这段代码 OOP 代码?
【发布时间】:2014-05-10 02:33:46
【问题描述】:

所以我在一次采访中被要求重构这段代码

有一个Shape 抽象类。 SquareRectangleShape 的派生类。 SquareRectangle 覆盖 Shape 的方法 area()。现在我该如何重构这样的代码?

if(object is of type Square) {
    //call area on square
} else if (object is of type Rectangle) {
   //call area of rectangle
} else if(object of type Cube) {
  // call volume of cube
}...
.
.
.

问题基本上是如何避免多个 if 条件,因为可能有很多派生类并在该对象上调用适当的方法?

【问题讨论】:

  • Cube 来自哪里?它与其他类型有什么关系?
  • 你的例子很模糊。
  • Cube 也可以从 Shape 派生。覆盖区域以给出立方体的体积。
  • 那么“体积”是一种不同的方法还是“面积”方法?因为这可能是一个简单的多态案例:只需在传递的任何形状上调用 area(),您不必查看确切的实现。
  • 反对者。请评论您的期望。我会回答以使其更清楚。

标签: oop


【解决方案1】:

啊,现在我明白了 他想听到的可能是您可以添加另一个抽象类,例如 AbstractFlatShapes

然后检查

if (object is instance of AbstractFlatShapes){
//call area
}else{
//call volume
}

说清楚

AbstractFlatShapes 扩展 Shape 我很确定他想听。试想一下,有 15 个扁平形状,而您为每个形状做 else if?调用相同的函数。

【讨论】:

  • 让我等着看是否还有更多答案,因为这有点开放。如果不是,将接受您的答案。
【解决方案2】:

也许使用switch——就像这个来自 PHP 的例子——会是一个很好的答案?

switch (object) {
    case Square:
        // call area on square
        break;
    case Rectangle:
        // call area of rectangle
        break;
    case Cube:
        // call volume of cube
        break;
}

【讨论】:

  • 我以为面试官在期待 Switch 语句中的某些内容,但我不知道该回答什么。我只是回答我不知道,我们转到下一个问题。
  • @user281693 我的建议?面试问题永远不会在你给出的答案中对错,只要你能解释你所提出答案的逻辑,或者——这是关键——你知道如何更深入地质疑这个问题。
  • switch 和 if else 几乎相同。我的意思是,我永远不会重构这样的东西,纯粹是浪费时间
【解决方案3】:

我认为该代码的更大问题是用一种方法处理两种不同的东西:面积和体积。因此,稍后在代码中它必须再次检查对象是 2-d 形状还是 3-d 形状,因为您很可能无法处理相同的面积和体积。每个形状类都应该首先实现获取面积和体积的方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    相关资源
    最近更新 更多