我使用Python作为我的例子,但我的问题是指一般的编程语言。
def some_function(eggs):
if eggs == 1:
do_something_1()
elif eggs == 2:
do_something_2()
elif eggs == 3:
do_something_3()
else:
do_error()
return
do_something_4()
do_something_5()
do_something_6()
(这只是一个例子。我的函数不会被称为do_something_x
。)
在这样的其他方面回归会是一个糟糕的编程习惯吗?
是否更好do_something_4()
do_something_5()
do_something_6()
每个if / elifs中的?
答案 0 :(得分:11)
我在代码中看到的主要问题是错误情况隐藏在函数体的一半以上。它使代码难以阅读。因为你正在做的是验证函数的参数,你应该先做。
在无效参数的情况下,我的偏好是引发适当的异常,例如ValueError
。如果不知道你的功能是什么,或do_error
做了什么,很难绝对肯定地说这适用于你的情况。但一般来说,获取不正确的参数并不是函数可以恢复的。来电者提出了论点;所以把责任放在调用者身上以从那个错误中恢复。
此外,这里有一个成语,可以用来避免elif
s的长列表:
funs = {1: do_something_1,
2: do_something_2,
3: do_something_3}
funs[eggs]()
答案 1 :(得分:8)
绝对不将相同的代码复制到每个if
子句中。
怎么样:
def some_function(eggs):
options = {1: do_something_1, 2: do_something_2, 3: do_something_3}
if eggs in options:
options[eggs]()
do_something_4()
do_something_5()
do_something_6()
else:
do_error()
return
这不需要很长的if
elif
else
。它也很清楚do_something_4()
等只有当蛋是1,2或3时才会发生。
答案 2 :(得分:3)
怎么样:
def some_function(eggs):
if eggs not in [1,2,3]:
do_error()
return
if eggs == 1:
do_something_1()
elif eggs == 2:
do_something_2()
elif eggs == 3:
do_something_3()
else:
assert False
do_something_4()
do_something_5()
do_something_6()
答案 3 :(得分:2)
您确定do_something_n
与do_something_m
真正相关吗?
如果是这样,请使用do_something(var, n)
并使用相同的代码来处理所有内容(如果所有概念真的相关,对吧?)。
如果没有,请将功能拆分为真正有用且独立的功能。
为什么这(可能)不好的原因:
def print1():
print(1)
def print2():
print(2)
好吧,任何人都应该看到这应该是printn(n)
或类似的东西。
另一个概率:
def action1():
paymanagers()
payworkers()
def action2():
clean_trashbin()
unlock_car()
这些行为可能没有关系,应该属于他们自己的职能。
答案 4 :(得分:1)
您现在正在做的是编程实践并不错,但通过在每个if
语句中放置三个函数调用来复制代码将是不好的做法。
有些人更喜欢在他们的功能上有一个退出点,在这种情况下我会建议这样的事情:
def some_function(eggs):
error_code = 0
if eggs == 1:
do_something_1()
elif eggs == 2:
do_something_2()
elif eggs == 3:
do_something_3()
else:
do_error()
error_code = 1
if error_code == 0:
do_something_4()
do_something_5()
do_something_6()
return # return error_code if it would be helpful to the calling function