clean code之路——函数

函数代码总原则

  • 函数代码长度要短;
  • 一个函数只做一件事;
  • 写函数代码如同给写文章段落,要在合适的地方分段;
  • 写代码如磨论文,休想一次成形,优美的代码需要多次打磨。

函数代码方法论

  1. 函数最好不要超过20行,切函数内代码的缩进不超过两级。
  2. 衡量一个函数是否只做一件事的标准:
    - 是函数体代码实现的功能是否超出了函数名所限定的功能;
    - 函数体代码是否能够分成多个逻辑部分,如果能分,则函数可能做了超过一件事情;
    - 包含switch语句的代码一般处理超过一件事情。
  3. 一个函数完成的功能需在一个抽象层次上,例如get_address和get_addr_state是两个层次,这两个功能不混合写在一个函数中。
  4. 函数参数:
    - 越少越好,一般不超过两个,因为超过两个很难记住函数需要传递的参数及其顺序;
    - 不要使用使用输出参数,既通过实参传递函数处理结果,因为通常的逻辑是通过return返回处理结果,非常直观;
    - 不要使用Flag参数,如boolean is_address_absent,这种情况下一般都可以拆成两个函数,既分别处理两件事情,一个函数处理地址不为空的情况,一个函数处理地址为空的情况;
    - 当一个函数的参数超过三个时,可以将某些参数封装成一个类;
  5. 函数命名:
    - 函数名为动词,参数名为名词,二者连起来组成有意义的表达,如open(‘file_name’);
    - 在函数名中携带参数及其顺序的信息,如set_addr_state_and_street(state, street)。
  6. 函数最好不要返回错误代码,而是用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

猜你喜欢

转载自blog.csdn.net/write_down/article/details/80962630