函数代码总原则
- 函数代码长度要短;
- 一个函数只做一件事;
- 写函数代码如同给写文章段落,要在合适的地方分段;
- 写代码如磨论文,休想一次成形,优美的代码需要多次打磨。
函数代码方法论
- 函数最好不要超过20行,切函数内代码的缩进不超过两级。
- 衡量一个函数是否只做一件事的标准:
- 是函数体代码实现的功能是否超出了函数名所限定的功能;
- 函数体代码是否能够分成多个逻辑部分,如果能分,则函数可能做了超过一件事情;
- 包含switch语句的代码一般处理超过一件事情。 - 一个函数完成的功能需在一个抽象层次上,例如get_address和get_addr_state是两个层次,这两个功能不混合写在一个函数中。
- 函数参数:
- 越少越好,一般不超过两个,因为超过两个很难记住函数需要传递的参数及其顺序;
- 不要使用使用输出参数,既通过实参传递函数处理结果,因为通常的逻辑是通过return返回处理结果,非常直观;
- 不要使用Flag参数,如boolean is_address_absent,这种情况下一般都可以拆成两个函数,既分别处理两件事情,一个函数处理地址不为空的情况,一个函数处理地址为空的情况;
- 当一个函数的参数超过三个时,可以将某些参数封装成一个类; - 函数命名:
- 函数名为动词,参数名为名词,二者连起来组成有意义的表达,如open(‘file_name’);
- 在函数名中携带参数及其顺序的信息,如set_addr_state_and_street(state, street)。 - 函数最好不要返回错误代码,而是用Exception代替,好处是不用再调用函数时立即处理错误代码,导致代码变负责。例如:
# Error code
if delete_page(page) == E_OK:
if registry.delete_reference(page.name) == EOK:
logger.log('page deleted')
else:
logger.log('delete reference fro registry failed')
else:
logger.log('delete faild')
# Exception
try:
delete_page(page)
registry.delete_reference(page.name)
except Exception e:
logger.log(e.get_msg())
7. 将try和except下的代码块封装为函数,如果一个函数中出现try和except,则该函数只能包含try和except这一代码块,例如
def delete(page):
try:
delete_page_and_all_reference(page)
except Exception e:
log_error(e)
8. 不要在代码中出现重复的代码,可以选择将重复两次及以上的代码封装为函数。
9. 尽量不要在函数中出现多个return语句,不要在循环中出现break或者continue语句。
参考文献:code clean