多态VS IF与逻辑 [英] Polymorphism vs if and logic

查看:30
本文介绍了多态VS IF与逻辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

class Person { 
  private state ="normal" //cripple

  run() { 
    if (this.state === "normal") { 
      console.log("run")
    } else {
      console.log("hobble")
    }
  }
}


//vs

abstract class AttemptRun { 
  abstract run();
}


class NormalRun extends AttemptRun { 
  run() { 
    console.log("run")
  }
}

class CrippleRun extends AttemptRun { 
  run() { 
    console.log("hobble")
  }
}

class Person { 
  protected runAbility: AttemptRun;

  run() { 
    this.runAbility.run()
  }
}

假设我理解了这里的概念,这是我的问题。 为什么多态性比IF和逻辑更好。

因为在我看来,你还需要一个工厂或者其他的方法来确定人的能力类型。因此,如果逻辑不在这里,它就会在其他地方。

为什么这在我读过的书中经常重复,比如干净的代码。 它被列为代码气味。

我觉得它可以使单元测试更容易一些,因为这样您只需要测试功能,而不需要测试正在使用它的实际其他类。

这就是它所能提供的全部功能。

如果/否则,您是否需要编写不同的类和工厂? 看起来很不公平吗?

可能工作量较大,但从长远来看,会更好。

每个案例的弱点是什么?

如果是小班,你会这么做吗?基本上,我不知道我是否理解了这个概念,然后假设我理解了。它的实用性如何。

聪明的开发人员可能只在他们需要特定的东西时才使用它。我不知道任何细节。

推荐答案

您的简单示例中有几点没有演示多态方法的好处。

在您的案例中,只有一个if语句(在Run中),Person的两个变体,并且每个案例中的行为都非常相似(它们都只是记录一些文本)。

考虑一个更大的情况,其中您拥有更多的功能。如果您添加一个temptToDance,您将引入一个新的if/Else挡路,如果您添加其他变体的Person,则所有函数都需要在现有函数中使用新的if或case。随着您添加更多的功能,您最终会在许多if/Else块中得到许多案例,编译器无法为您验证您没有遗漏其中一个if案例中的Person类型。

用单元测试捕获错误固然很好,但选择一种使错误不可能发生的设计就更好了-编译器从不会错过这样的事情,而且您知道编译器已经运行并正常工作(您希望单元测试运行成功-但您永远不会那么确定)

如果您有一个抽象基类定义了所有类型的Person实现的接口,则编译器将告诉您,如果您未能实现某个派生Person类的方法之一。

在一个更大的实际案例中,每种方法在每种类型的人上的实现可以而且可能会有更大的不同,而不仅仅是输出不同的文本。如果这些都停留在If情况下,所有不同功能最终都集中在一个地方,那么您的代码就会同时依赖于许多东西,这会使测试和维护变得更加困难。如果People类具有方法交互的状态,这会使事情变得更加复杂,并且多态性允许您将该行为包装在一个类中,而无需关注其他类型的Person类。

在简单的情况下,If/Else版本可以工作,只是在许多情况下伸缩性不是很好。

您可能仍需要某个工厂方法中的if/Else或Switch,但只负责构造的一个Switch比许多Switch或if块更容易维护。

这篇关于多态VS IF与逻辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆