【发布时间】:2021-05-11 22:50:44
【问题描述】:
refactoring.guru 上显示的“用多态性替换条件”一直困扰着我,我想澄清一下。我在下面的 python 中重新创建了示例:
IF 语句代码
def get_speed(bird):
base_speed = 10
if bird == "AfricanBird":
return base_speed * 2 - 10
elif bird=="EuropeanBird":
return base_speed * 1.85 - 12
elif bird=="NorwegianBlue":
return base_speed * 2.5 - 11
else:
raise ValueError("Bird type invalid")
if __name__=="__main__":
b = "EuropeanBird"
speed = get_speed(b)
print(speed)
用多态替换 IF 语句
from abc import abstractmethod, ABC
class Bird(ABC):
def get_base_speed(self):
return 10
@abstractmethod
def get_speed(self):
pass
class AfricanBird(Bird):
def get_speed(self):
return self.get_base_speed()*2-10
class EuropeanBird(Bird):
def get_speed(self):
return self.get_base_speed()*1.85-12
class NorwegianBlue(Bird):
def get_speed(self):
return self.get_base_speed()*2.5-11
if __name__=="__main__":
# This *still* has to be specified by the user somewhere.
# For example in a GUI or input text file.
b = "EuropeanBird"
# Here is the if statement again!!
if b == "AfricanBird":
b = AfricanBird()
elif b=="EuropeanBird":
b = EuropeanBird()
elif b=="NorwegianBlue":
b = NorwegianBlue()
else:
raise ValueError("Bird type invalid")
print(b.get_speed())
我通过允许您从基类继承并重新定义行为而不是在if 语句中添加新分支来获得多态性增加通用性的部分。但是,归根结底,您仍然需要在主代码中的某处决定要使用基类的 which 实现(我的第二个示例中的第 26 行),这会强制使用 @987654325 @ 语句重新出现。
我错过了重点吗?有什么办法可以彻底消除客户端代码中的条件语句?
【问题讨论】:
-
如果您投票结束,请解释原因。
标签: python oop design-patterns polymorphism conditional-statements