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 / else而不是你需要写一个不同的类和工厂? 看起来很公平吗?
也许这是更多的工作,但从长远来看,它会更好。
每个案件有哪些缺点?
如果这是一个小班,这会是你会做的吗?基本上,我不知道我是否理解这个概念,然后假设我这样做。它的实用性如何。
明智的开发者可能只在需要特定内容时使用它。我不知道任何具体细节。
答案 0 :(得分:5)
关于你的简单例子,有一些事情没有证明多态方法的好处。
在你的情况下,只有一个if语句(在运行中),只有2个人的变体,并且在每种情况下的行为非常相似(它们都只是记录一些文本)。
考虑一个更大的案例,你可以获得更多功能。如果你添加一个attemptToDance,你会引入一个新的if / else块,如果你添加了其他人的变体,你所有的函数都需要在现有函数中使用新的if或case。当您添加更多功能时,您会在许多if / else块中遇到许多情况,并且编译器无法验证您是否错过了if例中的某个人类型
使用单元测试捕获错误很好,但是选择一个使错误无法实现的设计会更好 - 编译器永远不会错过这样的东西,并且你知道编译器运行和工作(你希望单元测试成功运行 - 但你永远不会那么肯定)
如果您有一个抽象基类,定义了所有类型的人都实现的接口,那么编译器会告诉您是否未能为其中一个派生类类实现其中一种方法。
在更大的实际案例中,每种类型的人的每种方法的实现可能并且可能不仅仅是输出不同的文本。如果它们保留在if情况下,所有不同的功能都会在一个地方结束,那么您的代码会同时依赖于许多内容,这会使测试和维护变得更加困难。如果人类的状态使得方法相互作用,这会使事情更加复杂化,并且多态性允许您将该行为包含在类中,而不需要将该类与其他类型的人类关联起来。
在简单的情况下,if / else版本可以工作,但在许多情况下它的扩展效果并不好。
你可能仍然需要在某个工厂方法中使用if / else或switch,但是一个负责构造的开关比许多开关或块更容易维护。
答案 1 :(得分:3)
使用多态而不是if-else语句有利有弊。
AttemptRun
,其中有许多实现方法可能会遇到问题你需要添加另一个类,例如Animal
您还需要重写与Person
类相同的案例。