首先是背景:我使用Python和PyGame。我已经尝试编写自己的输入/控制器模块,允许用户以他们喜欢的任何方式重新映射控件。这必然要求我的代码被编写以处理不同类型的输入(例如,键盘键,控制器按钮和控制器轴/帽子/等)。
例如,如果按钮“Right”被映射到箭头键,则处理GetPush("Right")
或GetRelease("Right")
的代码与将其映射到被推动的控制棒的情况稍有不同某个轴。为了帮助解决这个问题,我创建了一个辅助函数__GetButtonType()
- 正如名称所回复的那样 - 返回它是什么类型的按钮。对于此处显示的代码,按钮称为字符串。字符串的第一个字母表示按钮类型,其余表示按钮。例如,k97
指的是值为97
的键盘键。 (A键。)
现在问题就在眼前。我的代码完成了我想要它做的事情。但是当我开始清理它时,我遇到了困扰我的一部分。我有以下代码段来处理来自键盘的按下。 (DoSomething()
函数替换完全不相关的代码,我认为对于手头的问题并不重要。)
for n in TheController.ControlMap:
if __GetButtonType(n)=="key":
if event.type == KEYUP:
if event.key == int(n[1:]): DoSomething()
if event.type == KEYDOWN:
if event.key == int(n[1:]): DoSomethingElse()
关于这一点看起来对我来说有点不对劲。可能是重复if event.key == int(n[1:])
条件。这似乎很浪费。但是,如果event.key
不是KEYUP
或KEYDOWN
,那么该事件将没有关键属性(这就是pyGame的工作原理,这不是我的设计。)这意味着只要if (event.type == KEYDOWN and event.key == int(n[1:])
是其他内容,条件event.type
就会抛出错误。
然而,我想了一下,并意识到我可以通过以下方式构建它来将代码缩短一行:
for n in TheController.ControlMap:
if event.type == KEYUP:
if __GetButtonType(n)=="key" and event.key == int(n[1:]): DoSomething()
if event.type == KEYDOWN:
if __GetButtonType(n)=="key" and event.key == int(n[1:]): DoSomethingElse()
两个代码段均有效。两者都做同样的事情。第一个看起来更容易阅读,但不是很多。第二个使用较少的行。我的问题是:
哪种风格“更好”?一个人的表现是否比另一个人的表现要快不可忽略的数量?或者只是被认为是“糟糕的做法?”事实上,也许他们俩都是。我对编程还是比较新的。
谢谢,
答案 0 :(得分:3)
你的两个陈述都有一个相同的功能,会让人感到畏缩。等效if
语句重复两次。这不是好事,因为它会破坏您的代码,绝对没有必要:
if event.type in [KEYUP, KEYDOWN] and __GetButtonType(n)=="key" and event.key == int(n[1:]):
if event.type == KEYUP:
DoSomething()
elif event.type == KEYDOWN:
DoSomethingElse()
此处第一个条件确保您不会在event.key
上收到错误。
同样使用elif
因为选项是互斥的。简单的else
也足够了,但为了便于阅读,我会离开elif
。您也可以将其隐藏到DoSomething(event.type)
。
根据你问的对象,另一个看起来很难看或漂亮的选择是把它全部折成一个平面if-else:
if event.type in [KEYUP, KEYDOWN] and __GetButtonType(n)=="key" and event.key == int(n[1:]):
(DoSomething if event.type == KEYUP else DoSomethingElse)()
但这有点奇怪......但仍然有效。
在性能方面,这里绝对没有什么值得担心的。优化是一个完整的其他主题,优化的第一件事是程序设计/算法,而不是本地低重要性命令。
答案 1 :(得分:1)
关于什么' sashkello'提到,我通常在我的pygame程序中有以下代码块。
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT :
do_something()
elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
do_something_else()